Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Поставить уникальный hook'и отловить сообщение winAPI,De

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

surfer10

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуйста какой поставить хук на запущенную нами программу, чтобы послать собщение и активировать его? Интересует именно тип хука устанавливаемого функцией setwindowshokex и способ посылки сообщения (функция sendmessage ?) для того, чтобы хук сработал только на наше сообщение. Многие ставят WH_CALLWNDPROCRET однако этот хук срабатывает на все сообщения, а меня интересует только посланные мною.

Всего записей: 56 | Зарегистр. 29-01-2004 | Отправлено: 06:52 16-03-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Подскажите пожалуйста какой поставить хук на запущенную нами программу, чтобы послать собщение и активировать его

Поконкретнее нельзя ли Для каких целей используется хук? Как понять, что бы хук сработал только на ваше сообщение? Если тебя интересуют только посланные тобой, то зарегистрируй свои собственные сообщения и отлавливай их, тогда на фиг нужен хук? Тое сть много чего не понятно.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 07:22 16-03-2004
surfer10

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прошу прощение за неполный запрос. Мы запускаем приложение. Например notepad.exe. Ставим хук на него, указывая его dwThreadId (идентификатор процесса) в setwindowshook для того, чтобы наша функция работала только в этом самом notepad.exe. Теперь мне надо активировать эту функцию, которую я записал хуком.
 
Вот здесь и возникает вопрос - как?.. Т.е. как послать некое уникальное сообщение, чтобы его отловил мой хук? Как сделать так, чтобы хук не сработал на какое-то другое сообщение.. Системное какое-нить.
 
Хук ставится для того, чтобы выполнить код от имени запускаемого процесса. Может я конечно и "лес горожу", но запускаемое приложение - не мое и другого способа я пока не знаю...

Всего записей: 56 | Зарегистр. 29-01-2004 | Отправлено: 07:31 16-03-2004
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
surfer10
а просто этому приложению сообщения посылать? не катит?
 
Хук ставится для того, чтобы выполнить код от имени запускаемого процесса
кстати... ShIvADeSt, не в курсе, а вообще это возможно?
 
тоже не понял смысла хука в данном случае...

----------
...или я ничего не понимаю в этой жизни... или понимаю слишком хорошо...

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 10:49 16-03-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Хук ставится для того, чтобы выполнить код от имени запускаемого процесса.

Sleepwalker
Это возможно, либо использовав хук, либо внедрив в это приложение свой поток. Есть примеры, которые польностью переопределяли WndProc для своих нужд.

Цитата:
Т.е. как послать некое уникальное сообщение,

Так я же тебе сказал, зарегистрируй свое собственное сообщение, где то раньше я писал, как это сделать и посылай его всем приложениям системы, им то по барабану, а вот хук его узнает и обработает. Если надо я еще раз напишу (просто сейчас некогда искать ).

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:08 17-03-2004
surfer10

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я наверное что-то не догоняю. немудрено, ведь я еще не ас в программировании на системном уровне.
 
Итак, имеем  
 
Для DLL библиотеки:
 
Function SetKeyboardHook(Wnd: HWND; dwProcId: DWORD): BOOL; stdcall;
Begin
 
  If ShareInf<>Nil Then
    Begin
      ShareInf^.message_:=RegisterWindowMessage('MyMessageToAll');
      ShareInf^.AppWndHandle:=Wnd;
      ShareInf^.OldHookHandle:=SetWindowsHookEx(WH_SHELL, @KeyboardHook, HInstance, dwProcId);
      Result:=ShareInf^.OldHookHandle<>0;
    End
  Else Result:=False
End;
 
Регистрируется нормально, потому что мы регистрируем WH_SHELL. Стоит нам попытаться зарегистрировать ShareInf^.message_ кторое мы создали, как хук не ставится.

Всего записей: 56 | Зарегистр. 29-01-2004 | Отправлено: 06:44 17-03-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
surfer10

Цитата:
Я наверное что-то не догоняю.  немудрено, ведь я еще не ас в программировании на системном уровне

