После того, как я успешно ввел свою 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;
Мне пришлось снова привести его в конце, потому что я использую форму Windows (не уверен, так ли это называется), чтобы напечатать адрес в моем интерфейсе.
Вы используете широкую версию GetModuleHandle
(Т.е. GetModuleHandleW
), таким образом, вы должны передать ему правильную широкую строку Ваша ошибка в том, что вы преобразуете неширокую строку в широкую строку, которая не будет работать. Вместо этого используйте следующее:
(DWORD)GetModuleHandleW(L"target.exe");
Или следующее, которое выполняет то же самое:
(DWORD)GetModuleHandleA("target.exe");
GetModuleHandle(NULL);
действительно получает идентификатор текущего запущенного процесса;) поэтому, если ваш код выполняется внутри процесса target.exe, вы должны получить идентификатор процесса с помощью этого вызова API, вы уверены, что смогли успешно внедрить dll и выполнить вызов? к вашему коду?
если вы уверены, что ваш код работает, вы можете попробовать использовать GetCurrentProcessId();
функция это получает идентификатор вызывающего процесса 🙂 больше об этом на MSDN
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683180(v=vs.85).aspx