Хуки. Локальные и глобальные.

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Хуки. Локальные и глобальные.

Сообщение Leonius_Bad » 21.02.2016 20:00:45

Здравствуйте. Решил поковырять хуки. В процессе "ковыряния" появилось как минимум два набора( :D ) вопросов.
Оба хука на перехват нажатия клавиш. DLL использую впервые.

1. Хук глобальный.
Делаю так.
DLL:
Код: Выделить всё
function KeyBoardHook(code:integer; wparam:wparam; lparam:lparam):Lresult; stdcall; export;
begin
beep(2000,15);
result:=CallNextHookEx(HINSTANCE,code,wParam,lparam);
end;

В исполняемом:
Код: Выделить всё
descDLL:=LoadLibrary('keyboardhook.dll');
descFunc:=HOOKPROC(GetProcAddress(descDLL, 'KeyBoardHook'));

descHook:=SetWindowsHookEx(WH_KEYBOARD, descFunc, descDLL,0);
s:='1';
while  s<>'0' do begin
  readln(s);
end;

UnhookWindowsHookEx(descHook);


И тут, как не странно, всё заработало. Бикает при нажатии клавиш в любом месте. Правда бикает как-то чрезмерно долго...но бикает же!=)

Вопросы:
1. Почему для глобального процедура обработки обязана быть в dll?
2. Как в dll получить дескриптор текущей хуки для передачи в CallNextHookEx? HINSTANCE совершенно точно не то. Если не ошибаюсь - то есть дескриптор текущего модуля, а функция требует именно хуку..
3. Возможно, вопрос еще тупей первого, но всё же.. Как, например, посчитать кол-во сработанных ловушек, если параметры функции-обработки статичны и вызывается она из библиотеки?

2. Хук локальный.
Код: Выделить всё
function KeyBoardHook(code:integer; wparam:wparam; lparam:lparam):Lresult; stdcall;
begin
Windows.Beep(100,100);
writeln('YES');
result:=CallNextHookEx(descHook,code,wParam,lparam);
end;

begin

descHook:=SetWindowsHookEx(WH_KEYBOARD, @KeyBoardHook, 0,GetCurrentThreadID());
s:='1';
while  s<>'0' do begin
  readln(s);
end;

UnhookWindowsHookEx(descHook);
end.


Казалось, что оно должно быть проще, но...скомпилировалось а не заработало. При этом функция установки возвращает значение, отличное от нуля, следовательно хук вроде как поставился.
Вопрос пока только один:
Почему не работает? Вообще никакой реакции при вводе в приложении. Никакого тебе бипа...ничего :( Пробовал хук мыши - тоже самое: ноль реакций, фон презрения...

Добавлено спустя 15 часов 14 минут 44 секунды:
Плюс вопрос к глобальным.

Отчего-то срабатывают ловушки на клавиши лишь у открытых до старта хука программ. Если открыть новую и там хоть что-то вжать - все виснет:(

Добавлено спустя 1 час 32 минуты 25 секунд:
А нет. Это просто в некоторых, преимущественно системных, приложениях хук вызывает вылет..
Leonius_Bad
новенький
 
Сообщения: 51
Зарегистрирован: 29.11.2012 19:18:07

Re: Хуки. Локальные и глобальные.

Сообщение MysticCoder » 24.02.2016 00:11:04

по глобальным:
1) ты ставишь свою функцию как хук, как должна другая программа при нажатии клавиши запустить эту функцию? очевидно, что как то спроецировать код этой функции себе в память, это делается как раз загрузкой твоей dll в адресное пространство чужой программы, это делает SetWindowsHookEx.
2) чужие программы при установке хука загружают твою dll, у каждой своя копия этой dll, поэтому id ловушки через установку глобальной переменной в коде dll передать не получится, просто потому, что и глобальные переменные получаются у каждого свои. Это неправильный путь, который почему то довольно часто используется в статьях, и их код не работает. Правильный путь - передать через какую нибудь расшаренную память. Если не заморачиваться, то записать в файл, а в коде хука считать из этого файла. Можно записать этот id в Extra(или User) память твоего окна, через SetWindowLong,в хуке найти окно через FindWindow и считать через GetWindowLong. Можно создать именованную расшаренную память и использовать её. Если хочется поизвращаться, то можно передать через сетевые сокеты\сайт в интернете\дядю почтальона. Способов много.
3) на мой взгляд лучше всего в приложении устанавливающем хук создать окно-менеджер, которое будет слушать оконные сообщения и обрабатывать поступающую информацию, а в хуке при срабатывании просто слать сообщения этому окну. Тогда записью в файл лога, допустим, будет заведовать только твое главное приложение. Ну и, соответственно, количество или чего там тебе надо обрабатываются\считаются через сообщения. Речь о SendMessage\PostMessage GetMessage\PeekMessage.

