首页
社区
课程
招聘
[原创][原创]逆向IoRegisterPlugPlayNotification获取即插即用回调地址,配图加注释超级详细
发表于: 2022-9-18 14:32 11731

[原创][原创]逆向IoRegisterPlugPlayNotification获取即插即用回调地址,配图加注释超级详细

2022-9-18 14:32
11731

在写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直播授课

收藏
免费 3
支持
分享
最新回复 (2)
雪    币: 871
活跃值: (9841)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
2
感谢分享逆向知识. 写出的Ark能白嫖一波不
2022-9-22 09:43
0
雪    币: 3738
活跃值: (3872)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
感谢分享!
2022-9-22 17:52
0
游客
登录 | 注册 方可回帖
返回
//