Форум: "WinAPI";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];
ВнизИнжект DLL в чужой процесс Найти похожие ветки
← →
Inject (2007-08-18 14:41) [0]В хр работает на ура в win2003 без sp – на ура, с sp1 подвисает на строке:
WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
Никак не могу понять почему, помогите плиз.
Программа test.exe любой бинарник, хоть консольный, хоть гуишный.
program main;
uses
Windows,
SysUtils;
const
DLLinject = "test.dll";
ProgramStart = "test.exe";
function SetDebugPriv: Boolean;
var
Token: THandle;
tkp: TTokenPrivileges;
ReturnLength: DWORD;
begin
Result := false;
if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then
if LookupPrivilegeValue(nil, PChar("SeDebugPrivilege"), tkp.Privileges[0].Luid) then
begin
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
Result := AdjustTokenPrivileges(Token, false, tkp, 0, nil, ReturnLength);
end;
end;
function InjectLib(const ProcessID: DWORD): Boolean;
var
Process: HWND;
ThreadRtn: FARPROC;
DllPath: String;
RemoteDll: Pointer;
BytesWriten: DWORD;
Thread: DWORD;
ThreadId: DWORD;
ExitCode: DWORD;
begin
Result := SetDebugPriv;
if not Result then Exit;
Result := false;
Process := 0;
Thread := 0;
try
Process := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or
PROCESS_VM_WRITE, True, ProcessID);
if Process = 0 then Exit;
DllPath := ExtractFilePath(ParamStr(0)) + DLLinject;
RemoteDll := VirtualAllocEx(Process, nil, Length(DllPath),
MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
if RemoteDll = nil then Exit;
if not WriteProcessMemory(Process, RemoteDll, PChar(DllPath),
Length(DllPath), BytesWriten) then Exit;
if BytesWriten <> DWORD(Length(DllPath)) then Exit;
ThreadRtn := GetProcAddress(GetModuleHandle("Kernel32.dll"), "LoadLibraryA");
if ThreadRtn = nil then Exit;
Thread := CreateRemoteThread(Process, nil, 0, ThreadRtn, RemoteDll, 0, ThreadId);
if Thread = 0 then Exit;
if (WaitForSingleObject(Thread, INFINITE) = WAIT_OBJECT_0) then
if GetExitCodeThread(Thread, ExitCode) then
Result := ExitCode = 0;
finally
if RemoteDll <> nil then
VirtualFreeEx(Process, @RemoteDll, 0, MEM_RELEASE);
if Thread <> 0 then CloseHandle(Thread);
if Process <> 0 then CloseHandle(Process);
end;
end;
var
StartUpInfo: TStartUpInfo;
ProcessInfo: TProcessInformation;
begin
FillChar(StartUpInfo, SizeOf(TStartUpInfo), 0);
with StartUpInfo do
begin
cb := SizeOf(TStartUpInfo);
dwFlags := STARTF_FORCEONFEEDBACK;
end;
StartUpInfo.dwFlags := STARTF_FORCEOFFFEEDBACK;
if not CreateProcess(ProgramStart, "", nil, nil, false,
NORMAL_PRIORITY_CLASS or CREATE_SUSPENDED, nil, nil, StartUpInfo, ProcessInfo) then
Exit;
if not InjectLib(ProcessInfo.dwProcessId) then
TerminateProcess(ProcessInfo.hProcess,0)
else begin
ResumeThread(ProcessInfo.hThread);
WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
end;
with ProcessInfo do begin
CloseHandle(hThread);
CloseHandle(hProcess);
end;
end.
library test;
uses
windows;
{$R *.res}
procedure DllEntryPoint(reson:longint);stdcall;
begin
case reson of
DLL_PROCESS_ATTACH: ExitThread(0);
end;
end;
begin
DLLProc:=@DllEntryPoint;
DllEntryPoint(DLL_PROCESS_ATTACH)
end.
← →
Leonid Troyanovsky © (2007-08-19 10:31) [1]
> Inject (18.08.07 14:41)
> DLL_PROCESS_ATTACH: ExitThread(0);
ExitThread здесь неуместен.
--
Regards, LVT.
← →
Inject (2007-08-19 13:41) [2]Да, я это уже понял. Но вот почему? Сообразить не могу, не сможете объяснить?
И все ж таки хотелось бы возвращать код удачного завершения потока, когда это так и есть...
← →
Leonid Troyanovsky © (2007-08-19 15:54) [3]
> Inject (19.08.07 13:41) [2]
> Да, я это уже понял. Но вот почему? Сообразить не могу,
> не сможете объяснить?
http://www.microsoft.com/whdc/driver/kernel/DLL_bestprac.mspx
> И все ж таки хотелось бы возвращать код удачного завершения
> потока, когда это так и есть...
Ну, он и возвращается - хендл длл при удаче.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.038 c