将DLL注入的代码从Delphi 7转换为Delphi XE2

时间:2012-06-09 18:39:06

标签: delphi delphi-7 delphi-xe2 code-injection

我有一个旧的注射器,由我在Delphi 7中制造,我试图以这种方式改变它,它仍然可以在XE2中工作,但我失败了.-新的测试dll适用于我的旧注射器没有任何问题所以我很确定我的注射器有虫子。

这是我制作的代码:

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并将bw更改为NativeUInt。 showmessage告诉我一切正常。由于String类型从d7更改为XE2,因此必须存在细微差别。我也尝试将dll名称转换为PAnsiChar,但它对我没有任何改变。

希望我能为您发布足够的信息。

2 个答案:

答案 0 :(得分:7)

在Unicode Delphi下,您的代码的最终结果是将UTF-16文本传递给LoadLibraryA。当然,这需要8位ANSI文本。您有两种方法可以解决此问题:

  1. 坚持使用ANSI文字,只需将string替换为代码段中的AnsiString
  2. 切换到Unicode文本。使用LoadLibraryW并应用Arnaud建议的更改以正确处理16位文本的长度。

答案 1 :(得分:4)

在Delphi XE2中,string现在由Widechar组成,即char=WideChar

所以你应该在代码中写:(length(dllname)+1)*sizeof(char)。它适用于Delphi 7和XE2。

和'LoadLibraryW'用于unicode参数。