64位系统应用层获取peb

来源:互联网 发布:截动图软件 编辑:程序博客网 时间:2024/06/11 12:25

  最近在搞64位系统移植。今个把在获取peb的问题描述一下。在32位系统下,我们都知道可以简单的通过内联汇编得到fs:30位置的就是peb的地址,也可使用NtQueryInformationProcess得到。其实在64位系统上也可以使用上面的方式简单的获取到,但必须你的应用程序是64位的。

   我们现在要将的就是不改变我们现有的32位应用程序来正确的获取到peb的地址。大家不妨试试,直接将原先的32位应用程序在64位系统上跑,会发现取得的数据是错误的,一般来说是相差0x1000偏移。这个是为什么呢,主要是由于64位系统在运行32位应用程序时,会进行api的重定向将给64位的api进行处理,之后再转换给32位api,在这一些的转换之后就出现了问题。这里就不说了。如何用32程序得到peb才是今天的关键。

   既然直接使用fs寄存器是不行了。那么我们就只好采用NtQueryInformationProcess这个函数了。这个函数在64位系统中是其实是调用的NtWow64QueryInformationProcess64。这样我们的问题就简单的多了,我们只要在动态得到这个函数的地址,然后进行调用即可。是不是这样呢,通过实验,确实是这样的。但是有一个问题需要注意的就是,在xp 64位系统中这个函数的地址的32位系统空间中,也就是说原来在32位系统中使用的指针4个字节是可以访问到的。但是在vista之后,你会发现使用32位指针得到地址,是不对的。因为这个api的地址并不在32位的空间中,需要用8字节结构来存储。也就是说原来可能用一个ULONG就可以存放这个地址,然后call就行了。现在不行了,用一个ULONG只是得到真实地址的低4字节,直接call必然是错误的。我才尝试的采用了ULONG64来保持这个地址,然后直接call,居然成功了,很神奇。不过编译的时候会有警告。查看汇编,你会看到是一个dword ptr[]。这个我也不懂了,要是有人明白,请告诉本人。