2016-06-07 70 views
2

我一直在尋找了一段時間,並沒有找到如下問題的合適的答案:C++ GetProcAddress的64位返回的32位地址

我注入DLL到目標進程,而DLL裏面,我打電話導出的功能,解決我希望收到我打電話GetProcAddress的如下:

FARPROC funcAddr = 
GetProcAddress(GetModuleHandle("target.dll"), "exportedFunc") 

調用成功,我檢索地址並且GetLastError()爲0,很明顯。

但它只是地址的16字節十六進制表示(如「0xAB4285B9」),但我需要它爲32字節的十六進制表示,因爲我缺少前8個字節(例如7FF8,完整地址會然後是「0x7FF8AB4285B9」)

它只是一個演示文稿/格式問題還是我需要調用另一個函數來得到我想要的?

我喜歡顯示的信息:

WCHAR buffer[256]; 
swprintf_s(buffer, 32, L"%X", funcAddr); 
MessageBox(NULL, buffer, L"Address", MB_OK); 

我感謝所有幫助。

對不起,對於非代碼格式,我在這裏使用我的手機的網頁瀏覽器。

格爾茨

+2

在Windows中,「long」總是32位,即使在64位Windows中也是如此。爲什麼不要求一個指針值的表示。無論如何,當你對比特和字節感到困惑時,就像你看起來那樣,然後DLL注入並不是你能掌握的東西。只是一個頭。雖然探索可能很有趣。 :) –

+0

對不起,我的意思是'int'總是32位。但是這是真的(儘管不相關),因爲我寫了一個「long」總是32位的。沒有仔細查看格式字符串。 –

+0

首先我不知道你想說什麼long或int的大小,但是你讓我找到了「typedef int(FAR WINAPI * FARPROC)();」的定義。我明白位和字節之間的差異,迄今爲止沒有問題。我只是沒有注意到FARPROC是一個整數大小的函數指針。 我很欣賞你的提示。 – Trickzter

回答

0

好吧,因爲我讀了一點點深入到我的理解,爲了使其正常工作(特別感謝@cheers和HTH)改變了我的解決方案的題目是:

WCHAR buffer[256]; 
swprintf_s(buffer, 32, L"%p", funcAddr); 
MessageBox(NULL, buffer, L"Address", MB_OK); 

只需將「%X」的格式更改爲表示指針地址表示的「%p」即可。 就這麼簡單。