2013-09-01 70 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/如何對獲得最開始,基地址的-A-過程中-C)。 – 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); 確實獲得當前正在運行的進程的ID;),所以如果我們的代碼是你應該使用API​​調用來檢索進程ID target.exe進程內運行,你確定你能成功地注入該DLL和跳轉到您的代碼的電話?

如果您確信您的代碼工作,你可以嘗試使用GetCurrentProcessId();功能,它檢索調用進程的ID :)更多關於它的MSDN

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

+1

'GetModuleHandle(0)'返回調用進程的句柄,而不是它的ID。他們是不同的東西。 –

+0

我檢查了進程ID,它的確注入了正確的進程。 – zeion

相關問題