по локальным:
ловушка установлена правильно, ты удивишься, но она работает. ты устанавливаешь хук на свой собственный тред и потом зацикливаешь его без принятия сообщений. тред не принимает сообщений и соответственно хуку не на что срабатывать - он срабатывает когда сообщение принимается.
Можно модифицировать код, к примеру, так и все заработвет:
Код: Выделить всё
uses messages;
...
var
  Msg : TMsg;
...
while  s<>'0' do
begin
  if PeekMessage(Msg, 0 , 0, PM_REMOVE) then
     begin
       TranslateMessage(Msg);
       DispatchMessage(Msg);
     end;
  readln(s);
end;


Сам не тестил, но должно заработать.
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: Хуки. Локальные и глобальные.

Сообщение Leonius_Bad » 26.02.2016 17:58:03

MysticCoder, огромное спасибо! Уже и не надеялся на ответ)

По глобальным:
1. Тут всё понял=)

2. С расшаренной памятью пока работать не доводилось. Буду копать на эту тему, хотя вариант с файлами мне понравился больше)
Вообще, уже сделал вот так прямо в dll:
Код: Выделить всё
function HookInst():boolean; 
begin
CurHook:=SetWindowsHookEx(WH_KEYBOARD, @KeyBoardHook, HINSTANCE,0);
if (CurHook<>0) then result:=true else result:=false;
end;

А из программы эту функцию вызываю. В хуке использую CurHook, при удалении ловушки вызываю подобную же функцию из dll (которая тоже пользует CurHook для удаления). Так можно делать? Вроде бы всё должно быть хорошо: в пределах одного экземпляра CurHook должен быть один (хотя в самом хуке пользую эту переменную в CallNextHookEx и там я насчет нее не уверен - см.пункт 3)..

2.1. В интернетах еще советуют для общения с длл использовать функции. Я так и поступил (возвращаю необходимые значения по удалению ловушки и т.д. Хотя при каждом срабатывание хука снова не выйдет ничего, только самый итог в конце..).

3. Тоже пока не сталкивался с сообщениями и окнами менеджерами. Взял для изучения.
Но тут еще один вопрос. Как менять значение переменной (глобал. переменная в dll) внутри хук функции? Пробовал на примере простой строки, во всей dll - всё ок, каждая функция присваивает свой кусок текста строке (в итоге смотрю, что получилось - этакий тест), но хук функция посылает нафиг. Где-то в интернетах нарывал, что дело опять таки в dll, мол хук функция есть функция из kernel32.dll и там свои области для переменных опять...
Выходит, что юзать даже глобальную переменную текущего экземпляра dll внутри хук-функции можно только методами, описанными Вами в пункте 2?
Для примера код, который в итоге не записывает в глобальную ts значение "hook!":
Код: Выделить всё
{dll}
var ts:string;
<...>
function KeyBoardHook(code:integer; wparam:wparam; lparam:lparam):Lresult; stdcall;
<...>
begin
ts:=ts+' hook!';
end;

