2008-11-11 109 views
0

我想讀取另一個進程擁有的Win32 ListView中的數據。不幸的是,我的WriteProcessMemory()調用失敗,並顯示錯誤「此係統不支持此功能」。當我在我的VirtualAlloc()調用中爲基地址指定「NULL」時。但是,如果我通過一些我感到幸運的「魔術」值來抵消該VirtualAlloc()地址,並在沮喪的時刻隨機挑選,則該調用在我的系統上運行,但在其他系統上失敗。 (見下面的代碼)Win32 WriteProcessMemory()魔術補償值

有人可以建議這個神奇的膠印是爲我做的嗎?通過試驗和錯誤,我可以找到適用於特定系統的值,但是我無法找到解決此問題的通用解決方案。

感謝, PaulH

#define MAGIC_OFFSET (DWORD)0x01020000 

LVHITTESTINFO hti = { 0 }; 
hti.pt    = clientPoint; 

LPVOID lpBuffer = ::VirtualAlloc(NULL, 1, MEM_RESERVE, PAGE_READWRITE); 
::VirtualFree(lpBuffer, 0, MEM_RELEASE); 

lpBuffer = ::VirtualAlloc((LPVOID)((DWORD)lpBuffer + MAGIC_OFFSET), sizeof(hti), MEM_RESERVER, PAGE_READWRITE); 
DWORD dwBuffer = (DWORD)lpBuffer + MAGIC_OFFSET - sizeof(hti); 

if(!::WriteProcessMemory(hProcess, (LPVOID)dwBuffer, (LPVOID)&hti, sizeof(hti), NULL)) 
    return 0; 

if(ListView_HitTest(hWndListView, (LPVOID)dwBuffer) < 0) 
    return 0; 

if(!::ReadProcessMemory(hProcess, (LPVOID)dwBuffer, (LPVOID)&hti, sizeof(hti), NULL)) 
    return 0; 

::VirtualFree(lpBuffer, 0, MEM_RELEASE); 

澄清(鎘人加入):這是Windows Mobile平臺上,大概非x86架構。所以情況可能會有所不同(ARM處理器中是否有單獨的地址空間?)。

回答

3

而不是嘗試在另一個進程中分配內存,而不是使用命名的共享內存。本文將帶您通過shared memory的基本設置,並且我進行了快速檢查以確保這些功能得到Windows Mobile 5的支持。

+0

這似乎很好地工作。我無法相信我對這個話題的所有研究都從未改變過。 非常感謝 – PaulH 2008-11-11 19:20:20

2

VirtualAlloc分配內存YOUR地址空間。在寫入另一個進程的內存空間時使用該地址是絕對無效的。您應該使用VirualAllocEx來代替並傳入hProcess。

你只是越來越幸運,當它工作時隨意塗抹一些隨機內存。

如果在查詢另一個進程時不支持VirtualAllocEx的第一個參數指定NULL(不知道它是否爲)...那麼可以使用VirtualQueryEx來映射出地址空間另一個進程並找到一個有效的空閒區域傳遞給VirtualAlloc。

您可能必須將其置於重試循環中,因爲其他進程地址空間的狀態可能會在您尋找空位時發生更改。

0

您必須記住,您正在寫入虛擬程序的地址空間。在Windows上,它通常從一個像你的幻數一樣的地址開始。

你有沒有調試過程序?地址是什麼樣的?

在我的系統,可執行文件通常被裝載周圍00400000或01000000從可執行文件變成可執行文件,我相信Windows有,甚至在同一個可執行文件的連續運行更改此地址的能力。

此外,可執行文件的部分有其自己的(和相對較小的)偏移量。例如,代碼段通常在+1000左右,然後是數據,歸零數據段等。

這是什麼意思,如果您的可執行文件的基數爲00400000,並且其數據段的偏移量爲+ 2000,數據的第一個字節將在00402000.爲了讀寫這個字節,你必須指定一個基地址00402000,而不是2000,絕對不是0.

試着打印一個指針。如果指向的對象具有靜態生存期,它可能會駐留在數據部分,您將得到類似00402000的地址。然後,如果您將WriteProcessMemory添加到該地址,則將修改該對象。

各種Win32可執行格式都包含這個「0040000」基地址以及各個部分的偏移量,但是因爲讀取另一個進程的內存的這種黑客可能會針對特定可執行文件的特定版本,你可能會更好,只需保留幻數即可。