64位系统应用层获取peb

  最近在搞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[]。这个我也不懂了,要是有人明白,请告诉本人。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值