Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > вопрос по Инъекции dll в чужей процесс


Автор: maestro2k 12.5.2006, 22:37
Есть 2-а файла 1.exe, 2.dll
в 2.dll реализован хук правильной инъекции:
KHook:=SetWindowsHookEx(WH_KEYBOARD,@KProc,HInstance, 0);
в 1.exe процедура запуска инъекции 
CreateRemoteThread
Работает например с explorer.exe, но с некотроыми процессами не работает например с фтп сервером.
Вопрос: Как сделать инъекцию в любой процесс?


 

Автор: Yanis 12.5.2006, 23:26
Ну ты у яндекса спрашивал? Я 17 строку смотрел? 

Автор: RA 13.5.2006, 01:27
Цитата(maestro2k @  12.5.2006,  22:37 Найти цитируемый пост)
в 2.dll реализован хук  правильной инъекции:

 smile

Добавлено @ 01:32 
Пробигали у нас тут примеры инжектов, но если у приложения есть какая-то защита от инжекта, то нужно как минимум знать какая, ато это война с невидимым противником. 

Автор: maestro2k 13.5.2006, 10:23
Я ставлю хук в длл для того, что б приложение в которое делается инъект, не зависало (пробовал без хука а через таймер АПИ, вешеат), но наверно в приложениях в которых нет окна хук не работает, тоесть не получается иньекция.
Помогите. Как сделать инъект в любой процесс, даже в безоконный??? 

Автор: Nickel 13.5.2006, 11:48
Код

{ Внедрение Dll в процесс }
Function InjectDll(Process: dword; ModulePath: PChar): boolean;
var
  Memory:pointer;
  Code: dword;
  BytesWritten: dword;
  ThreadId: dword;
  hThread: dword;
  hKernel32: dword;
  Inject: packed record
           PushCommand:byte;
           PushArgument:DWORD;
           CallCommand:WORD;
           CallAddr:DWORD;
           PushExitThread:byte;
           ExitThreadArg:dword;
           CallExitThread:word;
           CallExitThreadAddr:DWord;
           AddrLoadLibrary:pointer;
           AddrExitThread:pointer;
           LibraryName:array[0..MAX_PATH] of char;
          end;
begin
  Result := false;
  Memory := VirtualAllocEx(Process, nil, sizeof(Inject),
                           MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  if Memory = nil then Exit;

  Code := dword(Memory);
  //инициализация внедряемого кода:
  Inject.PushCommand    := $68;
  inject.PushArgument   := code + $1E;
  inject.CallCommand    := $15FF;
  inject.CallAddr       := code + $16;
  inject.PushExitThread := $68;
  inject.ExitThreadArg  := 0;
  inject.CallExitThread := $15FF;
  inject.CallExitThreadAddr := code + $1A;
  hKernel32 := GetModuleHandle('kernel32.dll');
  inject.AddrLoadLibrary := GetProcAddress(hKernel32, 'LoadLibraryA');
  inject.AddrExitThread  := GetProcAddress(hKernel32, 'ExitThread');
  lstrcpy(@inject.LibraryName, ModulePath);
  //записать машинный код по зарезервированному адресу
  WriteProcessMemory(Process, Memory, @inject, sizeof(inject), BytesWritten);
  //выполнить машинный код
  hThread := CreateRemoteThread(Process, nil, 0, Memory, nil, 0, ThreadId);
  if hThread = 0 then Exit;
  CloseHandle(hThread);
  Result := True;
end;

Взято из статьи "Перехват API функций в Windows NT (часть 1). Основы перехвата." 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)