使用 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:32 编辑
再提供一个hook方案,验证模块签名的时候用的是遍历文件,调用了FindFirstFileA,HOOK这个API然后设置硬件断点修改返回值就OK了。
02. 然后再函数+5的位置设置断点,(因为HOOK后会执行到+5的地址) //这里没看懂,为什么hook会执行到+5的地址? hook 会把前5个字节修改为jmp xxxx 在hook中对该线程设置硬断 所以要在hook地址之后设置硬断就会生效 这里补丁后OD附加一下就明白了 本帖最后由 不破不立 于 2019-5-18 09:43 编辑
收藏,学习了,HOOK你要返回的函数(这样就可以保证所有线程都被设置上硬件断点),很骚的方法 感谢分享。。。 收藏,学习了 感谢校长的帮助,已经收藏学习了,成功搞定那个软件了{:lol:}, 学习学习,感谢 {:loveliness:}
请问楼主会HOOK 64位系统的DLL吗