首页
社区
课程
招聘
[原创]遍历系统中的回调
发表于: 2012-4-3 22:24 28764

[原创]遍历系统中的回调

2012-4-3 22:24
28764

目的:
     遍历系统中的回调
类型:
     与Xuetr遍历到的类型相同

     如有雷同,还望见谅。。。有错误或者不恰当的地方请指正。
     附件中代码大量冗余,可以将相同的部分写成一个函数,一开始没注意,懒得改了。。。

详细实现见代码

环境:
     WIN XP SP3   大量使用硬编码,本次仅在于实现我的虚拟机环境下的遍历,没有考虑寻找通用方法。

参考资料:1、WRK 1.2   
          2、React OS  
          3、标 题:替换进程创建监视函数
          作 者:鹿剑
          链 接:http://bbs.pediy.com/showthread.php?t=93759
将包括:
        1.创建进程、创建线程、加载模块回调
        2.注册表回调
        3.错误检测回调
        4.Lego回调
        5.关机回调
        6.注销回调
        7.文件系统改变回调
        8.即插即用回调(还未完成,忘大家给些提示,我好补充完整

        8.已经完成,见下面:(从2000里面抄抄捡捡,大牛莫笑。。。
       
其实实现起来都差不多,一个链表头串起来,好几种只是结构不同而已

1、创建进程、创建线程、加载模块回调
(1)创建进程回调
   注册创建进程回调使用函数 PsSetCreateProcessNotifyRoutine,调用这个函数会将注册的信息保存到一个数组里面。
反汇编这个函数,会发现以下片段:

805d0c27 56              push    esi
805d0c28 57              push    edi
805d0c29 7464            je      nt!PsSetCreateProcessNotifyRoutine+0x73 (805d0c8f)
805d0c2b bf404a5680      mov     edi,offset nt!PspCreateProcessNotifyRoutine (80564a40)   
805d0c30 57              push    edi

PspCreateProcessNotifyRoutine (80564a40)即这个数组的地址,这个数组是以下结构:
ypedef struct _EX_FAST_REF
{
    union
    {
        PVOID Object;
        ULONG_PTR RefCnt:3;
        ULONG_PTR Value;
    };
} EX_FAST_REF, *PEX_FAST_REF;

低三位RefCnt是引用指针,Value指向一个结构,如下:
typedef struct _EX_CALLBACK_ROUTINE_BLOCK
{
    EX_RUNDOWN_REF RundownProtect;
    PEX_CALLBACK_FUNCTION Function;
    PVOID Context;
} EX_CALLBACK_ROUTINE_BLOCK, *PEX_CALLBACK_ROUTINE_BLOCK;
804fa138 c7400458d75580  mov     dword ptr [eax+4],offset nt!KeBugCheckCallbackListHead (8055d758)
*
NTKERNELAPI
BOOLEAN
KeRegisterBugCheckCallback (
    __out PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
    __in PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
    __in PVOID Buffer,
    __in ULONG Length,
    __in PUCHAR Component
    )
typedef struct _KBUGCHECK_CALLBACK_RECORD {
    LIST_ENTRY Entry;
    PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
    PVOID Buffer;
    ULONG Length;
    PUCHAR Component;
    ULONG_PTR Checksum;
    UCHAR State;
} KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;

LIST_ENTRY KeBugCheckCallbackListHead;
LIST_ENTRY KeBugCheckReasonCallbackListHead;
typedef VOID (*PLEGO_NOTIFY_ROUTINE)( PKTHREAD Thread );
ULONG PsSetLegoNotifyRoutine( PLEGO_NOTIFY_ROUTINE LegoNotifyRoutine ) 
{ 
    PAGED_CODE(); 
    PspLegoNotifyRoutine = LegoNotifyRoutine; 
    return FIELD_OFFSET(KTHREAD,LegoData); 
} 
nt!PsSetLegoNotifyRoutine:
805d299a 8bff            mov     edi,edi
805d299c 55              push    ebp
805d299d 8bec            mov     ebp,esp
805d299f 8b4508          mov     eax,dword ptr [ebp+8]
805d29a2 a3c0d26780      mov     dword ptr [nt!PspLegoNotifyRoutine (8067d2c0)],eax//这里
805d29a7 b8d0000000      mov     eax,0D0h
805d29ac 5d              pop     ebp
805d29ad c20400          ret     4
LIST_ENTRY IopNotifyShutdownQueueHead;
LIST_ENTRY IopNotifyLastChanceShutdownQueueHead;

typedef struct _SHUTDOWN_PACKET {
    LIST_ENTRY ListEntry;
    PDEVICE_OBJECT DeviceObject;
} SHUTDOWN_PACKET, *PSHUTDOWN_PACKET;
ULONG GetNotifyAddr(PDEVICE_OBJECT Device_Object)
{
	ULONG Addr;
	PDRIVER_OBJECT Driver_Object;
	Driver_Object=Device_Object->DriverObject;
	Addr=*(ULONG*)((ULONG)Driver_Object+0x38+0x40);
	return Addr;
}

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

上传的附件:
收藏
免费 8
支持
分享
最新回复 (28)
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
2
看上去好像很不错........ 支持个!
2012-4-3 22:36
0
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
严重支持
来个IO TIMER DCP TIMER更好
2012-4-4 04:33
0
雪    币: 506
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
支持一下。

2012-4-4 08:02
0
雪    币: 2314
活跃值: (2205)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
5
看了下,定位数组的时候都是采用的硬编码,这样的话,通用性不太好。
上次逆向了下PowerTool的实现方法,它是首先自己调用PsSetxxx函数插入自己的回调,然后再寻找自己的回调的方法,挺巧妙的,兄弟可以借鉴下。
不过也有个缺点,就是数组中成员满了之后,插入自己的回调就会失败了。
这两个方法结合下就很好了。
2012-4-4 17:39
0
雪    币: 862
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
6
多谢版主提示…我研究研究,另外,关于即插即用回调的问题,谁能给些提点?
2012-4-5 10:24
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
7
mark 一下,感谢共享。
2012-4-5 14:19
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
8
支持一下。。。
2012-4-6 06:48
0
雪    币: 274
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不错不错,向楼主学习了~~
2012-4-6 13:54
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
支持楼主,多谢!
2012-4-9 16:59
0
雪    币: 249
活跃值: (71)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
plugplay的回调该如何获得?求解释
2012-4-10 14:18
0
雪    币: 862
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
12
我也在郁闷这个啊
2012-4-11 15:40
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
正好需要这方面的资料,感谢分享,收下学习了
2012-4-13 08:50
0
雪    币: 49
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
收藏备用,感谢分享。
2012-4-13 10:09
0
雪    币: 862
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
15
PlugPlay回调遍历方法补充完毕。。。
2012-5-9 20:28
0
雪    币: 29
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
很详细,谢谢楼主分享。
2012-12-6 09:50
0
雪    币: 882
活跃值: (1441)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
好东西,定
2013-4-12 14:07
0
雪    币: 3761
活跃值: (510)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
不错,做个标记
2013-6-9 23:01
0
雪    币: 350
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
国际惯例, 强势插入! 刚好需要补充各种回调的枚举资料思路
2013-8-7 02:45
0
雪    币: 350
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
[QUOTE=futosky;1060342]引用:
"但是技术太烂,WinDbg在u IoRegisterPlugPlayNotification里面没看到IopDeviceClassNotifyList数组,但是发现还有一个函数:IopInitializePlugPlayNotification   这个函数没有导出,我用了最烂的方法,遍历内核模块空间,根据特征码得到函数地址
nt!IopInitializePlugPlayNotification:
8058a5b4 6a0d            push    0Dh
8058a5b6 b880d06780      mov     eax,offset nt!IopDeviceClassNotifyList (8067d080)
...
再得到IopDeviceClassNotifyList 数组地址,遍历即可。。。"[/QUOTE]

     最近在写枚举系统回调->即插即用,在WinDBG调试分析 IoRegisterPlugPlayNotification函数体时惊现对IopDeviceClassNotifyList数组地址的引用-_-!
纠正楼主在贴子中讲解的"在u IoRegisterPlugPlayNotification里面没看到IopDeviceClassNotifyList数组"的说法、、

代码:
0: kd> u IoRegisterPlugPlayNotification l 200
nt!IoRegisterPlugPlayNotification:
..
8058b3fd ff1518914d80    call    dword ptr [nt!_imp_ExAcquireFastMutex (804d9118)]
8058b403 8b4334          mov     eax,dword ptr [ebx+34h]
8058b406 034330          add     eax,dword ptr [ebx+30h]
8058b409 6a0d            push    0Dh
8058b40b 03432c          add     eax,dword ptr [ebx+2Ch]
8058b40e 59              pop     ecx
8058b40f 034328          add     eax,dword ptr [ebx+28h]
8058b412 33d2            xor     edx,edx
8058b414 f7f1            div     eax,ecx
8058b416 8d04d580d06780  lea     eax,nt![COLOR="Red"]IopDeviceClassNotifyList[/COLOR] (8067d080)[edx*8] // 地址8067d080跟LZ一样(Xp Sp3)
8058b41d 8b4804          mov     ecx,dword ptr [eax+4]
8058b420 894b04          mov     dword ptr [ebx+4],ecx
8058b423 8903            mov     dword ptr [ebx],eax
8058b425 8919            mov     dword ptr [ecx],ebx
8058b427 8bcf            mov     ecx,edi
8058b429 895804          mov     dword ptr [eax+4],ebx
8058b42c ffd6            call    esi
8058b42e f6450c01        test    byte ptr [ebp+0Ch],1
8058b432 0f8404020000    je      nt!IoRegisterPlugPlayNotification+0x4e2 (8058b63c)
...
2013-8-9 01:49
0
雪    币: 862
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
21
额   过去很久了,我印象中好像我虚拟机里的 XP 是没看到   看到过一个貌似数组的但是得不到正确数据

很久没碰电脑了,好思念有代码敲的日子~~
2013-8-11 09:04
0
雪    币: 115
活跃值: (46)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
22
ObRegisterCallBacks也是创建一个回调的吧,发现好多工具都没有遍历这个。
2013-8-11 09:23
0
雪    币: 350
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
LZ的枚举即插即用貌似枚举出来的结构很奇怪且总是对不上呢少几个, 发现了两个与即插即用回调或相关的链表数据结构:IopProfileNotifyList与IopDeferredRegistrationList, 但还是少几个即插即用回调, LZ看看呗
2013-8-11 18:30
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
24
mark 一下,感谢共享。
2013-8-11 18:33
0
雪    币: 350
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
这么久也没回复, 楼主不会也改卖水果了吧
2013-8-11 21:16
0
游客
登录 | 注册 方可回帖
返回
//