C++ 在DLL注入之后,如何获取目标进程的基址?

C++ 在DLL注入之后,如何获取目标进程的基址?,c++,winforms,winapi,memory-address,dll-injection,C++,Winforms,Winapi,Memory Address,Dll Injection,在我成功地将dll注入目标进程(比如“target.exe”)后,如何获取“target.exe”的基址 我尝试过GetModuleHandle(0)和GetModuleHandle(“target.exe”),但它似乎不正确,我不知道如何调试。我试着这样打印: //retrive target's base address DWORD EXEBaseAddr = (DWORD) GetModuleHandle((LPCWSTR)"target.exe"); std::stringstream

在我成功地将dll注入目标进程(比如“target.exe”)后,如何获取“target.exe”的基址

我尝试过GetModuleHandle(0)和GetModuleHandle(“target.exe”),但它似乎不正确,我不知道如何调试。我试着这样打印:

//retrive target's base address
DWORD EXEBaseAddr = (DWORD) GetModuleHandle((LPCWSTR)"target.exe");
std::stringstream sstr;
sstr << EXEBaseAddr;
std::string str = sstr.str();
String^ str3 = gcnew String(str.c_str());
baseAddressLBL->Text = str3;
//检索目标的基址
DWORD EXEBaseAddr=(DWORD)GetModuleHandle((LPCWSTR)“target.exe”);
std::stringstream sstr;
sstr文本=str3;
我不得不在最后再次强制转换它,因为我正在使用Windows窗体(不确定它是否被称为)打印界面中的地址。

GetModuleHandle(NULL)
是否获取当前正在运行的进程的id;)因此,如果您的代码在target.exe进程内运行,您应该使用该API调用检索进程id,您确定能够成功地插入dll并将调用跳转到您的代码吗

如果您确定代码正常工作,可以尝试使用
GetCurrentProcessId()函数它检索调用进程的id:)有关它的详细信息,请参阅MSDN


您使用的是
GetModuleHandle
的宽版本(即
GetModuleHandleW
),因此必须向其传递有效的宽字符串。您的错误是,您正在将非宽字符串转换为无法工作的宽字符串。请改用以下方法:

(DWORD)GetModuleHandleW(L"target.exe");
或者,通过以下方式实现相同的功能:

(DWORD)GetModuleHandleA("target.exe");

可能重复的问题,已回答。该线程似乎正在处理从外部访问地址的问题。
GetModuleHandle(0)
返回调用进程的句柄,而不是其ID。它们是不同的东西。我检查了进程ID,它确实注入了正确的进程。我似乎每次都得到相同的地址4194304。。这应该发生吗?我希望每次启动进程时,基址都会有所不同;主要是如果它启用了地址空间加载随机化(您可以通过Process Explorer看到这一点)。4194304(又名0x400000)是AFAIK的公共基址。