Hol*_*iru 4 delphi code-injection delphi-7 delphi-xe2
我有一个旧的注射器,由我在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;
Run Code Online (Sandbox Code Playgroud)
我只需要将hProcess和hRemoteThread更改为THandle并将bw更改为NativeUInt.showmessage告诉我一切正常.由于String类型从d7更改为XE2,因此必须存在细微差别.我也尝试将dll名称转换为PAnsiChar,但它对我没有任何改变.
希望我能为您发布足够的信息.
在Unicode Delphi下,您的代码的最终结果是将UTF-16文本传递给LoadLibraryA
.当然,这需要8位ANSI文本.您有两种方法可以解决此问题:
string
用AnsiString
在您的代码段.LoadLibraryW
并应用Arnaud建议的更改以正确处理16位文本的长度.