网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.

Windows内核PspCidtable表地址的获取

本文出自悠然品鉴小悠原创,转载请注明出处:http://www.youranshare.com/blog/sid/78.html,如有错误欢迎大家指出!

PspCidTable

打了两天游戏,网站都懒得更新了,今天给大家带来的是在Windows 7下驱动中获取PspCidtable表地址的方法,请自行准备好Windbg来一步一步跟着进行分析,其实挺简单的…

PspCidtable是一个句柄表,通过这个表可以将句柄转换成对应的对象指针,本文中只是讲解如何获取到PspCidtable的地址,其他的内容将不过多涉及。

OK,我们开始如何获取PspCidtable的地址吧,首先打开你的Windbg,我们使用命令 dd PspCidtable可以直接通过Windbg看到它的地址,如图所示:

                                             

可以看到它的地址为0x83f59f34,可是在我们的代码中可不能这个样子,我们需要用到PsLookupProcessByProcessId这个未导出的函数。

PsLookupProcessByProcessId 函数的功能是由进程 ID 得到进程的 Eprocess结构体, 由于函数引用了PspCidTable 表的指针,因此可以从该函数中找到PspCidTable 表的内存地址,我们使用windbg反汇编这个函数,看一下这个函数的一些基本的汇编代码,输入命令 uf nt!PsLookUpProcessByProcessId

然后会出现一大推汇编代码,然后一直往上翻,找到这一部分:

如图所示,仔细看一下第三个框中的地址,这货不就是我们上面直接获取PspCidTable的地址么、然后看一下这一句汇编代码对应的机器码(第一个方框),8b3c349ff583,因为数值在内存中存放的时候是按照小端存放的,所以如果我们要存放PspCidTable地址83f59f34的时候 在内存中应该是 34 9f f5 83,这也整好对应了这句汇编代码中的8b3c349ff583,所以要想找到PspCidTable的地址,只需要从PsLookUpProcessByProcessId入口开始找到这句汇编代码,然后提取出后面的4个字节就是我们要的地址了.

从上面的图中可以看到,这句汇编代码在函数体内的偏移量为:0x 84073593-0x 84073575,然后在往后偏移两个字节就是我们需要找的PspCidTable的地址了,所以我们可以计算出PspCidTable的地址偏移位置为: 0x84073593-0x 84073575+0x02=0x20;

OK知道了偏移量,让我们用代码开始获取PspCidTable的地址吧,直接上代码吧:

//

ULONG GetPspcidAddr()
{
         ULONG uPspCidTableAddr = 0;
 
         //搜索PsLookUpProcessByProcessId
         UNICODE_STRING uszPsLookupProcessByProcessId;
         RtlInitUnicodeString(&uszPsLookupProcessByProcessId,L"PsLookupProcessByProcessId");
 
         PVOID lpPsLookupProcessByProcessId = MmGetSystemRoutineAddress(&uszPsLookupProcessByProcessId);
         if (lpPsLookupProcessByProcessId==NULL)
         {
                   KdPrint(("获取PsLookupProcessByProcessId失败...\n"));
                   return uPspCidTableAddr;
         }
         //Win7 x86的偏移位置
         const ULONG PSPCIDTABLE_OFFSEET = 0x1E + 0x02;
         uPspCidTableAddr = *(ULONG*)((ULONG)lpPsLookupProcessByProcessId+PSPCIDTABLE_OFFSEET);
 
         KdPrint(("PspCidTable:0x%08x\n",uPspCidTableAddr));
 
         return uPspCidTableAddr;
}


看一下运行的结果是不是与我们的结果相同(windbg终止调试的命令是g):

当然,你一可以从函数的地址一个字节一个字节搜索8b3c349ff583,直到匹配到8b3c,然后它后面的四个字节也就是PspCidTable的地址了.

提示:直接搜索8b,一旦搜索到就看看后面是不是3c,是的话就找到了,不是的话就继续…


  • 标签:
  • PspCidtable地址获取
  • PspCidtable入口
网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.