首页
社区
课程
招聘
[求助]关于系统回调 PsSetLoadImageNotifyRoutine 的时机问题。
发表于: 2013-1-15 17:08 14182

[求助]关于系统回调 PsSetLoadImageNotifyRoutine 的时机问题。

2013-1-15 17:08
14182
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的帮助文档,真的没有价值。谢谢了。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
2
在exe申请空间,写入shellcode,然后改写oep~~
2013-1-15 20:13
0
雪    币: 204
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
是的,这样也可以。
不过技术路线就不一样了。

一个是IAT的DLL注入
你说的,可以实现无DLL,直接内存加载Shellcode或内存加载DLL
2013-1-15 21:29
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
4
话说,你可以再shellcode里面执行loadlibrary~~就加载dll了。
2013-1-15 22:30
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
可以参考MS的Detours中的代码,在LOAD的时候修改导入表,让系统帮你LOAD DLL!
2013-1-16 22:20
0
雪    币: 204
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢上面几位兄弟的回复。我继续研究下看是为什么。

  一些问题已经得到解决。可以参考下我的Blog文章

http://www.cnblogs.com/emissary/archive/2013/01/17/2864581.html
2013-1-17 15:30
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
7
你确定这个“Bug”一定不是由于Windows的虚存管理机制导致的?试过用.pagein命令装入页面数据么?试下!pte命令,检查一下这个地址的页面属性。
2013-1-18 12:07
0
雪    币: 77
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
国标 到此一游
2014-1-16 16:39
0
雪    币: 1392
活跃值: (5142)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
9
收到回调的时候的确是完全装载了。直接Read Write 系统缺页中断 页面就进来了
2014-12-25 11:57
0
游客
登录 | 注册 方可回帖
返回
//