2012-06-09 277 views
4

我這是由我在Delphi 7條提出的舊注射器和我試圖改變他如此,它仍然工作在XE2但我失敗的-.-新的測試DLL與我的舊注射器工作沒有任何問題,所以我很確定我的注射器有一個錯誤。翻譯代碼DLL注入德爾福7德爾福XE2

這裏是我做的代碼:

procedure TForm1.InjectDLL(const ADLLName: String; targetproc: Cardinal); 
var 
    dllname: String; 
    pDLLname, pStartAddr: Pointer; 
    bw: NativeUInt; 
    hProcess, hRemoteThread: THandle; 
    TID: Cardinal; 
begin 
    hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, targetproc); 
    pDLLname := VirtualAllocEx(hProcess, 0, length(dllname) + 1, 
    MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); 

    WriteProcessMemory(hProcess, pDLLname, Pointer(dllname), 
    length(dllname) + 1, bw); 

    pStartAddr := GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'); 
    hRemoteThread := CreateRemoteThread(hProcess, nil, 0, pStartAddr, 
    pDLLname, 0, TID); 
    WaitForSingleObject(hRemoteThread, INFINITE); 
    showmessage('Fehler ' + IntToStr(GetLastError) + ': ' + 
    SysErrorMessage(GetLastError)); 
    CloseHandle(hProcess); 
end; 

我只是需要hProcess和hRemoteThread改變THandle和重量至NativeUInt。 showmessage只是告訴我,所有的作品。由於字符串類型從d7更改爲XE2,所以必須有一個小的差異。我也嘗試將dll的名字命名爲PAnsiChar,但它對我沒有任何改變。

希望我爲您發佈了足夠的信息。

回答

7

你的代碼的最終結果,在Unicode的德爾福,是UTF-16的文字傳遞給LoadLibraryA。當然,這需要8位ANSI文本。有兩個選項來解決此問題:

  1. 棒與ANSI文本和簡單地AnsiString在您的代碼段替換string
  2. 切換到Unicode文本。使用LoadLibraryW並應用Arnaud建議的更改以正確處理16位文本的長度。
+0

我使用版本2得到這個工作即時通訊使用XE2無論如何(德爾福7被卸載)。非常感謝:D。 – HolyShiru

+0

選項1可以在XE2上正常工作,但Unicode選項總是首選。 –

4

在Delphi XE2中,string現由Widechar構成,即char=WideChar

所以,你應該寫:在你的代碼(length(dllname)+1)*sizeof(char)。它適用於Delphi 7和XE2。

而'LoadLibraryW'爲unicode參數。

+0

added dllname:= ADLLName; (只是忘它在我的報價)和pDLLname:= VirtualAllocEx來(hProcess,零,(長度(其中dllname)+ 1)* 的sizeof(char)的,或MEM_COMMIT MEM_RESERVE,PAGE_EXECUTE_READWRITE); WriteProcessMemory的(hProcess,pDLLname,指針(其中dllname) (長度(其中dllname)+ 1)*的sizeof(char)的,體重); 仍然不對我工作:/ – HolyShiru

+0

@arnaud這不是真的要這樣做。 WriteProcessMemory另一端的東西將期望8位文本。解決這個問題的最簡單方法是用AnsiString替換字符串。 –