我得到了一个由我在 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,但它对我没有任何改变。
希望我为您发布了足够的信息。