2013-09-01 3 views
2

После того как я успешно ввел свою DLL в мой целевой процесс, скажем, «target.exe», как я могу получить базовый адрес «target.exe»?Как получить базовый адрес целевого процесса после инъекции DLL?

Я пробовал 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 (не уверен, если это то, что она называется), чтобы напечатать адрес в моем интерфейсе ,

+0

Возможный дубликат вопрос, ответил [здесь] (http://stackoverflow.com/questions/11564148/ как к-получить по-пуско-Base-адрес в своем-процессе-в-с). – Noseratio

+0

Этот поток, похоже, имеет дело с доступом к адресу извне. – zeion

ответ

1

Вы используете широкий вариант GetModuleHandle (то есть GetModuleHandleW), поэтому вы должны передать ему действительную широкую строку. Ваша ошибка заключается в том, что вы производите неровную строку в широкую строку, которая не будет работать. Используйте следующие вместо:

(DWORD)GetModuleHandleW(L"target.exe"); 

Или следующий, который выполняет ту же самую вещь:

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

Кажется, я получаю тот же адрес каждый раз, когда 4194304 .. это должно произойти? Я ожидал, что базовый адрес будет отличаться каждый раз, когда я начну процесс. – zeion

+1

Зависит от процесса; в основном, если включена рандомизация адресной загрузки места (вы можете увидеть это с помощью Process Explorer). 4194304 (ака 0x400000) является общим базовым адресом AFAIK. – Natok

0

GetModuleHandle(NULL); действительно получает идентификатор текущего запущенного процесса в;), поэтому если ур код работает внутри процесса target.exe вы должны извлекая идентификатор процесса с помощью этого API вызова, вы можете быть уверены, что вы смогли успешно внедрить dll и перепрыгнуть вызов к вашему коду?

, если вы уверены, что ваш код работает, вы можете попробовать использовать GetCurrentProcessId(); функцию, которую он извлекает идентификатор вызывающего процесса :) больше об этом на сайте MSDN

http://msdn.microsoft.com/en-us/library/windows/desktop/ms683180(v=vs.85).aspx

+1

'GetModuleHandle (0)' возвращает дескриптор вызывающего процесса, а не его идентификатор. Это разные вещи. –

+0

Я проверил идентификатор процесса, и он действительно вводит правильный процесс. – zeion

Смежные вопросы