В общем, тут либо опять через файлычто-то другое, либо я совсем запутался:(
ЗЫ: Пробовал через указатели на переменную, тоже не работало..


По локальным.
Вот такой код "бикать" так и не захотел:(
Код: Выделить всё
var
Msg: TMsg;
s:string;
descHook:HHOOK;

function KeyBoardHook(code:integer; wparam:wparam; lparam:lparam):Lresult; stdcall;
begin
sysutils.beep;
result:=CallNextHookEx(descHook,code,wParam,lparam);
end;

begin
descHook:=SetWindowsHookEx(WH_KEYBOARD, @KeyBoardHook, 0,GetCurrentThreadID());

s:='1';
while  s<>'0' do
begin
  if PeekMessage(Msg, 0 , 0, 0, PM_REMOVE) then //Исходя из описания, тут таки 3 нуля.
     begin
       TranslateMessage(Msg);
       DispatchMessage(Msg);
     end;
  readln(s);
end;

UnhookWindowsHookEx(descHook);
end.


Добавлено спустя 4 часа 7 минут 41 секунду:
В локальных пробовал GetMessage (как я понял, оно ожидает сообщение и только потом отдает управление) - виснет.
Следовательно, сообщение не доходит\не принимается?
Leonius_Bad
новенький
 
Сообщения: 51
Зарегистрирован: 29.11.2012 19:18:07

Re: Хуки. Локальные и глобальные.

Сообщение MysticCoder » 28.02.2016 00:12:31

2. твой вариант не рабочий, в силу пункта 2 из моего предыдущего сообщения. обьясняю на пальцах. твое приложение загружает твою длл и вызывает функцию function HookInst():boolean; которая в этой длл устанавливает переменной CurHook какое то значение, допустим 1234, в твоей длл в хуке эта переменная будет корректно передаваться в CallNextHookEx. когда исполняется SetWindowsHookEx, другие приложения с окнами тоже загружают твою длл, но загружают новые экземпляры, у них переменная CurHook в лучшем случае при этом становится равной 0, в итоге в хуке сработанном из их окон в CallNextHookEx будет передаваться 0 вместо 1234, что может привести к некорректному поведению, т.к. последующая цепочка ловушек оборвется, да и результат неясно какой будет. В твоем приложении же все будет хорошо отрабатывать. А вот в майкрософт офисе каком нить из за этого может перестать текст набираться вообще или перестанут работать хоткеи. То есть в контексте ловушек CurHook это глобальная переменная для одного приложения, и у каждого приложения она своя. а не для всей системы. Поэтому хук функция и посылает нафиг со строкой.

вот лови рабочий код:
в приложение устанавливающем хук, Handle - хэндл окна Form1:
Код: Выделить всё
....
var
  Form1: TForm1;
  hook : HHOOK;
implementation

{$R *.dfm}
var
  dll : Cardinal;

procedure TForm1.FormCreate(Sender: TObject);
var
  xProc : Pointer;
begin
  if dll = 0 then
    dll := LoadLibraryA('windebug.dll');                 // загружаем длл
  xProc := GetProcAddress(dll, 'HookProc');          // получаем адрес функции хука
  Hook := SetWindowsHookEx(WH_KEYBOARD, xProc, dll, 0);   // устанавливаем хук
  SetWindowLonga(Handle, GWL_USERDATA, Hook);                 // записываем в USERDATA окна значение переменной Hook
end;
...


в dll:
Код: Выделить всё
...
var
  Hook : HHook;

function HookProc(Code : integer; wPar: integer; lPar : integer) : integer; stdcall; export;
  ...
  Result := CallNextHookEx(hook, Code, wPar, lPar);
end;

procedure FindHook;
var
  xWin : HWND;
begin
  xWin := FindWindow('TForm1', 'Form1');                    // найдем окно приложения установившего хук, параметры - имя класса окна, название окна
  Hook := GetWindowLong(xWin, GWL_USERDATA);     // читаем то, что записано в USERDATA
end;

exports HookProc name 'HookProc';

begin           
  FindHook;       // при загрузке длл ищем хэндл ловушки
end.



по локальным.
у тебя ведь консольное приложение, значит окна нету, значит и сообщения принимать некому, поэтому и не срабатывает. консольное окно не в счет, оно по другому работает. надо создать окно какое нить. Так должно сработать:
Код: Выделить всё
var
Msg: TMsg;
s:string;
descHook:HHOOK;

function KeyBoardHook(code:integer; wparam:wparam; lparam:lparam):Lresult; stdcall;
begin
sysutils.beep;
result:=CallNextHookEx(descHook,code,wParam,lparam);
end;

begin
descHook:=SetWindowsHookEx(WH_KEYBOARD, @KeyBoardHook, 0,GetCurrentThreadID());

CreateWindow('EDIT', 'somename', WS_VISIBLE, 50, 50, 200, 60, 0, 0, hInstance, nil); // создаем эдит в левом верхнем углу, то что в нем напишем будет перехватываться хуком

while  GetAsyncKeyState(27) >= 0 do      // пока не нажата клавиша Escape
begin
  while PeekMessage(Msg, 0 , 0, 0, PM_REMOVE) do //Исходя из описания, тут таки 3 нуля.
     begin
       TranslateMessage(Msg);
       DispatchMessage(Msg);
     end;
    // Readln(s);                  // тут он не нужен
end;

UnhookWindowsHookEx(descHook);
end.


консоль не юзаем, readln в частности, т.к. он блокирует поток. в частности мы не сможем в эдит ничего записать, пока что нить не введем в консоль, т.к. обработка событий идет у нас выше, после Readln в следующей итерации цикла идет обработка сообщений(всех накопленных) и сразу опять Readln. так что эдит у нас будет как неактивным, если попытаемся его выделить и понажимать кнопки, то он не будет реагировать, после того как нажмем энтер в консоли, эдит перерисуется, текст в нем поменяется и сработает хук несколько раз, по числу нажатых клавиш. в теории. на практике просто закомментим ненужный Readln;
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: Хуки. Локальные и глобальные.

Сообщение Leonius_Bad » 01.03.2016 18:36:36

MysticCoder, спасибо. Вроде бы всё понятно. Хотя, конечно, надо еще поэкспериментировать.

MysticCoder писал(а):консольное окно не в счет, оно по другому работает

Из любопытства еще вопрос. А как, в таком случае, ловить клавитаруные хуки в консольном приложении? Или же там это просто не требуется и все делать средствами не АПИ функций (вроде readkey делает нечто подобное)?

Добавлено спустя 12 минут 40 секунд:
MysticCoder писал(а):в приложение устанавливающем хук, Handle - хэндл окна Form1:

Т.е., дескриптор ловушки будет одинаков для всех приложений, в каком бы ловушка не сработала?
Leonius_Bad
новенький
 
Сообщения: 51
Зарегистрирован: 29.11.2012 19:18:07

Re: Хуки. Локальные и глобальные.

Сообщение Leonius_Bad » 19.03.2016 17:12:18

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

Что-то связанное с приоритетом процессов? Эксперименты показали, что если приложение запущено от Админа - ловушка не захлопнется. Но ладно бы просто не срабатывала, а то ведь зависает намертво..
При этом в процедуре ловушки оставлял только CallNextHookEx(CurHook,code,wParam,lparam); (КурХук беру таки из файла, который создается программой-инициатором).

Добавлено спустя 9 минут 9 секунд:
Как обойти эти зависания и почему они происходят?:\
Leonius_Bad
новенький
 
Сообщения: 51
Зарегистрирован: 29.11.2012 19:18:07

Re: Хуки. Локальные и глобальные.

Сообщение MysticCoder » 20.03.2016 21:12:07

Приведи полный код dll. И код установки ловушки.
Можно еще код ловушки и инициализацию внутри dll(где курхук из файла берешь) обложить try except и при исключении выводить в лог или месседж бокс ошибку. Ну или отладить из под дельфей dllку, с хост приложением calc.exe.
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: Хуки. Локальные и глобальные.

Сообщение Leonius_Bad » 21.03.2016 17:26:00

MysticCoder писал(а):Приведи полный код dll. И код установки ловушки.

Вот исходники и скомпилированные файлы. https://yadi.sk/d/yEYsWJ-8qLQrV

Как выяснилось. Подобный косяк наблюдается только на моей Win 8.1 x64 и на win7 x 64 (эту проверил дважды на разных компах).
На winXP, win 7 x32 таких проблем нет.

С чем может быть связано? С разрядностью? Странная штука...

Добавлено спустя 9 минут 28 секунд:
Там в КэллНекст передается нолик, ибо некоторые статьи и товарищи вот отсюда http://www.cyberforum.ru/delphi-winapi/thread1689531.html меня убедили, что необязательно дескриптор отдавать. Во всяком случае, что с дескриптором, что без - проблема та же.
Leonius_Bad
новенький
 
Сообщения: 51
Зарегистрирован: 29.11.2012 19:18:07

Re: Хуки. Локальные и глобальные.

Сообщение Лекс Айрин » 21.03.2016 17:59:06

Leonius_Bad писал(а):С чем может быть связано? С разрядностью? Странная штука...


UAC попробуйте отключить.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Хуки. Локальные и глобальные.

Сообщение Leonius_Bad » 21.03.2016 18:34:01

Лекс Айрин писал(а):UAC попробуйте отключить.

На кибер-форуме подсказали очевидную вещь.
Нужно было dll скомпилировать 64-разрядным ФриПаскалем и всё завелось на 64-разрядных ОСях=))
И как раньше до меня не дошло))

Тему пока не закрываю. Есть еще вопросы, но, возможно, на том же киберфоруме мне на них ответят. Потом запостю итог или же те самые вопросы=)
Leonius_Bad
новенький
 
Сообщения: 51
Зарегистрирован: 29.11.2012 19:18:07

Re: Хуки. Локальные и глобальные.

Сообщение Лекс Айрин » 21.03.2016 18:46:23

Leonius_Bad, наверное, это зависит от наличия/отсутствия dll -- моя прога в стиле "все свое ношу с собой" прекрасно чувствует себя независимо от битности системы. Хотя тут явно прослеживается глюк (то ли системы, то ли компилятора) -- по идее (если я правильно помню правила режимов совместимости), 32битная прога должна использовать 32битные же dll.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Хуки. Локальные и глобальные.

Сообщение Leonius_Bad » 21.03.2016 19:17:03

Лекс Айрин писал(а):Leonius_Bad, наверное, это зависит от наличия/отсутствия dll -- моя прога в стиле "все свое ношу с собой" прекрасно чувствует себя независимо от битности системы.

У Вас глобальный хук, который запущается не из dll? Как это?=)
Там где-то в начале темы мне товарищ доступно объяснил, почему код функции-фильтра(ловушки) должен быть описан в dll, а не в самой программе.

Вопросы с кибер-форума продублирую, т.к. там тишина, а меня любопытство распирает.
1. По-прежнему висит вопрос. Каким образом консольное окно принимает сообщения? Или, хотя бы, по какой причине оно зависает, если именно в нем нажать клавишу(при установленной в нем ловушке на эти сами клавиши)?
2. В чем кардинальное отличие WH_KEYBOARD от WH_KEYBOARD_LL? Как я понял. Вторая добавляет перехват системных (с ALT нажатой) клавиш и всё. Но почему-то, она работать таким же простым образом, как её сестра, не хотит. В чём особенность использования?

Добавлено спустя 4 минуты 49 секунд:
А глюк с зависанием теперь перевернулся.
Я то было обрадовался, что проблема решилась.

Логично, что 32 битные приложения теперь точно также зависают с 64 битной dll. Какой-то бред.. Либо одно, либо другое..
И как быть?:(
Leonius_Bad
новенький
 
Сообщения: 51
Зарегистрирован: 29.11.2012 19:18:07

Re: Хуки. Локальные и глобальные.

Сообщение Лекс Айрин » 21.03.2016 19:38:24

Leonius_Bad писал(а):У Вас глобальный хук, который запущается не из dll?


У меня вообще нет хуков,.. только если компилятор сам поставил.

Leonius_Bad писал(а):Там где-то в начале темы мне товарищ доступно объяснил, почему код функции-фильтра(ловушки) должен быть описан в dll, а не в самой программе.


Я прекрасно помню почему. И согласен с ним.

Leonius_Bad писал(а):В чем кардинальное отличие WH_KEYBOARD от WH_KEYBOARD_LL?

судя по инфе с сайта майкрософт... "местом инъекции". (Перевод грубый, чуть поправленный гугловский)
Код: Выделить всё
WH_KEYBOARD_LL

WH_KEYBOARD_LL хук позволяет контролировать входные  события клавиатуры которые были [b]размещены в очереди ввода нити.[/b]

Для получения дополнительной информации см LowLevelKeyboardProc функцию обратного вызова.
WH_KEYBOARD

WH_KEYBOARD хук позволяет приложению отслеживать трафик сообщений для WM_KEYDOWN и WM_KEYUP сообщения о возвращенной в GetMessage или PeekMessage функции. Вы можете использовать WH_KEYBOARD хук , чтобы контролировать ввод с клавиатуры, который находится [b]в очереди сообщений[/b].


Leonius_Bad писал(а):В чём особенность использования?

Судя по всему, в одном находятся более "сырые" сообщения, которые просто не могут обрабатываться другим.

Добавлено спустя 25 минут 58 секунд:
Leonius_Bad писал(а):С чем может быть связано? С разрядностью? Странная штука...


дошло!!! Это действительно связано с разрядностью. Дело в том, что он ставится в недра системы, а там разрядностью вряд ли поиграешь.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Хуки. Локальные и глобальные.

Сообщение MysticCoder » 22.03.2016 01:41:11

В общем так... насколько я понял, консольные окна таки перехватываются ловушкой, подробно не исследовал, но вот при таком коде установщика в его же консоли спокойно все бикает.
Код: Выделить всё
program testing;
{$mode objfpc}{$H+}

uses Windows, sysutils;

var
descHook:HHOOK;
descDLL : HINST;
descFunc: HOOKPROC;

xMsg : TMSG;
begin

descDLL:=LoadLibrary('dll.dll');
descFunc:=HOOKPROC(GetProcAddress(descDLL,'KeyBoardHook'));
descHook:=SetWindowsHookEx(2, descFunc, descDLL, 0);
while true do
  begin
    if GetMessage(xMsg, 0, 0, 0) then
      begin
        TranslateMessage(xMsg);
        DispatchMessage(xMsg);
      end;
  end;
//Sleep(60000);
UnhookWindowsHookEx(descHook);

end.


если в других консолях не бикает, значит ловушка в них не установлена. в cmd.exe у меня бикало. устанавливается она только в процессы с окнами, походу консольные окна за окна тоже считаются. Разница по идее лишь в том, что для обычных окон в ловушку приходит WM_CHAR, а для консольных WM_KEYDOWN, вроде бы. ну то бишь для консольных какой то там этап типа TranslateMessage пропущен. но это слух, где то в инете недавно вычитал.

Насчет WH_KEYBOARD_LL, в мсдн написано, что эта лоулевел ловушка не инжектируется в процесс, а вызывается в контексте треда который ловушку установил. Плюс время обработки ловушки должно быть минимальным, если задержится немного, система может её снять и ты об этом даже не узнаешь. Остальные особенности сам смотри.

Насчет разрядности все это чепуха. При вызове SetWindowsHook дллка грузится только в процессы соответствующей разрядности. Если дллка 32, то и грузится она будет только в 32. Так что для полного контроля нужно 2 дллки и 2 ловушки. Почему калькуляторы и прочая фигня зависает - это вопрос.... У меня под Win7x64 тоже виснет... тестил на calc.exe, он 32хбитный, к вопросу о разрядности. Выставил на экзешник calc.exe все права на группу пользователей и заделался владельцем - стало все нормально, бикает. Видимо дело в правах. Но вот почему мой клавиатурный логгер не обладает таким разрушительным действием - загадка. Все то же самое по идее, только написан на дельфи.

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

Можно попробовать функцию EnableDebugPrivilege из http://www.delphisources.ru/pages/faq/base/set_debug_service.html заюзать в установщике, авось поможет.
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: Хуки. Локальные и глобальные.

Сообщение Leonius_Bad » 22.03.2016 17:29:18

MysticCoder писал(а):Так что для полного контроля нужно 2 дллки и 2 ловушки.

Попробовал два варианта: два ехешника, две длл-ки. 32 битный ехешник ставит ловушку из 32 битный длл, 64 битный по аналогии.
Потом попробовал обе ловушки поставить из 64 битного ехе шника.
Всё едино: срабатывает только 64 битная (т.е. 32 процессы виснут). Притом, нет разницы, в какой очередности ставить ловушки. Всё равно 32 битные процессы висят. Может оно и срабатывает, но...Как-то так. Что за беда?:(

MysticCoder писал(а):что эта лоулевел ловушка не инжектируется в процесс, а вызывается в контексте треда который ловушку установил.

И вот тут мне интересно. А как же проецирование кода и dll? Как оно тогда работает?


Остальные советы изучу чуть позже, спасибо.

Добавлено спустя 11 минут 10 секунд:
В итоге я запутался с двумя разнобитными ловушками и уже не могу понять, что именно виснет, а что всё же работает :D
Придется, наверное, забить и копать в сторону других вариантов..
Leonius_Bad
новенький
 
Сообщения: 51
Зарегистрирован: 29.11.2012 19:18:07

След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru