首页 > 编程语言 > 详细

c语言 函数钩取的可行性

时间:2021-04-07 15:01:19      阅读:27      评论:0      收藏:0      [点我收藏+]

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

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

 

详细说明:

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

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

首先我们找到Main函数

     技术分享图片

 

 然后我们再进入loadLibaryA()

技术分享图片

 

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

技术分享图片

 

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

技术分享图片

 

 

 

 

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

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

                    ③还原寄存器

                    ④还原栈 

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

c语言 函数钩取的可行性

原文:https://www.cnblogs.com/czlnb/p/14627118.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!