gpt4 book ai didi

c++ - 如何使用汇编程序(x64 OS)获取进程环境 block (PEB)地址?

转载 作者:行者123 更新时间:2023-11-30 00:46:45 29 4
gpt4 key购买 nike

我正在尝试使用汇编程序获取当前进程的 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;
}

汇编文件:

.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?

谢谢

最佳答案

如果您不介意 C。适用于 Microsoft Visual Studio 2015。使用“__readgsqword()”内部函数。

#include <winnt.h>
#include <winternl.h>

// Thread Environment Block (TEB)
#if defined(_M_X64) // x64
PTEB tebPtr = reinterpret_cast<PTEB>(__readgsqword(reinterpret_cast<DWORD_PTR>(&static_cast<NT_TIB*>(nullptr)->Self)));
#else // x86
PTEB tebPtr = reinterpret_cast<PTEB>(__readfsdword(reinterpret_cast<DWORD_PTR>(&static_cast<NT_TIB*>(nullptr)->Self)));
#endif

// Process Environment Block (PEB)
PPEB pebPtr = tebPtr->ProcessEnvironmentBlock;

关于c++ - 如何使用汇编程序(x64 OS)获取进程环境 block (PEB)地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37288289/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com