PYG官方论坛 发表于 2019-5-18 01:19:59

使用 Baymax 工具固定函数的返回值

本帖最后由 PYG官方论坛 于 2019-5-18 01:30 编辑

首先说一下这个程序的验证模式,在N多个线程中,N多个模块中去调用某DLL的函数来进行验证,若函数返回值不为0,则认为验证失败!

如果设置INT3断点,由于太多线程同时验证,将导致设置修改函数返回值失败(该方案不适合修改多线程频繁调用的函数返回值,在baymax的实现里,INT3断点是全局性的,多线程会打架,硬件断点是针对线程的,如果每个线程都给与设置,则所以不会有问题)。

于是,我想了一个新方案,可以搞定这个函数返回,但是这个方案可以只针对某个系统:

1. 首先HOOK你要返回的函数(这样就可以保证所有线程都被设置上硬件断点),


02. 然后再函数+5的位置设置断点,(因为HOOK后会执行到+5的地址)


03. 修改函数返回值,其中堆栈返回值偏移+4。(栈返回偏移需根据上方指令是否对堆栈进行调整来判定)



这样就解决不需要去寻找各个模块,各个线程都需要调用的API来间接对所有验证线程设置硬件断点,同事也无需关注各验证点返回地址在哪里,因为每个线程都可以设置4个硬件断点,绝对够用。
因为baymax现在还没有提供一个真正的HOOK函数来修改参数或返回值的功能,只是利用断点模拟了改功能,所以以上方案再真正HOOK功能出现之前,算是一种折中替代方案。


PYG官方论坛 发表于 2019-5-18 01:29:29

本帖最后由 PYG官方论坛 于 2019-5-18 01:32 编辑

再提供一个hook方案,验证模块签名的时候用的是遍历文件,调用了FindFirstFileA,HOOK这个API然后设置硬件断点修改返回值就OK了。

andydau 发表于 2019-5-18 07:18:30

02. 然后再函数+5的位置设置断点,(因为HOOK后会执行到+5的地址) //这里没看懂,为什么hook会执行到+5的地址?

PYG官方论坛 发表于 2019-5-18 09:33:13

hook 会把前5个字节修改为jmp xxxx 在hook中对该线程设置硬断 所以要在hook地址之后设置硬断就会生效 这里补丁后OD附加一下就明白了

不破不立 发表于 2019-5-18 09:34:41

本帖最后由 不破不立 于 2019-5-18 09:43 编辑

收藏,学习了,HOOK你要返回的函数(这样就可以保证所有线程都被设置上硬件断点),很骚的方法

雷破天 发表于 2019-5-18 17:01:46

感谢分享。。。

hxhsy 发表于 2019-5-18 23:23:34

收藏,学习了

feiche 发表于 2019-5-19 08:54:49

感谢校长的帮助,已经收藏学习了,成功搞定那个软件了{:lol:},

panpan8848 发表于 2019-5-19 09:20:08

学习学习,感谢

xie83544109 发表于 2019-5-19 17:16:40

{:loveliness:}
请问楼主会HOOK 64位系统的DLL吗
页: [1] 2 3
查看完整版本: 使用 Baymax 工具固定函数的返回值