2019独角兽企业重金招聘Python工程师标准>>>

函数hook,简单地说就是把目标函数替换我们的函数,用比较技术的语言描述就是:

(1) Target函数:要拦截的函数,通常为Windows的API。

(2) Trampoline函数:Target函数的复制品。因为Detours将会改写Target函数,所以先把Target函数复制保存好,一方面仍然保存Target函数的过程调用语义,另一方面便于以后的恢复。

(3) Detour函数:用来替代Target函数的函数(往往是我们自己写的函数)。

一 般进行函数hook的原理是在Target函数的开头加入JMP Address_of_ Detour_Function指令(共5个字节)把对Target函数的调用引导到自己的Detour函数, 把Target函数的开头的5个字节加上 JMP Address_of_Target _ Function + 5作为Trampoline函数地址。

其实关于函数hook方法的资料已经汗牛充栋,而且微软也早就推出了官方的库来辅助这一过程,无需我再赘述,我在这里只想谈下面一个话题:如何写好Detour函数,这是我们总结了前人和自身实践经验得出的。

进 行过函数hook实践的同学是否有过这种经历,注入我们的代码或dll,对目标函数进行hook后,执行到我们的函数或者执行过我们的函数后,程序会出错 或崩溃(甚至蓝屏)。这是正常的,编写detour函数和普通的编程很不一样,它就像深入敌后的间谍,要考虑很多细节,稍不注意会破坏Context,影 响目标进程的正常运行。那么要注意什么呢?

1.       自己定义的detour函数和目标target函数的参数很返回值完全一致

因 为没有代码,所以对于目标函数的参数和返回值的确定是需要逆向分析的,在有pdb的情况下很嗨,直接IDA等工具能帮你准确确定。没有pdb的情况下需要 通过参数所占内存大小、特征甚至动态调试去确定,这里想强调一点是指针类型、数值类型、和引用类型的区分很关键且容易出错。另外有一种可怕的经验是返回值 是一个结构,没经验无从讲起,但愿不要遇到这种情况。

2.       函数调用方式的确定与选择

我 假设大家都知道了常见的cdecl和stdcall还有fastcall三种调用方式的异同,通常情况下碰到的函数调用都是cdecl和stdcall方 式。他们最大的区别是前者是函数调用者负责栈平衡,后者是函数内负责栈平衡。我们编写detour函数时最好明确声明函数调用方式,原则是和target 函数声明方式保持一致。Tips:就hook这种特殊情形,一般用stdcall更方便,因为我们的控制范围是函数内部,要向控制函数调用上下文要绕写弯 路,而stdcall是在函数内部控制栈平衡的,so,under control!

3.       现场保护

在 编写detour函数时要时刻有一个观念就是这段代码的正确运行是以不破坏当前进程正常运行为前提的,但一个问题是我们往往不知道进程需要用到哪些现场, 所以就是通过pushad-popad对寄存器进行完整保护。但应该在什么情况下使用pushad和popad呢?这个需要视具体情况而定,但有一个原则 是:在开始执行自己的指令前pushad,在执行原生代码前popad,这个原则不是很准确,只是想表示:不要让自己的指令执行破坏原来的 context。

4.       This:“勿忘我!”

对于hook一般的系统函 数,在detour函数中可以直接调用Trampoline函数,但在hook一些类成员函数后,不能直接调用Trampoline函数,因为进程确定对 象成员函数需要以该对象this指针为入口进行索骥。所以hook了类成员函数,又要在detour函数中调用Trampoline函数,需要在调用前将 对象的地址(this指针的内容)存入ecx中。

就我目前的经验和水平只能总结这些,其实上述的123点背后都有一个共同的背 后灵就是“栈平衡”,函数调用的最基本规则就是要在函数调用前和函数调用结束后保证sp指在同一个地方,所以你如果碰到hook崩溃的情况,第一步想到的 调试方法就是对比查看函数执行前后的栈的情况然后就是比较寄存器的异同。

编译:函数hook注意事项

地址:http://www.07net01.com/program/34290.html

转载于:https://my.oschina.net/zhuzihasablog/blog/97380

