网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
用户层下拦截系统api的原理与实现
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式
bsp;  10,
                                          NULL))
pfnMessageBox(NULL, pRP->szModuleName1, pRP->szModuleName2,   MB_ICONINformATION | MB_OK);
其中这些函数指针的定义和上面的类似。
而参数中的szoldcode则是在源程序中在修改api之前保存好,然后传给拦截函数,在源程序中是用ReadProcessMemory函数来获取他的前10个字节的:
ReadProcessMemory(GetCurrentProcess(),
                                (LPCVOID)RParam.dwCreateFile,
                                oldcode,
                                10,
                                &dwPid)
strcat((char*)RParam.szOldCode, (char*)oldcode);


接下来如果你还继续保持对该api的拦截,则又该用WriteProcessMemory 来修改入口了,跟前面的恢复入口是一样的,只不过把szOldCode换成了szNewCode了而已。这样你又能对CreateFile继续拦截了。

好了,接下来该进行堆栈的清理了,也许你还要做点其他事情,尽管做去。但是清理堆栈是必须要做的,在函数结束的时候,因为在我们放任api恢复执行之后,他又return 到我们的函数中来了,这个时候的堆栈是什么样子呢?
|EDI|   <---ESP
|ESI|
|EBX|
|局部变量|  
|EBP|     <---EBP
|api入口之后的第11个字节的指令的地址|    
|00010000|
|createfile执行后的下一条指令地址|
|参数1|
|参数2|
|参数3|
|参数4|
|参数5|
|参数6|
|参数7|
|..|

我们的目标是把返回值记录下来放到EAX寄存器中去,把返回地址记录下来,同时把堆栈恢复成原来的样子。
首先我们恢复那些寄存器的值,接着释放局部变量,可以用mov esp, ebp.因为我们不清楚具体的局部变量分配了多少空间。所以使用这个方法。


__asm
{POP EDI
POP ESI
POP EBX   //恢复那些寄存器
MOV EDX, [NextIpAddr]//把返回地址放到EDX中,因为待会儿                   //EBX被恢复后,线程中的所有局部变量就不能正常使用了。
        
MOV EAX, [Retvalue]//返回值放到EAX中,当然也可以修改这个返回值
MOV ESP, EBP//清理局部变量
POP EBP//恢复EBP的值
ADD ESP, 28H   //清理参数和返回地址,注意一共(7+1+1+1)*4
PUSH EDX //把返回地址压栈,这样栈中就只有这一个返回地址了,返回之后栈           //就空了
RET
}

这样,一切就完成了,堆栈恢复了应该有的

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号