DavidLiu
发表于 2024-6-30 13:39
lies 发表于 2024-6-30 01:45
其实可以 Hook ntdll.LdrpCallInitRoutine ,这时 DLL 已经载入,但尚未执行 DLLMain
只是 ntdll.LdrpCallI ...
感谢老师的指点,我查阅一下相关知识,HOOK这个函数来试一试
DavidLiu
发表于 2024-6-30 13:39
E少 发表于 2024-6-30 10:30
https://share.weiyun.com/WBnpi5Tq 拿去吧 直接用植物大战僵尸游戏来演示的注入DLL如何HOOK并修改 HOOK源 ...
感谢E少大哥,先顶后看,我试一试
居然要中文
发表于 2024-6-30 13:49
学到了新知识,感谢大佬
lies
发表于 2024-6-30 22:34
DavidLiu 发表于 2024-6-30 13:39
感谢老师的指点,我查阅一下相关知识,HOOK这个函数来试一试
Visual Leak Detector 源码里面有现成的 LdrpCallInitRoutine Hook 代码可以参考,详见:
https://www.cnblogs.com/young520/p/17389224.html
boot
发表于 2024-7-2 01:18
DavidLiu 发表于 2024-6-30 13:37
Boot老师中午好,您的办法我试了,先说结论,不太行。
我是按您说的HOOK了NTdll---zwcreatefile(),程 ...
如果常规Hook的难度是一颗星,那么Hook未导出函数的难度评两颗星。
不过也能实现:{:5_121:}
下载:https://versteckt.lanzn.com/i76Oy239uv1c
密码:是你的企,鹅,开头前4位
这种方法等效于Hook DllMain:
1. 仅适用于无壳状态下的“无限金币.dll”。
2. 若“无限金币.dll”带有vmp 3.84的壳:虽Hook有效,但此时dll处于已加载,目标地址尚未解码的状态,内存领空均为00,常规写内存会被壳解码后还原/覆盖,意味着破解失败。这种情况仍可以通过veh解决。
我编译的dll已解决第1种情况,过几天有空把第2种情况的解决方案完善......
DavidLiu
发表于 2024-7-2 12:23
boot 发表于 2024-7-2 01:18
如果常规Hook的难度是一颗星,那么Hook未导出函数的难度评两颗星。
不过也能实现:
再次感谢Boot老师的指点,这两天在加班了,我去查查关键词veh把代码写出来
DavidLiu
发表于 2024-7-2 12:30
E少 发表于 2024-6-30 10:30
https://share.weiyun.com/WBnpi5Tq 拿去吧 直接用植物大战僵尸游戏来演示的注入DLL如何HOOK并修改 HOOK源 ...
感谢E少大佬的教程,我大概能看明白您的思路,是在LoadLibraryA之后找到合适的API,在此期间写入我们的HOOK代码。
但是这里可能有一个线程安全问题,就是DllMain此时也是处于初始化的过程中,感觉就是比“快”————是我们HOOK的快,还是DllMain运行的快
忙完我都会根据不同思路来写代码,看看哪种方式更加实用。再此感谢E少老师
boot
发表于 2024-7-2 12:48
DavidLiu 发表于 2024-7-2 12:23
再次感谢Boot老师的指点,这两天在加班了,我去查查关键词veh把代码写出来 ...
我编译的winspool.drv,对LdrpCallInitRoutine进行了Hook。由于LdrpCallInitRoutine是未导出函数,所以无法用GetProcAddress和LoadLibrary获取函数头地址。要判断一个函数是否已导出,很简单。x32Dbg中ctrl+g输入该函数名,例如LdrpCallInitRoutine,如果存在,则已导出。如果搜不到,则有可能是未导出的。
解决方法是通过特征码匹配到LdrpCallInitRoutine地址,由于每台电脑上匹配到的地址均不同,具体patch处需要用内核工具扫描查看,并计算patch的字节大小,之后在函数中段做内联Hook,这种方法也可以Hook64位的LdrpCallInitRoutine。
参考了@lies 提供的思路。