首页
社区
课程
招聘
[求助]X64下的可执行文件拦截
发表于: 2015-2-27 22:36 10460

[求助]X64下的可执行文件拦截

2015-2-27 22:36
10460
在X86下由于由于可以SSDT HOOK ,直接 HOOK NTCreateSection ,
而X64下不过patchguard的情况下失效
之前看到有用 PsSetLoadImageNotifyRoutine 给sys文件的入口点DriverEntry 返回失败,实现拦截的代码,由于水平有限,一直无法实现dll 和 exe等可执行文件的拦截,请高手赐教,谢谢!
发一份 Tesla.Angela大牛写的参考代码,只能禁用SYS

目前已经能够获取可执行文件的全路径,并且判断32位还是64位,但是仍然无法patch到入口点,返回失败,拦截后立即蓝屏,求大神们patch的方法

目前使用PsSetLoadImageNotifyRoutine  已经能够拦截32位和64位的DLL,但是不知道为何拦截过一次后,即使关闭驱动,
再次加载居然自动仍然拦截,不晓得什么原因?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (24)
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
直接进程回调 拦截到就结束
2015-2-28 00:07
0
雪    币: 1392
活跃值: (5197)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
3
minifilter createfile 返回失败
2015-2-28 08:29
0
雪    币: 186
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个控制粒度太大了,需要控制到所有PE文件
包括sys,dll,ocx等
2015-2-28 17:03
0
雪    币: 186
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个需要判断PE文件格式吧?
而且效率估计比较低,
2015-2-28 17:04
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
PsSetLoadImageNotifyRoutine  判断进程是不是64还是32,然后定位到程序入口点,然后直接写C3即可!
2015-2-28 17:05
0
雪    币: 1392
活跃值: (5197)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
7
为何需要判断格式?
文件名判断不行吗
2015-2-28 17:14
0
雪    币: 1392
活跃值: (5197)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
8
你这样不能针对进程做。一个C3 重启电脑之前 所有的程序都无法加载这个模块。除非你再次改回来
2015-2-28 17:16
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
PsSetLoadImageNotifyRoutine  也可以!但是要注意重入问题
2015-2-28 18:38
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
你把物理内存给改了
2015-2-28 18:50
0
雪    币: 1392
活跃值: (5197)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
11
minifilter已经可以做了。
image回调最好实现windows的COPYONWRITE做,那样不会影响其他进程。
可以通过入口点的地址计算出页面的PTE 修改PTE标记位的第9位打开copyonWrite开关 就行了
2015-3-1 10:59
0
雪    币: 186
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
minifilter 至少需要通过标记判断是否是执行文件,否则文件太大,
这种方案我持保留意见,感觉和文件加载拦截关系不大,可否有参考代码?
2015-3-1 11:35
0
雪    币: 1392
活跃值: (5197)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
13
CreateFile进来的时候 标志位如果是将这个映像用于执行 会带有 PAGE_EXECUTE(FILE_EXECUTE 具体不记得是哪个) 带有这个标记都可用于可执行,根本不需要读取文件去判断类型。

从自带的参数得到文件是否为PE文件。然后再按照你的规则判断过滤
2015-3-1 12:33
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
改pet不够优雅
优雅的方法是把锁解开直接用writememory的api 然后在把锁上回去
2015-3-1 19:53
0
雪    币: 1392
活跃值: (5197)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
15
是的,这个方法也是copyonwrite机制。之前我也是卡在这个死锁了。
2015-3-1 21:43
0
雪    币: 294
活跃值: (119)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
16
拦截dll,入口直接写入
return 0
也就是:
xor eax,eax
ret
2015-3-1 21:55
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
这个问题当初郁闷死我了,从头逆过一遍才看出这个玄妙
2015-3-3 18:41
0
雪    币: 186
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
还是没灵感啊,有没有可参考的资源,在此谢过
2015-3-5 22:12
0
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
堆栈都不平
BOOL APIENTRY DllMain(HANDLEhModule, DWORD ul_reason_for_call, LPVOIDlpReserved)

最后应该是ret 0xC才对
2015-3-5 22:17
0
雪    币: 294
活跃值: (119)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
20
恩,对多谢指正,忘记看调用约定了
2015-3-5 22:37
0
雪    币: 186
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
如果是DLL里面,没有入口点的情况(入口点地址为0,无DllMain),该如何处理呢?
2015-3-8 15:59
0
雪    币: 186
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
前面几步已经办到了,就剩下最后一步 “直接写C3”,挣扎中。
2015-3-8 16:40
0
雪    币: 186
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
现在已经拦截成功,写入口点成功,但是再次启动后,入口点一直被改写,即使关闭驱动,同一个dll一直无法记载,不知道是什么原因、
2015-3-12 21:29
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
确实是这样 之前听说好像是文件被映射一次 以后就不用映射的了
2015-3-12 22:41
0
雪    币: 2
活跃值: (61)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
可以先保存原来的代码,创建个线程,一秒钟再改回来。就不会影响下次加载。
2015-3-14 11:07
0
游客
登录 | 注册 方可回帖
返回
//