函数hook注意事项相关推荐

  1. 【C 语言】文件操作 ( 读取文件中的结构体数组 | feof 函数使用注意事项 )

    文章目录 一.读取文件中的结构体数组 | feof 函数使用注意事项 二.代码示例 一.读取文件中的结构体数组 | feof 函数使用注意事项 读取文件结构体时 , 可以循环读取文件中的数据 , 只使 ...

  2. MIN()与MAX()函数 的注意事项

    MIN()与MAX()函数 的注意事项 定义: MIN()函数用于返回一个列范围内的最小非空值:MAX()函数用于返回最大值.这两个函数可以用于大多数的数据类型,返回的值根据对不同数据类型的排  序规 ...

  3. Inline函数使用注意事项

    Inline函数使用注意事项 1.在一个文件中定义的inline函数不能再另一个文件中使用 2.inline函数应简洁,只有少数几个语句. 3.在inline函数中不能有循环,if,switch语句. ...

  4. 箭头 运算符_论普通函数和箭头函数的区别以及箭头函数的注意事项和不适用场景...

    论普通函数和箭头函数的区别以及箭头函数的注意事项和不适用场景 箭头函数是ES6的API,相信很多人都知道,因为其语法上相对于普通函数更简洁,深受大家的喜爱.就是这种我们日常开发中一直在使用的API,大 ...

  5. inline函数的注意事项有哪些?

    inline函数由inline关键字定义,引入inline函数的主要原因是用它替代C中复杂易错不易维护的宏函数. inline函数的注意事项有哪些? 在使用内联函数时,要注意以下几个事项和建议: 1. ...

  6. Android的so注入( inject)和函数Hook(基于got表) - 支持arm和x86

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53942648 前面深入学习了古河的Libinject注入Android进程,下面来 ...

  7. Python蹒跚学步1:常用函数 和 注意事项

    Python蹒跚学步1:常用函数 和 注意事项 常用函数: 获取Python当前的工作目录 >>> import os >>> os.getcwd() 'D:\\W ...

  8. python3.6中round函数_Python中round函数使用注意事项

    原标题:Python中round函数使用注意事项 使用round函数的时候发现了一个奇怪的现象.一直觉得round函数是一个用于四舍五入的函数,结果却不一定.一般如果觉得奇怪,那就是没弄懂其本质的运作 ...

  9. 详解箭头函数和普通函数的区别以及箭头函数的注意事项、不适用场景

    箭头函数是ES6的API,相信很多人都知道,因为其语法上相对于普通函数更简洁,深受大家的喜爱.就是这种我们日常开发中一直在使用的API,大部分同学却对它的了解程度还是不够深... 普通函数和箭头函数的 ...

最新文章

  1. C++学习笔记(四)----关于参数传递(1)
  2. 区块链培训资料(特别是以太坊)
  3. linq to object 、linq to sql 、linq to entity 批量 新增、更新、删除功能扩展
  4. 二阶振荡衰减 matlab,基于Matlab/Simulink的二阶控制系统仿真研究
  5. linux上很方便的上传下载文件工具rz和sz
  6. MySQL 亿级数据需求的优化思路(二),100亿数据,1万字段属性的秒级检索
  7. 锤子/诺基亚/努比亚手机不合格!上海市场监管局公布抽检不合格手机名单......
  8. 网关串口+EM310
  9. 计算机桌面去方格子,win7桌面office图标变成白色方格图标的原因和解法
  10. 如何去掉图片上的logo
  11. Windows禁止某个软件联网保姆级教程
  12. 复现ICCV 2017经典论文—PyraNet
  13. 【不知出处】危险的迷宫 网络流 费用流
  14. 【[中文直播] 第21期 | UE4数据驱动开发 | Epic 大钊】课程笔记
  15. Oracle 轻量级实时监控工具 oratop
  16. 品牌策划中该如何在“细节之处”刺激受众痛点?
  17. 智能家居 打造一间乐享智能生活的“聪明屋”
  18. HQChart使用教程11-如何把K线数据API替换成自己的API数据
  19. 超分辨率数据集的下载
  20. BJFU 1399 警察抓小偷

热门文章

  1. php_curl.dll libssh2.dll 始终无法加载的原因 及解决办法
  2. 《构建之法》第8,9,10章
  3. openLayer加载KML,画出省及省下的边界区域,并设置样式、各种标注及提示信息
  4. 诗与远方:无题(六)
  5. vue导出Excel(一)
  6. python des加密文件_Python DES加密解密方法 pyDes库 兼容中文
  7. php处理ubb代码,过滤UBB代码的php类
  8. admin后台菜单栏的实现
  9. Kubernetes 版本锁定到1.12.3
  10. Java定时器Timer学习之一