13th
Янв

Нужно при запуске программы извлечь dll из ресурсов во временный каталог и проинжектить в другой процесс

Posted by Chas under Delphi

Как это сделать?

Пепел Феникса

procedure InjectDll(TargetId: cardinal; DllName: String);
var
BytesWrite : cardinal;
ParamAddr : pointer;
pThreadStart : pointer;
Hdl : cardinal;
hThread : cardinal;
hRemoteThread : Cardinal;
begin
ChangePrivilege('SeDebugPrivilege', True);
Hdl := OpenProcess(PROCESS_ALL_ACCESS, false, TargetId);
ParamAddr := VirtualAllocEx(Hdl, nil, Length(DllName)+1, MEM_COMMIT or MEM_RESERVE,PAGE_EXECUTE_READWRITE);//терминал тоже надо.*
WriteProcessMemory(Hdl, ParamAddr, PAnsiChar(AnsiString(DllName)), Length(DllName)+1, BytesWrite);//аналогично+именно тут нам нужна строка нужного формата(Ansi)*
pThreadStart := GetProcAddress(GetModuleHandle('KERNEL32.DLL'),'LoadLibraryA');
hThread := CreateRemoteThread(Hdl, nil, 0, pThreadStart, ParamAddr, 0,hRemoteThread);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
VirtualFreeEx(Hdl,ParamAddr,0,MEM_RELEASE);//уборка за собою.
CloseHandle(Hdl);//тоже надо.
end;

function AutoInject(param:pointer):integer;stdcall;//прототип пишем как положено.*
var
pID: cardinal;
begin
while True do
begin
pID := GetProcessID('notepad.exe');

if pID <> 0 then
begin
Temp := GetEnvironmentVariable('TEMP');
InjectDll(pID,Temp+'/1.dll');//вы на типы вообще смотрите?*
Sleep(500);
PostMessage(Form1.Handle, WM_CLOSE, 0, 0);
end
else
Sleep(500);
end
end;

тема на форуме

Похожие статьи