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[]。这个我也不懂了,要是有人明白,请告诉本人。
- 64位系统应用层获取peb
- PEB结构的获取
- 使用Java代码在应用层获取Android系统属性
- 通过PEB获取模块基址
- fs寄存器获取PEB/TEB
- PEB
- PEB
- C获取系统是32位还是64位
- 获取系统是32位还是64位
- 获取Window是32位还是64位系统
- 64位系统中开启32位应用,特别是OLEDB
- Ubuntu15.04-64位系统兼容32位应用
- ubuntu 64位系统运行32位应用
- SQLite的.NET应用自适应32位/64位系统
- 搜索PEB结构获取Kernel32.dll基址
- 枚举PEB获取进程模块列表
- 从PEB获取内存中模块列表
- ring0获取指定进程的PEB
- C#线程系列讲座(1):BeginInvoke和EndInvoke方法
- 小波变换
- 笔试总结
- 邮政取 Google 西联汇款什么时候多了这么多手续?
- SQL2005/2008:错误18456的解决方案
- 64位系统应用层获取peb
- C#==>扩展方法
- System.Web.Routing入门及进阶 上篇
- boost.filesystem
- 4级 英语
- 如何对产品运营情况进行监控
- 为什么程序删不了呢?
- 程序员
- 有一个这样的男人