将用于DLL注入的Delphi 7代码翻译成Delphi XE2代码

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即可。showmessage仅告诉我所有的东西都起作用了。由于String类型从d7更改为XE2,必定存在一些微小的差异。我还尝试将dll名称强制转换为PAnsiChar,但对我没有任何影响。希望我提供了足够的信息给你。
2个回答

7
在Unicode Delphi下,您的代码的最终结果是将UTF-16文本传递给LoadLibraryA。当然,该函数需要8位ANSI文本。您有两个选项来解决这个问题:
  1. 坚持使用ANSI文本,只需在代码片段中用AnsiString替换string即可。
  2. 切换到Unicode文本。使用LoadLibraryW并按照Arnaud建议的更改正确处理16位文本的长度。

我使用版本2来使其工作,无论如何我正在使用XE2(Delphi 7已被卸载)。非常感谢大家:D。 - HolyShiru
在XE2上,选项1可以正常工作,但是Unicode选项始终是首选。 - David Heffernan

4
在Delphi XE2中,string现在由Widechar组成,即char=WideChar
所以您应该在您的代码中编写:(length(dllname)+1)*sizeof(char)。它将适用于Delphi 7和XE2。
并且使用'LoadLibraryW'来处理unicode参数。

添加 dllname:=ADLLName; (只是在我的引用中忘记了它)和 pDLLname := VirtualAllocEx(hProcess, nil, (length(dllname) + 1) * sizeof(char), MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);WriteProcessMemory(hProcess, pDLLname, Pointer(dllname), (length(dllname) + 1) * sizeof(char), bw);对我来说仍然无效 :/ - HolyShiru
@arnaud这并不是解决问题的方法。WriteProcessMemory另一端期望的是8位文本。最简单的解决方法是将字符串替换为AnsiString。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接