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 提供的思路。
页: 1 2 [3]
查看完整版本: Dll初始化的时候可以被劫持和修改么?