• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

c语言 函数钩取的可行性

开发技术 开发技术 2周前 (04-07) 6次浏览

我一直觉得很奇怪,为什么仅仅是把API的前五个字节改成JMP指令就可以转到另外一个函数执行,难道另外一个函数的活动不会改变寄存器与栈从而影响程序的运行吗?

现在终于有了答案,编译器在编译函数时会自动帮我们保存和还原寄存器和栈 ,并且c语言的调用函数方式不会清理参数。这样就不会改变程序的运行状态。

 

详细说明:

    使用代码:https://www.cnblogs.com/czlnb/p/14619543.html

    程序:https://pan.baidu.com/s/1VfKnI_gXw68W1145aOiprQ    密码:ndwm

首先我们找到Main函数

     c语言 函数钩取的可行性

 

 然后我们再进入loadLibaryA()

c语言 函数钩取的可行性

 

 可以看到第一句代码已经被修改成跳转语句(LoadLibaryA已被钩取完成,钩取过程看c语言代码),我们跟随跳转语句

c语言 函数钩取的可行性

 

 myload是我自定义的函数,它的参数和返回值和loadLibaryA是一样的。继续跳转

c语言 函数钩取的可行性

 

 

 

 

 这就是myload函数的汇编代码,可以看到①三个push是把要用到的寄存器保存到栈中

                    ②是记录扩充的多少栈,为了便于还原

                    ③还原寄存器

                    ④还原栈 

 这样就是为什么仅仅在函数头部改成jmp指令就可以偷天换日,感谢编译器帮我们擦好了屁股。


程序员灯塔
转载请注明原文链接:c语言 函数钩取的可行性
喜欢 (0)