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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глобальный хук... как реализовать 
V
    Опции темы
tigger
Дата 7.2.2007, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

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



Вообщем проблема в следующем.
Создаю программу на отлов открытия окон сторонними программами.
Прога состоит из двух модулей, сама программа и dll.

Отлавливаемых программ может быть несколько.

Так вот в своем приложении беру id процесса сторонней программы которую хочу контролировать на открытие окон, передаю этот id себе в dll и все работает как часы.

Но вот вопрос если отлавливаемых программ несколько 2 и более т.е будет несколько id процессов как осуществить передачу их в dll и следовательно отлов их окон.



--------------------
user posted image
PM MAIL   Вверх
MetalFan
Дата 7.2.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



так же, как и при передаче одного id.
в чем собстно проблема то? как передать данные?



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
tigger
Дата 8.2.2007, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

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



Да проблема при передаче 2 или более id.
У меня в приложении процедура которая стартует хук равна

procedure StartHook(id:THandle)

которая выполняется при нажатии на кнопку. А если процессов много как она будет выглядеть?


--------------------
user posted image
PM MAIL   Вверх
dumb
Дата 8.2.2007, 05:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



тут два варианта: либо просто вызываешь эту же процедуру для новых id, либо делаешь по-настоящему глобальный хук - т.е. не указываешь tid, а разбор полетов делаешь в функции хука.
PM MAIL   Вверх
MetalFan
Дата 8.2.2007, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



tigger, как-как) а пофантазировать?! я же написал, пользуй array [0..0] of....
RangeChecking обязательно должен быть отключен!!!
Код

type
  PPIDS = ^TPIDs;
  TPIDs = array [0..0] of dword;
var
  lPIDs: PPIDs;
  lCount: Integer;
  i: Integer;
  lTxt: array[0..1024] of Char;
begin
  //допустим надо передать 4 элемента.
  lCount := 4;
  //4 байта, или можно написать SizeOf(DWORD)
  GetMem( lPIDs, lCount*4 );

  // "счетчик". делфи не дает напрямую по индексу обращаться к >0 элементам такого массива
  i := 0;
  //присваяеваем нужные значения. можно в цикле
  //____обязательно отключить RangeCheking____!!!!
  {$R-}
  lPIDs^[i] := 1;
  Inc(i);
  lPIDs^[i] := 2;
  Inc(i);
  lPIDs^[i] := 4;
  Inc(i);
  lPIDs^[i] := 8;
  //все, отдаешь Size и lPIDs куда надо...
  //SetHook( lPIDs, lCount*4 );
  FreeMem( lPIDs, lCount*4);

как "принять", разберешься?
учти, тебе еще в ловушку в других процессах нужно эти данные передать, через MMF например.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
tigger
Дата 8.2.2007, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

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



MetalFan, очень ценную информацию дал.

А как потом раскидать их по MMF по отдельным файлам.
В один lPIDs а в другой размер массива, я что-то делал ошибка вылетает на функции фильтре.
 smile 


Это сообщение отредактировал(а) tigger - 8.2.2007, 19:14


--------------------
user posted image
PM MAIL   Вверх
MetalFan
Дата 8.2.2007, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(tigger @  8.2.2007,  19:14 Найти цитируемый пост)
А как потом раскидать их по MMF по отдельным файлам

создается именованный MMF в приложении установившем хук, а остальные только читают.
ты представляешь себе, как глобальные хуки вообще "фунцыклируют"?
когда устанавливаешь глобальную ловушку, библиотека, содержащая функцию-фильтр проецируется во все процессы в системе...
таким образом все специфические для процесса данные такие, как всяческие хэндлы (MMF, окон и проч.объектов системы) становятся непоределенными. Глобальные переменные содержат мусор и проч...
значит в момент "присоединения" библиотеки к процессу тебе нужно получить все необходимые данные из созданного ранее при инициализации ловушки MMF.

Цитата(tigger @  8.2.2007,  19:14 Найти цитируемый пост)
я что-то делал ошибка вылетает на функции фильтре

показывай, что делал ;)

з.ы. могу конечно пример дать, хотя в принципе в сети они есть. остается только найти и адаптировать под свои нужды ;)
да и хотелось бы чтоб сам разобрался большей частью... а я только направление могу дать и ошибки помочь подправить.


Это сообщение отредактировал(а) MetalFan - 8.2.2007, 20:03


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
tigger
Дата 9.2.2007, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

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



Вообщем что я написал
В приложении.

Код

  type
  Process_id = ^T_Id;
  T_Id = array [0..0] of THandle;
  
  pcount = ^count;
  count = integer;

var
  Hide_Process : Process_id;
  leng :pcount;

//наполняю переменные Hide_Process 
//и leng тут ошибок нет

//и вызываю функцию в dll

    StartHooks(Hide_Process, leng);



теперь что имеем в dll

Код

type
  Process_id = ^T_Id;
  T_Id = array [0..0] of THandle;
  pcount = ^count;
  count = integer;

  Hide_id:Process_id;
  length : pcount;