A Рихтера "проштудировал"? У него этому посвящена целая толковая глава с примерами...

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 08:14 17-03-2004
surfer10

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Рихтера не штудировал, а попросил помощи у сведующих людей, чтобы они подсказали путь решения конкретной проблемы.
 
Как-то можно поставить SetWindowsHookEx на WH_CALLWNDPROC (или на что - подскажите?..) а затем послать сообщение SendMessage(HWND_BROADCAST,<что тут поставить?>,<Wparam - что тут?>,<Code - и что тут?>); чтобы потом отловить его в моем хуке? Именно в моем. Мне кажется что последний параметр - Code служит для идентификации, однако это пока лишь догадки, которые не получается реализовать на практике - я до сих пор не в курсе на что конкретно мне поставить хук и как послать именно моему приложению (notepad.exe в данном случае)мессагу. Можно броадкастом, можно хоть как... Важно чтобы отловило мое и отработало, не срабатывая на какие-то левые сообщения.

Всего записей: 56 | Зарегистр. 29-01-2004 | Отправлено: 08:38 17-03-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
surfer10

Цитата:
Рихтера не штудировал, а попросил помощи у сведующих людей, чтобы они подсказали путь решения конкретной проблемы.  

Я с хороших побуждений послал тебя к нему...  Тем более есть на русском языке...  
85% вопросов снимет сразу...

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 08:48 17-03-2004
surfer10

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Я с хороших побуждений послал тебя к нему...   Тем более есть на русском языке...  
85% вопросов снимет сразу...  

У него есть масса книг, ссылкой на ту, которую имеешь ввиду не поделишься?..
 
И усе равно, хотелось бы помощи по конкретно этому вопросу - пока не нашел рихтера и не прочитал его.

Всего записей: 56 | Зарегистр. 29-01-2004 | Отправлено: 09:13 17-03-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
surfer10

Цитата:
У него есть масса книг, ссылкой на ту, которую имеешь ввиду не поделишься?..

Почему же поделюсь?
Рихтер. Создание эффективных WIN32-приложений
с учетом специфики 64-разрядной версии Windows. - Рус.
: _http://alexsoft.home.nov.ru/download/prog  
 .3Мб в .chm.  
...пример отдельно есть...
Успеха!

----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 09:51 17-03-2004
surfer10

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Рихтер. Создание эффективных WIN32-приложений  
с учетом специфики 64-разрядной версии Windows. - Рус.:  

 
За ссылку спасибо, тем кто серьезно увлекается winAPI очень подойдет.
 
Сидел курил Рихтера... 26 глава - посылка оконных сообщений... Ничео по своему вопросу так и не нашел
 
22 глава - внедрение хуков... Тоже самое. Расказываются базисы плюс внутреннее управление хуками - куда кто стучится при установке хука, адресные пространства при хуках и прочее.. ((((((
 
Про типы сообщений - ни-ни. (((((((

Всего записей: 56 | Зарегистр. 29-01-2004 | Отправлено: 07:09 18-03-2004
speakerr



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
surfer10

Цитата:
Подскажите пожалуйста какой поставить хук на запущенную нами программу, чтобы послать собщение и активировать его?  

 
если честно, я не до конца тебя понял... про "запускаемое приложение - не мое" и "выполнить код от имени запускаемого процесса"... потому как речь вроде идет о "хуке" на "запущенную нами программу"... ладно, может нижеприведенное все-таки поможет...
 
сделай пустую форму в delphi, положи туда Button1: TButton; и Memo1: TMemo;
вставь мой код, построй, запусти несколько копий программы и тискай кнопочки. увидишь как они будут обмениваться уникальными зарегистрированными сообщениями... что еще для счастья нужно?
 

Код:
 
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure DefaultHandler(var Message); override;
  end;
 
var
  Form1: TForm1;
  // имя собственного уникального сообщения
  sMYMESSAGE   : string =('MyUnMessage');
  RM_MYMESSAGE : dword;
 
implementation
 
{$R *.dfm}
{==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--}
procedure TForm1.FormCreate(Sender: TObject);
begin
  // регистрируем сообщение
  RM_MYMESSAGE := RegisterWindowMessage(PChar(sMYMESSAGE));
  // исключительно из чистого любопытства посмотрим его код
  Memo1.Lines.Add(Format('RM_MYMESSAGE = %6d', [RM_MYMESSAGE]));
end;
{==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--}
procedure TForm1.DefaultHandler(var Message);
begin
with TMessage(Message) do begin
  if (Msg = RM_MYMESSAGE) then
  begin
    // пришло сообщение, которое мы ждем
    // здесь и делаем что-нибудь полезное и нужное...
    Memo1.Lines.Add('ура! пришло сообщение RM_MYMESSAGE');
  end
  else
    inherited DefaultHandler(Message);
end;
end;
{==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--}
// послать сообщение
procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(HWND_BROADCAST, RM_MYMESSAGE, 0, 0);
end;
{==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--}
end.
 


Всего записей: 423 | Зарегистр. 09-02-2004 | Отправлено: 17:51 18-03-2004
ollv

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
 CreateRomouteThread  не спасет отца русской демократии ... ? Внедрение кода идет по WriteProcessMemory... но это в целях работы в адресном просстранстве другого процесса с необязательной работой процесса иньетора, и после его выгрузки ...  //
Простой же hook будет сниматься после выгрузки иньектора.., вот,  
А внедрение идет с помощью установки хука на поток и потом посылки сообщения на ID потока ...  
 кароче нужны буут исходники пишите на ПМ .. пашел я работать ...

Всего записей: 165 | Зарегистр. 25-12-2003 | Отправлено: 17:57 18-03-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
CreateRomouteThread  не спасет отца русской демократии ...

А про это никто не говорил. Тем более, что для того чтобы это сделать надо иметь права на дебаг процесса, то есть быть админом (хотя также никто и не говорил, что чел не имеет этих прав). А создать свой поток в другом процессе можно и без этого. По крайней мере в Вынь 9х где этой функции нет, зато есть просто CreateThread. Там я вешал хук на на главный поток процесса (н-р проводника), потом вызывал из процедуры хука загрузку либы в этой либе делал CreateThread и все в чужом процессе живет мой поток с моим кодом. Причем после завершения хука поток замечательно живет.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:04 19-03-2004
surfer10

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Охохонюшки (( В общем вот код программы dll
 
Цель - выполнить сетевую активность от другого приложения для тестирования firewall на предмет утечки.
 

Код:
 
 
Library HookDLL;
 
Uses
  Windows, Messages, SysUtils, NMFTP,Psock, Dialogs;
 
Type
  PShareInf = ^TShareInf;
  TShareInf = Record
                AppWndHandle: HWND;
                OldHookHandle: HHOOK;
                hm:THandle;
                Message_:Integer;
              End;
 
Var
  MapHandle: THandle = 0;
  ShareInf: PShareInf = nil;
  ptr:PByteArray;
  FM_MYMESSAGE: Integer;
 
Procedure DLLEntryPoint(dwReason: DWORD); stdcall;
Begin
  Case dwReason Of
    DLL_PROCESS_ATTACH:
      Begin
        MapHandle:=CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TShareInf), GlobMapID);
        ShareInf:=MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TShareInf));
      End;
    DLL_PROCESS_DETACH:
      Begin
        UnMapViewOfFile(ShareInf);
        CloseHandle(MapHandle);
      End
  End;
End;
 
Function KeyboardHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
var
TNM:TNMFTP;
Begin
// это хук, который вызывается при посылки сообщения
MessageBeep(MB_ICONASTERISK); //говорим, что сообщение получено.
 
If (Code=100) then
// это условие должно отличать наше сообщение от не нашего. Code указывается в SendMessage
    Begin
        TNM:=TNMFTP.Create(nil);
        TNM.Host:='ftp.microsoft.com';
        TNM.Port:=21;
        TNM.UserID:='Anonymous';
        TNM.Password:='anonymous@b.com';
        TNM.Connect;
        TNM.Destroy;
//      SendMessage(ShareInf^.AppWndHandle, WM_USER, ParamW, Code);
    End;
 
  Result := CallNextHookEx(ShareInf^.OldHookHandle, Code, ParamW, ParamL)
End;
 
Function SetKeyboardHook(Wnd: HWND; dwProcId: DWORD): BOOL; stdcall;
Begin
 
  If ShareInf<>Nil Then
    Begin
      ShareInf^.message_:=RegisterWindowMessage('MyMessageToAll');
      ShareInf^.AppWndHandle:=Wnd;
      ShareInf^.OldHookHandle:=SetWindowsHookEx(WH_CALLWNDPROCRET, @KeyboardHook, HInstance, dwProcId);  
 
{тут (выше) поставили хук. На какой из фильтров

  • Фильтр WH_CALLWNDPROC и WH_CALLWNDPROCRET
  • Фильтр WH_CBT
  • Фильтр WH_DEBUG
  • Фильтр WH_FOREGROUNDIDLE
  • Фильтр WH_GETMESSAGE
  • Фильтр WH_JOURNALPLAYBACK
  • Фильтр WH_JOURNALRECORD
  • Фильтр WH_KEYBOARD
  • Фильтр WH_MOUSE
  • Фильтры WH_MSGFILTER и WH_SYSMSGFILTER
  • Фильтр WH_SHELL

его правильнее поставить?
}
 
      Result:=ShareInf^.OldHookHandle<>0;
    End
  Else Result:=False
End;
 
Function RemoveKeyboardHook: BOOL; stdcall;
Begin
  Result := UnhookWindowsHookEx(ShareInf^.OldHookHandle);
  CloseHandle(ShareInf^.hm);
End;
 
Exports
  SetKeyboardHook, RemoveKeyboardHook;
 
BEGIN
  If DLLProc = Nil Then DLLProc := @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
END.
 
 

 
Это была dll. теперь приложение:
 

Код:
 
 
различные переменные
 
.........
var
si:TStartupInfo;
pi:TProcessInformation;
.........
 
IMPLEMENTATION
 
Function SetKeyboardHook(Wnd: HWND;dwProcId:DWORD): BOOL; stdcall; external 'HookDLL.dll' name 'SetKeyboardHook';
Function RemoveKeyboardHook: BOOL; stdcall; external 'HookDLL.dll' name 'RemoveKeyboardHook';
 
процедура запуска приложения
 
procedure TMainForm.Button1Click(Sender: TObject);
begin
     FillChar(si,SizeOf(si),0);
     with si do begin
          cb := SizeOf(si);
          dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
          wShowWindow := SW_SHOWNORMAL;
     end;
     CreateProcess(nil,Pchar('notepad.exe'),nil,nil,False,0,nil,nil,si,pi);
end;
 
процедура установки хука
 
Procedure TMainForm.BitBtn1Click(Sender: TObject);
Begin
  If NOT SetKeyboardHook(Handle,pi.dwThreadId) Then
    MessageBox(Handle, 'Unable to set hook', PChar(Application.Title), MB_OK OR MB_ICONHAND);
End;
 
процедура посылки сообщения окну
 
procedure TMainForm.Button2Click(Sender: TObject);
var
RM_MYMESSAGE : dword;
h:HWND;
begin
RM_MYMESSAGE:=RegisterWindowMessage(PChar('asdfg'));
SendMessage(HWND_BROADCAST, RM_MYMESSAGE, 0, 0);
end;
 
 

 
форма с несколькими кнопками нажимаемыми по очереди. Вначале запускаем приложение, потом ставим хук потом пытаемся послать комманду. Цель - чтобы по нажатию кнопки блокнот пикал стандартным звуком прописанным в хуке. Идеальная цель, чтобы он пикал только по нажатию кнопки, а не по любому сообщению, подходящему для поставленного типа фильтра.
 
 
Добавлено
speakerr
 

Цитата:
сделай пустую форму в delphi, положи туда Button1: TButton; и Memo1: TMemo;  
вставь мой код, построй, запусти несколько копий программы и тискай кнопочки. увидишь как они будут обмениваться уникальными зарегистрированными сообщениями... что еще для счастья нужно?

 
Для счастья нужно чтобы их получала процедура указанная в Setwindowshookex.

Всего записей: 56 | Зарегистр. 29-01-2004 | Отправлено: 08:23 19-03-2004
ollv

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата:
CreateRomouteThread  не спасет отца русской демократии ...
 
/*А про это никто не говорил. Тем более, что для того чтобы это сделать надо иметь права на дебаг процесса, то есть быть админом (хотя также никто и не говорил, что чел не имеет этих прав).*/  
   Инче подобного .., никакого дебага там не надо. Для того чтобы установить хук не надо админских прав, это делалось в открытои на время Guest-е все пишется как мама дорогая..,  
принцип прост после хука в процессе вызвавшем ловушку код переносится непосредственно в сам процесс и запускается с пом-ю CreateRemouteThread HANDLE процесса получается обычным OpenProcess правда с правами PROCESS_ALL_ACCESS для  
хотя по идее достаточно установить PROCESS_CREATE_THREAD для этого прав на дебаг не обязательно иметь.  Правда вот сервисные процессы на OpenProcess не ведутся.., хотя я точно не помню, но вроде как было что-то ..,  
 
Хотя не спорю .. практического применения я так пока и не нашел .. )) так игрушки одни ..,
 
  просто  я в этоя проге использовал несколько другой подход там вывод в список всех процессов с их потоками ... выбираешь поток и ставишь на его Id хук ..  
вот в общем  
/*
    for(int i = 0;i < ListBox2->Items->Count;i++)
    if(Form1->ListBox2->Selected[i])
    {
      LISTFORTHREAD *__lt =    __GetItemByNumber(ListBox2->Items->Count-(i+1),HeadThread);
      LISTFORPROCESS *__lp = __GetItemByID(__lt->lpThreadEntry->th32OwnerProcessID,
                                           HeadProcess);
 
      HHOOK HookIn = lpProcHookIn(WH_KEYBOARD,__lt->lpThreadEntry->th32ThreadID);
 
      PostThreadMessage(__lt->lpThreadEntry->th32ThreadID,WM_NULL,0,0);
      if(!HookIn)
        MessageBox(NULL,"NOT",IntToStr(i).c_str(),MB_OK);
    }
*/ да в общем могу кинуть весь по необходимости .., это еще в билдере писано ..,  
блин щас билдера под рукой нет, а то пробовать бы начал . уже забыл .. а ладно, не помню по ентому и говорить не буду.., )) но то, что под гуестом и запускалось этт точно ))
 
/*
 А создать свой поток в другом процессе можно и без этого. По крайней мере в Вынь 9х где этой функции нет, зато есть просто CreateThread. Там я вешал хук на на главный поток процесса (н-р проводника), потом вызывал из процедуры хука загрузку либы в этой либе делал CreateThread и все в чужом процессе живет мой поток с моим кодом. Причем после завершения хука поток замечательно живет.*/
  Это все по глюкавости 9Ху происходит, я там и без CreateThread процесс оставлял в памяти , причем в двух видах когда не видно по системному снапшоту и когда видно, но TerminateProcess на нем не отрабатывает ..,   в 95 код должен быть другой.., но тоже работало...  

Всего записей: 165 | Зарегистр. 25-12-2003 | Отправлено: 22:59 19-03-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 Инче подобного .., никакого дебага там не надо. Для того чтобы установить хук не надо админских прав, это делалось в открытои на время Guest-е все пишется как мама дорогая..,  

Ты контекст читай подробнее. Это сказано для CreateRemoteThread.

Цитата:
 
принцип прост после хука в процессе вызвавшем ловушку код переносится непосредственно в сам процесс и запускается с пом-ю CreateRemouteThread  

А вот здесь для чего нужен Remote? Хотя CreateThread под Вынь НТ реализован через Remote но это не значит что его надо вызывать в чистом виде Можно просто CrerateThread. Но это мы отошли от темы.  

Цитата:
 Это все по глюкавости 9Ху происходит, я там и без CreateThread процесс оставлял в памяти , причем в двух видах когда не видно по системному снапшоту и когда видно, но TerminateProcess на нем не отрабатывает ..,

А вот исходничками не поделишся (только из интереса, так как кодинг под 9х я забросил оставляю только совместимоть)

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:46 22-03-2004
ollv

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
/*LRESULT CALLBACK __stHookNP(int Code,WPARAM wPar,LPARAM lPar)
{
   CurrentDirectory = GetCurrentDir();
   char *ModName = new char[MAX_PATH];
   GetModuleFileName(__dllINST,ModName,MAX_PATH);
   //MessageBox(NULL,ModName,CurrentDirectory.c_str(),MB_OK);
 
   DWORD oldProtect;
   DWORD ThrdId,lpbCodeSize = 0,dwNumBytesXferred;
   if(hThrd)__asm  jmp cll
   INJECTLIB *InjectLib = new INJECTLIB;
   bool __fok = FALSE;
   HINSTANCE hKrnl = GetModuleHandle(__TEXT("Kernel32"));
   HINSTANCE hUserdll = GetModuleHandle(__TEXT("user32"));
   if((!hUserdll)||(hKrnl==NULL)){
                MessageBox(NULL,"Error user23.dll load","Error",MB_OK);
                __asm  jmp  cll
   }
   InjectLib->lpLoadLibrary =(void*(__stdcall*)(char*)) GetProcAddress(hKrnl,"LoadLibraryA");
   InjectLib->lpTerminateProcess =(int(__stdcall*)(HANDLE,UINT)) GetProcAddress(hKrnl,"TerminateProcess");
   InjectLib->lpGetCurrentProcess =(void*(__stdcall*)()) GetProcAddress(hKrnl,"GetCurrentProcess");
   strcpy(InjectLib->lpLibraryName,ModName);
   strcpy(InjectLib->lpProcName,"MessageBoxA");
   InjectLib->lpMessageBox = (int(__stdcall*)(void*,const char*,const char*,unsigned int))GetProcAddress(hUserdll,
                                                                      "MessageBoxA");
   if((InjectLib->lpLoadLibrary==NULL)||
      (InjectLib->lpMessageBox==NULL))
      //(!InjectLib->lpGetCurrentProcess))
    {
      MessageBox(NULL,"Error loadlib 1","Error",MB_ICONSTOP);
      __asm  jmp cll
    }
   InjectLib->lpGetProcAddress =(void*(__stdcall*)(void*,char*)) GetProcAddress(hKrnl,"GetProcAddress");
   if(!InjectLib->lpGetProcAddress)
    {
      MessageBox(NULL,"Error loadlib 2","Error",MB_ICONSTOP);
      //__asm  jmp cll
    }
   InjectLib->lpFreeLibrary =(FREELIBRARY)GetProcAddress(hKrnl,"FreeLibrary");
   if(!InjectLib->lpFreeLibrary)
   {
      MessageBox(NULL,"Error loadlib 3","Error",MB_ICONSTOP);
      __asm  jmp cll
   }
   HANDLE hCurrentProcess = GetCurrentProcess();
   lpbCodeSize = ((PBYTE)(DWORD)__AfterThread - (PBYTE)(DWORD)__np);
   DWORD lpbCodeMem = lpbCodeSize + sizeof(INJECTLIB) + 10;
   VOID *lpvCode = NULL;
   //For example
   //lpvCode = AllocProcessMemory(GetCurrentProcess(),lpbCodeMem + 3);
   try
   {
      HGLOBAL __hg = GlobalAlloc(GMEM_FIXED,lpbCodeMem);
      VOID *lpvCode1 = GlobalLock(__hg);
            lpvCode = VirtualAllocEx(hCurrentProcess,lpvCode1,lpbCodeMem,MEM_COMMIT,
                                     PAGE_EXECUTE_READWRITE);
   }
   catch(...)
   {MessageBox(NULL,"Error memory 11","Error",MB_OK);}
   if(!lpvCode)MessageBox(NULL,"Error memory","Error",MB_OK);
   __fok = VirtualProtectEx(hCurrentProcess,lpvCode,
                            lpbCodeMem,PAGE_EXECUTE_READWRITE,
                            &oldProtect);
   if(!__fok){
              MessageBox(NULL,"Error protect memory","Error",MB_OK);
             }
   __fok = WriteProcessMemory(hCurrentProcess,lpvCode,
                              (LPVOID)(DWORD)__np,lpbCodeSize,&dwNumBytesXferred);
   if(!__fok){
              MessageBox(NULL,"Error write code","Error",MB_OK|MB_ICONSTOP);
              TerminateProcess(hCurrentProcess,-9);
             }
   __fok = WriteProcessMemory(hCurrentProcess,(void*)(DWORD(lpvCode)+(lpbCodeSize + 4)&~3),
                             (LPVOID)InjectLib,sizeof(INJECTLIB)+2,&dwNumBytesXferred);
   if(!__fok){
              MessageBox(NULL,"Error write date","Error",MB_OK|MB_ICONSTOP);
              TerminateProcess(hCurrentProcess,-9);
             }
           hThrd = CreateRemoteThread(hCurrentProcess,NULL,0,(LPTHREAD_START_ROUTINE)lpvCode,
                                InjectLib,0,&ThrdId);
           //TerminateProcess(OwnerProcess,-9);
           DWORD *tid;
   __asm  cll:
   FreeLibrary(hKrnl);
   FreeLibrary(hUserdll);
   CallNextHookEx(Hook,Code,wPar,lPar);
}*/
 
 Здесь идет inject кода потока в другой процесс,.. дык создание потока идет с помощью сам видишь ))) Это код ловушки, дык там как известно GetCurrentProcess дает хандл процесса вызвавшего ловушку .. да в общем суть понятна ... тонкости я уже не помню .. ((  
а надо передавать структуру с адресами ф-ций, ну как минимум LoadLibrary .. и GetProcAddress... т.к. эти адреса не известны инжектору )) ..  
 Это, я по моему, модернизировал чей-то пример по внедрению кода, пихнул в ловушку и собсно заработало ..,  да мало ли их этих примеров..,  
 
/* А вот исходничками не поделишся (только из интереса, так как кодинг под 9х я забросил оставляю только совместимоть)*/
  Ок.. дома копну .., только помню код разный для VC и Buildera (адреса на ф-ции .. ) , и еще как я подозреваю зависит от версии винды.., код короткий .. и думаю ничего интересного в нем нет .., в общем выложу .., посмотришь ..  
 
Добавлено
о чет накопал вроде из того  
/*
// nPRJ.cpp : Defines the entry point for the application.
//
 
#include "stdafx.h"
HHOOK Hook;
void __stWindowsHookEx(int Code,WPARAM wPar,LPARAM lPar)
{
MessageBox(NULL,"This proc hook","Message",MB_OK);
CallNextHookEx(Hook,Code,wPar,lPar);
}
void __stWindowsHookExSec(int Code,WPARAM wPar,LPARAM lPar)
{
MessageBox(NULL,"This proc hook sec","Message sec",MB_OK);
CallNextHookEx(Hook,Code,wPar,lPar);
}
 
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  // TODO: Place code here.
int Run = 0;
DWORD *ThreadId;
__asm
{
jmp RunThread
Thread:
push ebp
mov ebp , esp
}

Hook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)__stWindowsHookExSec,
0,0);
Run++;
__asm{
pop ebp
ret
RunThread:
//push ThreadId
push 0
push 0
push offset Thread
push 0
push 0
call dword ptr [CreateThread]
}
Hook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)__stWindowsHookEx,0,0);
while(Run <=2 ) __asm jmp RunThread;
// return 0;
}
*/
только я соврал CreateThread там все же есть ...,  компилится в VC // для того, чтобы не было видно по ctrlaltdel  RegisterSrvice(s?)Process.. а TerminateProcess не срабатывает и процесс по снапшоту виден ..

Всего записей: 165 | Зарегистр. 25-12-2003 | Отправлено: 18:48 23-03-2004
JonnySilver



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
surfer10 ответ ищи в книге Рихтера - внедрение кода DLL в адресное пространство процесса. Там точно этот пример есть:  
 
См. пример 22 DIPS и DIPSLIB - управление размещением иконок на рабочем столе. DLL-ха внедряется в адресное пространство рабочего стола и сохраняет-восстанавливает расположение иконок.

Всего записей: 151 | Зарегистр. 03-09-2003 | Отправлено: 11:17 20-05-2004
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Поставить уникальный hook'и отловить сообщение winAPI,De


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru