Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.043 c
2-1206685011
Uno-84
2008-03-28 09:16
2008.04.20
Пересчет количества строк в таблице


2-1206546070
kernel
2008-03-26 18:41
2008.04.20
WM_PAINT чужого приложения


3-1196257580
Vlad
2007-11-28 16:46
2008.04.20
Формат даты


15-1204691569
Skyle
2008-03-05 07:32
2008.04.20
Вывод "Hello Hello" с помощью esc-последовательностей


2-1206252269
Igor23
2008-03-23 09:04
2008.04.20
Активные формы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский