Сейчас на форуме: tyns777 (+4 невидимых)

 eXeL@B —› Программирование —› Перехват попытки активации окна фонового приложения на низком уровне, т.е. без ::SetWindowsHookEx()
Посл.ответ Сообщение

Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 октября 2010 02:46 · Поправил: okobaka
· Личное сообщение · #1

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

Буду очень признателен вам, если хотя бы укажете направление поиска. А то я перерыл уже MSDN, Win32 API и NtXXX/KeXXX функции ядра, но ничего подходящего пока не нашел...




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 25 октября 2010 03:35
· Личное сообщение · #2

SetForegroundWindow? Уходит прямо в ядро.

-----
Yann Tiersen best and do not fuck




Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 октября 2010 03:53
· Личное сообщение · #3

Т.е. я так понимаю, мне нужно брутально хукать эту функцию на уровне всей системы?

У меня есть предположение, что Shell (explorer.exe по дефолту) как-то знает про треды в саспенде и говорит ядру накапливать сообщения для их message queue где-то во внутренних очередях. Потому что как только тред выходит из саспенда ему начинают сыпаться все клики/мувы и т.д. А до этого момента - ни шороха даже по системным хукам...




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 25 октября 2010 04:23
· Личное сообщение · #4

okobaka пишет:
Т.е. я так понимаю, мне нужно брутально хукать эту функцию на уровне всей системы?

Понятие не имею. Я в ring0 не шарю, просто решил дать хоть какую то зацепку.

-----
Yann Tiersen best and do not fuck





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 25 октября 2010 09:14
· Личное сообщение · #5

Я чё-то не въехал. Если тред находится в саспенде, то как можно сделать окно активным, если цикл обработки сообщений обслуживается этим тредом? Может, чего-то не знаю - простветите.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 октября 2010 09:27
· Личное сообщение · #6

Мне нужна нотификация про попытку юзера переключиться в приложение, все треды которого находятся в саспенде.




Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 25 октября 2010 09:58
· Личное сообщение · #7

okobaka пишет:
Но если процесс или его главный тред в состоянии саспенда или под отладкой, то хуки не работают

Можно нескромный вопрос вы случайно не анти отладочный трюк хотите задействовать?

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 октября 2010 10:21
· Личное сообщение · #8

ClockMan пишет:
Можно нескромный вопрос вы случайно не анти отладочный трюк хотите задействовать?

Нет. А у вас есть мысли по существу вопроса?



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 25 октября 2010 19:05
· Личное сообщение · #9

Исходящие из ядра сообщения проходят через таблицу хэндлеров gapfnScSendMessage, входящие в ядро через массив gapfnMessageCall. Очевидно следует загрузить в него хэндлер. Сабж в messages.h и ntcb.h



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 октября 2010 21:41
· Личное сообщение · #10

Clerk пишет:
Сабж в messages.h и ntcb.h

Спасибо, Clerk. Можно подробнее, пожалуйста, где искать эти хидеры? Гугл дает ссылку на этот пост )



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 25 октября 2010 22:44
· Личное сообщение · #11

okobaka
http://indy-vx.narod.ru/Bin/Apfn.zip

Может возникнуть проблема с поиском ссылки на первый массив. В XP например все три массива(третий с векторами) находятся друг около друга. Но в иной версии их расположение может отличаться. Значит как искать. Два способа как обычно - релоки или дизасм. Если дизасм, то можно поступить следующим образом. Необходима опорная функция, раз это шадов, то разумеется она будет сервисом. Подходит NtUserMessageCall. Стаб не экспортируется. Значит нужно вытянуть идентификатор из экспортируемой апи, подходит SendNotifyMessageA(). Разбираем сервис и находим там последовательность:
Code:
  1. o IP = @NtUserMessageCall()
  2. o NL = 1
  3.          movzx Reg32,byte ptr [Reg32' + offset MessageTable]/mov Reg8,byte ptr [Reg32' + offset MessageTable]
  4.          [Line]
  5.          and Reg32,MSGFLAG_MASK    ; 0x3F
  6.          [Line]
  7.          Call dword ptr [Reg32*4 + offset gapfnMessageCall]

Отсюда извлекаем две ссылки:
o MessageTable
o gapfnMessageCall

Теперь можно найти ссылку на gapfnScSendMessage, енумом релоков для MessageTable(этот проще), либо опятьже дизасмом. Для последнего способа подходит сервис NtUserDispatchMessage. Ссылка в стаб находится в DispatchMessageA.

Code:
  1. o IP = @NtUserDispatchMessage()
  2. o NL > 1(lim ?)
  3.  
  4.          movzx Reg32,byte ptr [Reg32' + offset MessageTable]/mov Reg8,byte ptr [Reg32' + offset MessageTable]
  5.          [Line]
  6.          and Reg32,MSGFLAG_MASK    ; 0x3F
  7.          [Line]
  8.          Call dword ptr [Reg32*4 + offset gapfnScSendMessage]

Найдём таким образом последний массив:
o gapfnScSendMessage

Проблема:
Шадова код очень сильно размазан по всему модуля, так что поиск без построения графа врятле возможен.

зы: Это всё теоретически, сам я это никогда не юзал.



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 26 октября 2010 05:57
· Личное сообщение · #12

Clerk, спасибо. Однако боюсь этот метод для меня не подойдет. Тут проблема в том, что окну засаспендженного треда сообщения в очередь похоже не ложатся - они складируются в системной очереди. Похоже, мне нужно колбэк или сообщение от шелла получать. Он их дальше роутит в ядро, ядро видит что тред спит и не постит ему сообщения, а накапливает. Т.е. ваш метод это несколько глубже, чем нужно.
В любом случае, спасибо за то, что потратили время на ответ. Эти знания мне пригодятся в будущем так точно.


 eXeL@B —› Программирование —› Перехват попытки активации окна фонового приложения на низком уровне, т.е. без ::SetWindowsHookEx()
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати