Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.20;
Скачать: CL | DM;

Вниз

Инжект 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 вся ветка

Текущий архив: 2008.04.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
15-1204892867
@!!ex
2008-03-07 15:27
2008.04.20
Где можно купить летучую мышь?


2-1206397813
hahol_64_rus
2008-03-25 01:30
2008.04.20
массив и индесы


15-1204390811
Ник
2008-03-01 20:00
2008.04.20
Потерял "горячие" клавиши :(


2-1206279898
Stepper
2008-03-23 16:44
2008.04.20
Как прикрутить ProgressBar к IdHTTP?


2-1206121928
DJ_UZer
2008-03-21 20:52
2008.04.20
Выделение в мемо