【发布时间】:2016-05-18 00:26:42
【问题描述】:
我正在尝试使用汇编程序获取当前进程的 PEB 地址。
cpp 文件:
#include <iostream>
//#include <windows.h>
extern "C" int* __ptr64 Get_Ldr_Addr();
int main(int argc, char **argv)
{
std::cout << "asm " << Get_Ldr_Addr() << "\n";
//std::cout <<"peb "<< GetModuleHandle(0) << "\n";
return 0;
}
asm 文件:
.code
Get_Ldr_Addr proc
push rax
mov rax, GS:[30h]
mov rax, [rax + 60h]
pop rax
ret
Get_Ldr_Addr endp
end
但我从 GetModuleHandle(0) 和 Get_Ldr_Addr() 得到不同的地址!
有什么问题?不应该是一样的吗?
问:如果函数是外部的,它会检查调用它的进程或函数的dll(假设是dll)的PEB?
Tnx
【问题讨论】:
-
你把你的返回值放在哪里?显然你正在将它加载到 RAX 中,但随后它被 pop 覆盖。检查您应该如何返回 ABI 中的值。
-
我删除了推送/弹出。这是根据某些指令返回值的方法。 deviorel.wordpress.com/2015/01/19/…
-
获得指向任何进程的
PEB的指针的另一种方法是使用NtQueryInformationProcess(): "当ProcessInformationClass参数为@987654329 @,ProcessInformation参数指向的缓冲区应该足够大以容纳单个PROCESS_BASIC_INFORMATION结构... [其]PebBaseAddress成员指向PEB结构。" -
有关处理 32 位与 64 位 PEB 和 Windows 8+(更改 32 位 PEB 的位置)的更多详细信息,请参阅 How to get the Process Environment Block (PEB) from extern process?。
-
不知道你是如何得到
GetModuleHandle返回PEB的印象。