2012-06-09 269 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替换字符串。 –