procedure StartHooks(P:Process_id; count:pcount);
begin
  hMemFile1 := CreateFileMapping($FFFFFFFF, // $FFFFFFFF gets a page memory file
      nil,                                   // no security attributes
      PAGE_READWRITE,          // read/write access
      0,                                     // size: high 32-bits
      SizeOf(integer),               // size: low 32-bits
      'Glob');

             length := MapViewOfFile(hMemFile1, FILE_MAP_WRITE, 0, 0, 0);
             length := count;


  hMemFile := CreateFileMapping($FFFFFFFF, // $FFFFFFFF gets a page memory file
      nil,                     // no security attributes
      PAGE_READWRITE,          // read/write access
      0,                       // size: high 32-bits
      length^*SizeOf(THandle),   // size: low 32-bits
      'Global7v9k');

           Hide_id := MapViewOfFile(hMemFile, FILE_MAP_WRITE, 0, 0, 0);


       {$R-}
       
           for i := 0 to length^ - 1 do
           begin
             Hide_id^[i] := P^[i];
           end;

                        CBT_hook:= SetWindowsHookEx(WH_CBT, @hook, hInstance, 0);
                        if CBT_hook = 0 then begin
                           messagebox(0,'hmmm..','ERROR',mb_iconhand);
                           Exit;
                        end;// else

end;
//здесь ошибок нет все приходит

//в функции фильтре данных нет

function hook(c0de:integer; wParam: word; lParam : longint): Lresult; stdcall;
var
begin
          hMemFile1  := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, 'Glob');
          length := MapViewOfFile(hMemFile1, FILE_MAP_ALL_ACCESS, 0, 0, Sizeof(integer));

          if hMemFile1 = 0 then messagebox(0,'Ошибка','Ошибка',mb_ok);
          

          hMemFile  := OpenFileMapping(FILE_MAP_WRITE, False, 'Global7v9k');
          Hide_id := MapViewOfFile(hMemFile, FILE_MAP_WRITE, 0, 0, length^*Sizeof(THandle));

                GetWindowThreadProcessId(wParam, pProcID);
//далее мой код
end;

так вот в функции фильтре hook нет hMemFile1, length, hMemFile, Hide_id равны нулю
что не так делаю ли как можно это победить?




--------------------
user posted image
PM MAIL   Вверх
MetalFan
Дата 9.2.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



да, ошибочки есть...да и некоторые места я бы по-другому написал.
явные ошибки (если я сам не ошибаюсь ;) ):
1) 
Цитата
//наполняю переменные Hide_Process 
//и leng тут ошибок нет

ну это ты так думаешь ;) давай код
2) После MapViewOfFile и "отправки" данных надо вызывать UnMapViewOfFile...

замечания:
1) зачем создавать 2!!! MMF? не проще ли отдать все за один раз в одной структуре?
2) зачем каждый раз в функции-ловушке открывать/считывать данные?
достаточно один раз считать, имхо. либо при "подгрузке" длл (см DLLProc), либо при первом вызове ф-ции-ловушки.
3) для "копирования" кусков памяти лучче имхо юзать Move

или давай так) приложи аттачем файлы этого проекта. я поправлю. и тоже приаттачу.
а то влом Ctrl+C/Ctrl+V жать много раз)

Это сообщение отредактировал(а) MetalFan - 9.2.2007, 15:15


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
tigger
Дата 9.2.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

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



Знаешь явную ошибку здесь нашел это length := count; надо было так length^ := count^; а насчет всех твоих советов я попробую если не пойдет приложу, а то так обучения нет забудется скоро.




--------------------
user posted image
PM MAIL   Вверх
tigger
Дата 19.2.2007, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

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



MetalFan, посмотри код там приложение с dll и тестовое приложение которое нужно словить, но что-то не идет. В чем проблема.

Присоединённый файл ( Кол-во скачиваний: 23 )
Присоединённый файл  hook2.rar 87,47 Kb


--------------------
user posted image
PM MAIL   Вверх
MetalFan
Дата 19.2.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(tigger @  19.2.2007,  15:52 Найти цитируемый пост)
но что-то не идет

а вот здесь пжалуста по подробнее ;)
з.ы. + посмотрю попозже аттач


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
dumb
Дата 19.2.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



ух. сильно все перепутано...

примерная схема:

хост-приложение:
Код

 hdll = LoadLibrary
 сбор нужных pid'ов
 CreateFileMapping
 MapViewOfFile
 запись pid'ов в mmf
 // dll_cbt_hook внеси в экспорт dll. в данной схеме достаточно только ее
 hook = SetWindowsHookEx(WH_CBT, @dll_cbt_hook, hdll, 0)


dll:
Код

var
 our_pid: boolean;

dll_cbt_hook:
 // кстати, первый параметр в CallNextHookEx игнорируется,
 // посему не нужно его "таскать" везде, а просто ставить 0.
 if not our_pid then result = CallNextHookEx; exit;
 работа...

Dll_Process_Attach:
 our_pid = false
 hMapFile = OpenFileMapping
 if hMapFile = 0 exit;
 pids = MapViewOfFile
 cpid = GetCurrentProcessId
 идем по массиву и ищем cpid, если нашли - our_pid = true
 UnmapViewOfFile(pids)
 CloseHandle(hMapFile)


ps. 
Цитата(tigger @  19.2.2007,  15:52 Найти цитируемый пост)
Application.MessageBox('В Demo версии можно скрывать не более 2-х процессов!','Внимание!',mb_ok);

smile

PM MAIL   Вверх
MetalFan
Дата 19.2.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



dumb, опередил) да уж, код не блещет наглядностью
з.ы. ошибка как минимум в том, что не сделано UnmapViewOfFile

Это сообщение отредактировал(а) MetalFan - 19.2.2007, 17:18


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
tigger
Дата 20.2.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

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



dumb, по подробнее можно.


--------------------
user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1099 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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