c语言 函数钩取的可行性
我一直觉得很奇怪,为什么仅仅是把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指令就可以偷天换日,感谢编译器帮我们擦好了屁股。