妙用mov edi,edi和5个nop实现inline hook

本文介绍了通过修改 API 的 movedi, edi 指令和前五个 nop 指令来实现 inlinehook 的方法。通过将 movedi, edi 改为短跳转指令,将五个 nop 替换为远跳转指令,可以在不保存/恢复前五个字节的情况下实现 hook,简化了传统 inlinehook 的操作。

妙用mov edi,edi和5个nop实现inline hook

2008年2月22日 | 分类: 其它技术 | 标签: inline hook, nop

这方法MJ很早时就说过了,简单重复下。
大家应该发现大部分API的第一条指令都是mov edi,edi,比如在我的电脑上MessageBoxA的代码如下:

77D5058A >    8BFF           mov     edi, edi
77D5058C  /.  55             push    ebp
77D5058D  |.  8BEC           mov     ebp, esp
77D5058F  |.  833D BC04D777 >cmp     dword ptr [77D704BC], 0
77D50596  |.  74 24          je      short 77D505BC
77D50598  |.  64:A1 18000000 mov     eax, dword ptr fs:[18]

mov edi,edi完全没起任何作用,貌似一条垃圾指令。不过大家是否还发现除了mov edi,edi外,大部分API前面刚好还有5个nop,如下:

77D50585      90             nop
77D50586      90             nop
77D50587      90             nop
77D50588      90             nop
77D50589      90             nop
77D5058A >    8BFF           mov     edi, edi
77D5058C  /.  55             push    ebp
77D5058D  |.  8BEC           mov     ebp, esp
77D5058F  |.  833D BC04D777 >cmp     dword ptr [77D704BC], 0
77D50596  |.  74 24          je      short 77D505BC
77D50598  |.  64:A1 18000000 mov     eax, dword ptr fs:[18]

5个nop不是刚好可以改成一个远jmp吗,而mov edi,edi这条“垃圾”指令刚好可以改成一个短jmp,这样新型的inline hook就出世了,呵呵,我们只要把mov edi,edi改为往回跳5个字节,而把5个nop改成jmp到自己的代码就行了,如下:

77D50585    - E9 XXXXXXXX    jmp     XXXXXXXX
77D5058A >  ^ EB F9          jmp     short 77D50585
77D5058C  /.  55             push    ebp
77D5058D  |.  8BEC           mov     ebp, esp
77D5058F  |.  833D BC04D777 >cmp     dword ptr [77D704BC], 0
77D50596  |.  74 24          je      short 77D505BC
77D50598  |.  64:A1 18000000 mov     eax, dword ptr fs:[18]

当需要调用原函数时只需jmp到原函数地址+2就行了,这样就不用像以前那样需要保存/恢复前5个字节,真是妙啊!Microsoft故意这样设计还真让某些人捡了便宜。不过这种方法并不能通用,有些API并没有mov edi,edi和5个nop,而且XP SP2之前的系统貌似也不是这样的。

精易模块V8.0.0 what's new:(20200101) 一、新增 1、新增“类_InlineHook”,让易语言的控件支持Unicode;感谢【@1185384801 】提供; 2、新增“地址_取API地址”,返回动态库函数入口地址;感谢【@1185384801 】提供; 3、新增“剪辑板_置字节集”,设置指定宽字符到系统剪辑板; 4、新增“网页_参数Ascii排序”,对传入的请求参数按参数名的字典序(Ascii码)排序;感谢【@pwd 】提供; 5、新增“类_系统音量 - 获取音量”,返回-1表示获取音量失败,返回0-100表示成功;感谢【@V雪落有声V 】提供; 6、新增“类_系统音量 - 设置音量”,返回0表示成功,返回非零为错误代码;感谢【@V雪落有声V 】提供; 7、新增“线程_启动_文本型”,成功返回线程句柄,失败返回0;只允许传入文本或字节集,堆指针;感谢【@福仔 】提供; 8、新增“线程_启动_4字节”,成功返回线程句柄,失败返回0;只允许传入整数型、短整数型、字节型、逻辑型、子程序指针、小数型,所有参数必须是4字节;感谢【@福仔 】提供; 9、新增“线程_启动_8字节”,成功返回线程句柄,失败返回0;只允许传入双精度小数型、日期时间型、长整数型,所有参数必须是8字节;感谢【@福仔 】提供; 10、新增“调用子程序_数组”,调用指定的子程序地址并取回被调用子程序的返回值,支持参数数组;感谢【@福仔 】提供; 二、修复 1、修复“编码_Unicode到Utf8”,去掉以0结尾的问题,需要以0结尾的请自行修改; 2、修复“WINDOWINFO”中类型定义错误的问题;感谢【@风语如歌 】反馈问题; 3、修复“类_json - 置属性”,元字符转义的问题;感谢【@625792629 】反馈问题; 三、优化 1、优化“进程_取同名ID”,执行前增加清除数组的命令;感谢【@yui1200 】反馈问题; 2、优化“文本_取随机字符”,可根据指定模式取出随机字符;感谢【@福仔 】提供; 四、移除 1、移除“文本_是否为UTF8”、“汇编左移”; 2、移除“类_json - 赋值”、“类_json - 置类型”、“类_json - 删属性_JS”;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值