网上到处都有的一篇关于线程注入的源代码,但是遇到下面的问题,在代码中有注释(红色部分),请Delphi大侠们指点指点。
program Project1;
{$IMAGEBASE $13140000}
uses
Windows, shellapi;
var
ProcessHandle, PID: longword;
ExeFile:string = '这是一段测试字符串';
{问题出现在如果ExeFile不是在这里初始化,而是在主体begin .. End 过程中
赋值时,会出现注入失败,即Explorer.exe出错??}
procedure Main;
begin
MessageBox(0, PChar(ExeFile),'测试',0);
{如果这里换 Showmessage(Exefile)也会导致注入Explorer.exe失败,为什么?是不是一定要WinAPI函数才行?}
end;
procedure Inject(ProcessHandle: longword; EntryPoint: Pointer);
var
Module, NewModule: Pointer;
Size, BytesWritten, TID: longword;
begin
Module := Pointer(GetModuleHandle(nil));
Size := PImageOptionalHeader(Pointer(integer(Module) + PImageDosHeader(Module)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;
VirtualFreeEx(ProcessHandle, Module, 0, MEM_RELEASE);
NewModule := VirtualAllocEx(ProcessHandle, Module, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessHandle, NewModule, Module, Size, BytesWritten);
CreateRemoteThread(ProcessHandle, nil, 0, EntryPoint, Module, 0, TID);
end;
begin
//ExeFile:= '这是一段测试字符串';
{如果加上上面这一句会导致注入失败,即Explorer.exe出错,为什么???}GetWindowThreadProcessId(FindWindow('Shell_TrayWnd', nil), @PID); //获取explorer的PID
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID); //打开进程
Inject(ProcessHandle, @Main); //插入代码
CloseHandle(ProcessHandle); //关闭线程句柄
end.
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)