-
-
[求助]关于系统回调 PsSetLoadImageNotifyRoutine 的时机问题。
-
发表于:
2013-1-15 17:08
14182
-
[求助]关于系统回调 PsSetLoadImageNotifyRoutine 的时机问题。
2013.01.16 1:05
有点崩溃了,我后来把新的输入表放在了前0x1000的位置,然后做了个测试。
在驱动中更改输入表地址指向新的地址。然后同时在内存中清空程序的老输入表和我新输入表的前几个字节。程序居然还可以正常运行。已经重启过电脑来试了。
我碰到的新问题是,改了输入表后,发现程序还是不加载我的DLL。再纠结两天,实在不行用ShellCode了。
还有,为什么有的内存内容更改后,再次运行同一个程序,内存地址的内容还是原来的呢?要重启才可以还原。
===================================================================
下面的问题实际上已经明白一些了,具体请看我的Blog
http://www.cnblogs.com/emissary/archive/2013/01/17/2864581.html
最近用 PsSetLoadImageNotifyRoutine 来做IAT的DLL注入。
基本思路前期想通了,但在代码实现后碰到这个问题。麻烦大大们帮忙看看。感谢。
我的想法是这样的,在NT驱动注册回调,当有新的模块加载的时候,我判断当前进程是不是我的进程,如果是.exe后缀,也就是主进程加载,那么我就修改主进程文件在内存中的PE结构(我打算用原导入表再加上一个新的IMAGE_IMPORT_DESCRIPTOR结构(DLL)和IMAGE_THUNK_DATA(函数)到空闲地址空间,然后更改原PE头中导入表的RAV来指向我的新地址,来确保加载我的DLL。),如果是DLL模块加载,那么我就什么也不做,退出回调函数。
可当我这样实现之后,我发现并不是我想的这样。
我双机Windbg调试后发现,当主进程模块回调时,切换到进程上下文,用dd 显示镜像基址,能看到内存中的DOS头部(验证了地址空间和数据都一致,正确的),但我用dd 显示代码段或数据段的RAV时(如dd 00401000),发现Windbg提示全是????号。也就是说,这个时候,代码节数据节(.text,.data)等还没有从物理文件映射到计算机内存,我仅仅只发现DOS头部和PE头部这些,也就是只看到前0x1000的RAV,有的程序是前0x2000。后面的就是无效内存了。
然后,进程一共加载10几个DLL模块,当我断下第七八个(第几个记不得)回调时,再看内存,这些代码段数据段的数据在内存中又有了。我在想,一开始只有前面DOS头和PE头,系统怎么知道一步步加载DLL呢?DLL名和函数名可都在数据段啊。是不是系统直接读取物理文件进行加载输入表的DLL的?
当加载到第N个DLL时,我想,我修改IAT的时机应该是过去了。因为系统已经开始加载了。或者说,修改还有用的话,那工作量可能又大了。
所以,想问各位大大,是不是我的方法不对,或者说,关于PsSetLoadImageNotifyRoutine,有没有可以分享的一些经验啊?看DDK的帮助文档,真的没有价值。谢谢了。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!