首页
社区
课程
招聘
[求助]对于定位原驱动的分发处理例程MajorFunction有什么好的方法吗
发表于: 2011-10-25 20:15 8631

[求助]对于定位原驱动的分发处理例程MajorFunction有什么好的方法吗

2011-10-25 20:15
8631
针对MajorFunction被替换的情况。
      看到的方法都不太好,需要在一台“干净”的系统中,先获取每个IRP对应的处理例程,而且有系统的差异性~。

      有没有更好的方法,可以忽略系统的差异性的~

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

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
分析原始PE文件的DriverEntry
不过要想通用所有驱动比较困难(可以自己实现指令虚拟机)
要是针对的话,搜特征码即可
2011-10-27 13:00
0
雪    币: 216
活跃值: (144)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
3
指令虚拟机,能说说具体的方案吗?
2011-10-27 17:59
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
虚拟执行DriverEntry,给它个DriverObject让它填充去……
2011-10-27 18:43
0
雪    币: 216
活跃值: (144)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
5
教主,其实就是想探讨下具体实现,之前有想过,就是有很多问题。目的是很明确,让它载入,调用DriverEntry得到_DRIVER_OBJECT::MajorFunction,但是DriverEntry里面做的其他东西,怎么让它还原,例如有恶意代码,例如重复绑定(搞那个键盘驱动,搞到输入不了东西呢),DriverEntry里面太多未知数~。那个虚拟执行,现时有没有具体的技术实现?~
2011-10-27 19:46
0
雪    币: 1040
活跃值: (1293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
http://hi.baidu.com/sudami/blog/item/c53b3eecd69870da2f2e21a4.html 介个……?
2011-10-27 20:07
0
雪    币: 216
活跃值: (144)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
7
感谢,正在测试中。。。。
2011-10-27 20:17
0
雪    币: 1040
活跃值: (1293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
大米PJF出品,必属精品啊……
2011-10-27 20:32
0
雪    币: 216
活跃值: (144)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
9
就是Naylon和教主说的思路的具体代码,不能算模拟~,其实是真实执行了,貌似只限制了以下例程的工作:
        if (   FALSE == IAT_HOOK_engine( PeAddr, "KeTickCount", "ntoskrnl.exe", (int)&g_KeTickCount )
                || FALSE == IAT_HOOK_engine( PeAddr, "ExAllocatePoolWithTag", "ntoskrnl.exe", (int)fake_ExAllocatePoolWithTag )
                || FALSE == IAT_HOOK_engine( PeAddr, "RtlInitUnicodeString", "ntoskrnl.exe", (int)fake_RtlInitUnicodeString )
                || FALSE == IAT_HOOK_engine( PeAddr, "IoCreateDevice", "ntoskrnl.exe", (int)fake_IoCreateDevice )
                )

只能说是按需要去实现功能,好像并不能说很通用呢~
2011-10-27 20:59
0
雪    币: 1337
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
个人觉得真正的通法应该是没有,因为你模拟的局限性,不信你可以试试disk.sys和ntfs.sys这两个。
2011-10-27 21:57
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
方法我已经想到了,不过还没实现
而且这种方法是最差的,基本思路是:
1.自己重新映射一份驱动映像到内存
2.使用开源引擎反汇编DriverEntry
3.自建堆栈、寄存器
4.解析每一条指令字符串(貌似仅仅解析push、mov、lea、pop之类的就够了,跳转类直接略)
调用之前自己模拟PUSH好每个参数,然后直接模拟执行DriverEntry即可
代码我已经写了一点,不过由于对汇编指令不熟+期中考试,暂时先不继续。。考完试再研究
2011-10-28 17:56
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
12
方法我已经想到了,不过还没实现
而且这种方法是最差的,基本思路是:
1.自己重新映射一份驱动映像到内存
2.使用开源引擎反汇编DriverEntry
3.自建堆栈、寄存器
4.解析每一条指令字符串(貌似仅仅解析push、mov、lea、pop之类的就够了,跳转类直接略)
调用之前自己模拟PUSH好每个参数,然后直接模拟执行DriverEntry即可
代码我已经写了一点,不过由于对汇编指令不熟+期中考试,暂时先不继续。。考完试再研究
2011-10-28 18:00
0
雪    币: 216
活跃值: (144)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
13
不知道解析效果如何,期待,如果有成果麻烦在论坛PM俺~
Naylon兄,你在解析过程中要注意一些问题:
1、WDM和WDF框架都要考虑,你说跳转指令可以忽略,万万不可,你看看WDF框架就知道了。还有就是根据条件来设置MajorFunction,你也不能忽略。
2、要考虑他是call一个函数来设置MajorFunction的,或者是嵌套几个。
3、存在地址覆盖问题,不能说一解析到修改后,就跳过解析。换句话说,就是一定要吧整个DriverEntry解析完,这个对于WDF框架很有难度~
2011-10-28 19:04
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
14
看情况啦…
完全的万能可能是比较困难,不过一般的系统驱动貌似还没那么复杂,跟进几层JMP也行
暂时还没时间做这个。。
2011-10-28 19:21
0
游客
登录 | 注册 方可回帖
返回
//