4

我得到了一个由我在 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。节目信息只是告诉我一切正常。由于 String 类型从 d7 更改为 XE2,因此肯定存在细微差别。我还尝试将 dll 名称转换为 PAnsiChar,但它对我没有任何改变。

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

4

2 回答 2

7

在 Unicode Delphi 下,您的代码的最终结果是将 UTF-16 文本传递到LoadLibraryA. 当然,这需要 8 位 ANSI 文本。您有两种选择来解决问题:

  1. 坚持使用 ANSI 文本,只需在代码片段中替换string为。AnsiString
  2. 切换到 Unicode 文本。使用LoadLibraryW并应用 Arnaud 建议的更改以正确处理 16 位文本的长度。
于 2012-06-09T20:29:28.113 回答
4

在 Delphi XE2 中,现在string由.Widecharchar=WideChar

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

和 'LoadLibraryW' 用于 unicode 参数。

于 2012-06-09T18:49:58.697 回答