在MSDN中有这样一句话,我们尝试在二进制的角度理解一下
KResourcesManger的结构在+0x098有一个NotificationQueue,按照道理来说就是这个QUEUE了,注意KQUEU的结构是这样,真正的数据在EntryListeHead组织的链表中。
在tm.sys模块中定位到一个名为TmpGetNotificationResourceManager的函数队NotificationQueue进行了操作,逆向整理一下伪代码可以发现它的主要逻辑就是从NotificationQueue中取出队首的元素,并把它传入TmpCaptureOrRequeueNotification中
进入到TmpCaptureOrRequeueNotification中可以发现最主要的逻辑是一个memmove操作。逻辑是将qentry_p结构体中的TranscationNotification给复制到了传进来的地址中
经过对qentry_p结构体的创建过程进行逆向,可以确定其结构体大致是这样。
也就是说当Enlistment执行PrepareComplete,CommitComplete等函数发生状态改变时,KTM会将FullNotification入队到ResourceManager的NotificationQueue中,在我们通过TmpGetNotificationResourceManager等函数查看ResourceManger的Notification时,会将Queue中的队首元素出队
整个过程如下所示,在Enlisment创建成功后,KTM便已经在QUEUE中入队了三个元素,即三个Notification
在我们通过TmpGetNotificationResourceManager查看ResourceManger的Notification时发生出队操作
原文始发于微信公众号(3072):TransactionNotification逆向与分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论