-
-
[原创][原创]逆向IoRegisterPlugPlayNotification获取即插即用回调地址,配图加注释超级详细
-
发表于:
2022-9-18 14:32
11731
-
[原创][原创]逆向IoRegisterPlugPlayNotification获取即插即用回调地址,配图加注释超级详细
在写anti rootkit时,想要遍历一下即插即用回调函数。经过搜索发现,我们找到目标函数然后逆向分析一下,找到我们需要的链表。跟之前的回调不同 这个函数在注册时,分注册类型注册。
话不多说。我们进入正题。
首先我们打开IDA,找到IoRegisterPlugPlayNotification函数。F5反汇编
首先将注册回调的驱动引用计数+1,防止对象被删除。
此时v12将不会成立。我们直接跳到下面查看逻辑
首先我们进入到PnpInitializeNotifyEntry函数中查看,此函数初始化了我们的回调对象结构。将回调属性填入我们申请的内存中。
图中对结构进行填充,初始化
然后进入PnpDeferNotification函数中我们查看。发现在此函数 又申请一个结构,将之前的结构填充。并挂到链表。但是使用windbg实际查看这个链表时,发现这个链表为空。说明此处挂上之后,运行完就会删除。具体原因还需分析。在函数挂入时。回调的执行流程。
所以这里对我们而言是没有用的。
但是我们看到外面PnpDeferNotification函数执行后,又再次挂到一处链表。
我们使用windbg查看。发现正确 very good。
使用windbg dq PnpDeviceClassNotifyList
即可看到一大堆 LIST_ENTRY链表结构
此处为链表数组,此数组共13个成员遍历每个成员即可获取到所有的回调函数。
索引下标0 指向自己说明没有存储东西。
下标2我们发现 他并没有指向自己。所以有存回调。遍历时注意判断即可!
我们dq fffff8a0`000816f0查看一下此结构
首先是我们的链表。然后+0x20是我们的回调地址
可以使用PC hunter看一下。确实正确。这时我们也可以放心遍历。加入到自己的工具中啦。又是美好的一天,祝各位每天都是开心的一天。代码使你快乐
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课