API挂接具体的操作方法:1)找到你想挂接的函数在内存中的地址(比如说Kernel32.dll中的ExitProcess)。2)将该函数的头几个字节保存在你自己的内存中。3)用一个JUMPCPU指令改写该函数的头几个字节,该指令会转移到你的替换函数的内存地址。当然,你的替换函数的标记必须与你挂接的函数的标记完全相同,即所有的参数必须一样,返回值必须一样,调用规则必须一样。4)现在,当一个线程调用已经挂接的函数时,JUMP指令实际上将转移到你的替换函数。这时,你就能够执行任何代码。5)取消函数的挂接状态,方法是取出(第二步)保存的字节,将它们放回挂接函数的开头。6)调用挂接的函数(它已不再被挂接),该函数将执行其通常的处理操作。7)当原始函数返回时,再次执行第二和第三步,这样你的替换函数就可以被调用。在执行到第4步后,进入第5步时,为什么要"5)取消函数的挂接状态,方法是取出(第二步)保存的字节,将它们放回挂接函数的开头"???第1-2步已经将原始函数地址保存起来,这时可以用来调用啊,为什么要5.6.7步???
解决方案 »
- error C2660: 'Create' : function does not take 5 parameters
- 关于文件列表的问题
- 关于使用OpenGL技术画实时采集曲线的问题?
- 急:分不够可加。为什么在主线程中访问CAD的COM正常,在自建线程中却不行了?
- 对话框工具条的问题,各位高手请教问题????????急用啊
- 头疼的编译错误:(,望各位指教!
- stream, storage没有理解透,请大家指教。结帖贵在神速
- 为什么我的可用分不增加
- 如何根据ip得到局域网中的netbios名称?
- 送分题目
- 关于串口打开顺序问题
- ????关于在CMainFrame的消息处理函数里改变View中的文本颜色
bbb
ccc
你移动了以后截断了他的代码
变成
jmp 你的地址
b(前5个字节给你改掉了)
ccc
这就造成了这个api的代码分成了两段
在外面的是
aaa
bb
而他不能运行
因此如果你还想运行这个api
你就必须把代码恢复回来才能执行当然其实你完全可以不管api直接给被你hook的程序返回你想要的值比如你hook住了某个api函数,你只想返回1,
那你就不用恢复原函数,只要
mov eax,1
ret
这样就ok了
bbb
ccc
你移动了以后截断了他的代码
变成
jmp 你的地址
b(前5个字节给你改掉了)
ccc
这就造成了这个api的代码分成了两段
在外面的是
aaa
bb
而他不能运行
因此如果你还想运行这个api
你就必须把代码恢复回来才能执行当然其实你完全可以不管api直接给被你hook的程序返回你想要的值比如你hook住了某个api函数,你只想返回1,
那你就不用恢复原函数,只要
mov eax,1
ret
这样就ok了