Главная страница
    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.038 c
2-1206598873
zdm
2008-03-27 09:21
2008.04.20
Отслеживание исполнения


4-1187433709
Inject
2007-08-18 14:41
2008.04.20
Инжект DLL в чужой процесс


2-1206166003
Armond
2008-03-22 09:06
2008.04.20
Насчет календарика


11-1188223121
Ned
2007-08-27 17:58
2008.04.20
Консольные приложения


8-1178974125
Veter
2007-05-12 16:48
2008.04.20
Удаление TImage





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский