Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хук на создание процесса 
:(
    Опции темы
Red Wind
Дата 31.7.2004, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 25.6.2004
Где: Минск

Репутация: нет
Всего: 2



Какой тип хука надо ставить, что-бы перехватить создание процесса? И вообще, что надо ловить?
PM MAIL ICQ   Вверх
<Spawn>
Дата 1.8.2004, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



WH_CBT и ловить HCBT_CREATEWND


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Red Wind
Дата 1.8.2004, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 25.6.2004
Где: Минск

Репутация: нет
Всего: 2



HCBT_CREATEWND отслеживает создания окон, а не процессов.
PM MAIL ICQ   Вверх
<Spawn>
Дата 1.8.2004, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



Я тебе говрою что HCBT_CREATEWND - сам так отлавливал. Этот хук перехватывет получение окном сообщения WM_CREATE до его поступеления окну. Соответсвтенно, если отменить это сообщение, то главное окно и не будет создано. Именно для перехвата процессов, по моему, стандартных хуков не существует.

Это сообщение отредактировал(а) <Spawn> - 1.8.2004, 12:56


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Red Wind
Дата 1.8.2004, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 25.6.2004
Где: Минск

Репутация: нет
Всего: 2



А ведь можно перехватить вызов API CreateProcess, только как это реализовать?
PM MAIL ICQ   Вверх
<Spawn>
Дата 1.8.2004, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



Можно но для этого тебе нужно писать заглушку вызова функции CreateProcess -
делаешь ДЛЛ в которой описываешь твой прототип CreateProcess так же в этой длл-ке у тебя долен быть код, заменяющий адрес твоей функции-прототипа на реальный адрес функции CreateProcess в таблице импорта процесса. Причем нужно сделать так, чтобы эта ДЛЛ-ка загружалась в адресное пространство целевых процессов при их старте.

Всю инфу можно найти на rsdn.ru, но там на C.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Red Wind
Дата 1.8.2004, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 25.6.2004
Где: Минск

Репутация: нет
Всего: 2



А на Delphi?
В FAQ есть пример, только я здесь ничего не догоняю (может кто пояснит?) :
Код

library Mouse_mes;

uses
 sysutils,
 windows,
 messages;

type
  TImageImportDescriptor=packed record
   OriginalFirstThunk    : DWORD;
   TimeDateStamp         : DWORD;
   ForwarderChain        : DWORD;
   Name                  : DWORD;
   FirstThunk            : DWORD;
 end;
 PImageImportDescriptor=^TImageImportDescriptor;

var filename:array[0..max_path-1] of char;
   hook:HHook=0;
   PEHeader:PImageNtHeaders;
   ImageBase:cardinal;

function MyHookProcedure(hWnd: HWND; lpText, lpCaption: PWideChar; uType: UINT): Integer;
stdcall;
begin
 result:=MessageBoxA(0, 'Notepad', 'my hook', 0);
 //Но уже через нашу табл. импорта
end;

procedure ProcessImports(PImports:PImageImportDescriptor);
   Var
       PImport:PImageImportDescriptor;
       PRVA_Import:LPDWORD;
       ProcAddress:pointer;
       Temp_Cardinal:cardinal;
   begin{1}
     ProcAddress:=GetProcAddress(GetModuleHandle('USER32.DLL'), 'MessageBoxA');
     PImport:=PImports;
     while PImport.Name<>0 do
       begin{2}
         PRVA_Import:=LPDWORD(pImport.FirstThunk+ImageBase);
         while PRVA_Import^<>0 do
         begin{3}
           if PPointer(PRVA_Import)^=ProcAddress
              then
                begin{4}
                  VirtualProtect(PPointer(PRVA_Import),4,PAGE_READWRITE,Temp_Cardinal);
                  PPointer(PRVA_Import)^:=@MyHookProcedure; //пишем свою...
                 VirtualProtect(PPointer(PRVA_Import),4,Temp_Cardinal,Temp_Cardinal);
                end;{1}
           Inc(PRVA_Import);
         end;{2}
      Inc(PImport);
  end;{3}
end;{4}

procedure DllEntryPoint(reson:longint);stdcall;
begin
case reson of
 DLL_PROCESS_ATTACH:
    begin
     DisableThreadLibraryCalls(hInstance);
     ZeroMemory(@FileName, SizeOf(FileName));
     GetModuleFileName(GetModuleHandle(nil), @FileName, SizeOf(FileName));

        if Pos('NOTEPAD.EXE',AnsiUpper(@FileName))<>0 then //сейчас я хочу попробовать все это дело надо  нотепадом
        begin
          ImageBase:=GetModuleHandle(nil);
          PEHeader:=pointer(int64(ImageBase)+PImageDosHeader(ImageBase)._lfanew);//pe header
         ProcessImports(pointer(PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress+ImageBase));
         end;
     end;
 end;
end;

function nexthook(code:integer;wParam,lParam:longint):longint;stdcall;
begin
 result:=callnexthookex(hook,code,wParam,lParam);
end;

procedure sethook(flag:bool);export; stdcall;
begin
if flag then
   hook:=setwindowshookex(wh_getmessage,@nexthook,hInstance,0)
else
  begin
   unhookwindowshookex(hook);
   hook:=0;
  end;
end;

exports sethook;

begin
 DLLProc:=@DllEntryPoint;
 DllEntryPoint(DLL_PROCESS_ATTACH)
end.


Это сообщение отредактировал(а) Red Wind - 1.8.2004, 14:13
PM MAIL ICQ   Вверх
<Spawn>
Дата 1.8.2004, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



Red Wind если ты не понимаешь этот код, то я полагаю, что тебе пока не стоит браться за убивание процессов smile.gif. Для начала бы не помешало разобраться в структуре PE-загловка exe-файлов, поэксперементировать в извлечении данных этого заголовка для своего процесса. И почитать теорию на rsdn.ru - без этого ты вряд ли чего напишешь.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
RA
Дата 1.8.2004, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Ну можно применить и более простой способ, отслеживать появление нового процесса в всписке процессов.
PM   Вверх
xZero
Дата 1.8.2004, 16:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Red Wind, в том примере, который ты привел, имхо, перехватывается MessageBoxA. И тем более только для блокнота....
Неужели тебе ничто не подсказывает что надо изменить, что бы ловился CreateProcess, а не MessageBox?
  Вверх
Red Wind
Дата 1.8.2004, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 25.6.2004
Где: Минск

Репутация: нет
Всего: 2



Подсказывет, но это не работает. Вот ещё один пример, тоже не палит :
Код

library My;

uses sysutils, windows, messages;

type
   TImageImportDescriptor=packed record
   OriginalFirstThunk: DWORD;
   TimeDateStamp: DWORD;
   ForwarderChain: DWORD;
   Name: DWORD;
   FirstThunk: DWORD;
   end;
   PImageImportDescriptor=^TImageImportDescriptor;

var
   hook: HHook = 0;
   PEHeader:PImageNtHeaders;
   ImageBase:cardinal;

function MyHookProcedure(lpFileName: PChar): boolean;stdcall;
begin
MessageBox(HWND(nil), PChar('Попытка запуска файла '+lpFileName), '!!!', MB_OK);
ExitProcess(0);
result := FALSE;
end;

procedure ProcessImports(PImports:PImageImportDescriptor);
var
   PImport:PImageImportDescriptor;
   PRVA_Import:LPDWORD;
   ProcAddress:pointer;
   Temp_Cardinal:cardinal;
begin
ProcAddress := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'CreateProcessA');
PImport:=PImports;
while PImport.Name <> 0 do
 begin
  PRVA_Import:=LPDWORD(pImport.FirstThunk+ImageBase);
  while PRVA_Import^ <> 0 do
   begin
    if PPointer(PRVA_Import) ^= ProcAddress then
     begin
      VirtualProtect(PPointer(PRVA_Import),4,PAGE_READWRITE,Temp_Cardinal);
      PPointer(PRVA_Import)^:=@MyHookProcedure;
      VirtualProtect(PPointer(PRVA_Import),4,Temp_Cardinal,Temp_Cardinal);
     end;
    Inc(PRVA_Import);
   end;
  Inc(PImport);
 end;
end;

procedure DllEntryPoint(reson:longint);stdcall;
begin
case reson of
 DLL_PROCESS_ATTACH:
  begin
   DisableThreadLibraryCalls(hInstance);
   ImageBase := GetModuleHandle(nil);
   PEHeader := pointer(int64(ImageBase) + PImageDosHeader(ImageBase)._lfanew);//pe header
   ProcessImports(pointer(PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress+ImageBase));
  end;
end;
end;

function nexthook(code:integer;wParam,lParam:longint):longint;stdcall;
begin
   result:=callnexthookex(hook,code,wParam,lParam);
end;

procedure sethook(flag:bool);export; stdcall;
begin
if flag then
hook:=setwindowshookex(wh_getmessage,@nexthook,hInstance,0)
else
begin
 unhookwindowshookex(hook);
 hook:=0;
end;
end;

exports sethook;
begin
DLLProc:=@DllEntryPoint;
DllEntryPoint(DLL_PROCESS_ATTACH)
end.

Добавлено @ 20:45
Цитата

Ну можно применить и более простой способ, отслеживать появление нового процесса в всписке процессов.

Если по таймеру, то не подходит. Но если нет, то можно попробовать (как?).
PM MAIL ICQ   Вверх
RA
Дата 1.8.2004, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Прежде всего меня интересует вопрос, а чем тебе таймер не угодил?
Боишься что его Убьют или чисто из принципа?
PM   Вверх
Red Wind
Дата 1.8.2004, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 25.6.2004
Где: Минск

Репутация: нет
Всего: 2



Из принципа.
PM MAIL ICQ   Вверх
Red Wind
Дата 1.8.2004, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 25.6.2004
Где: Минск

Репутация: нет
Всего: 2



А ещё есть мысль про TDebugEvent. Пробую написать, только не выходит : WaitForDebugEvent возвращает ERROR_INVALID_HANDLE. Что я неправильно делаю?
Код

procedure TForm1.Event;
var Event: TDebugEvent;
begin
 while not stop do
 begin
   Application.ProcessMessages;    
   if not WaitForDebugEvent(Event, 0) then Application.MessageBox(PChar(IntToStr(GetLastError)),':-(',0)
   else  
   if Event.dwDebugEventCode=CREATE_PROCESS_DEBUG_EVENT then  
     Application.MessageBox('EVENT','EVENT',0);
 end;
end;


Это сообщение отредактировал(а) Red Wind - 1.8.2004, 23:16
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1346 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.