Сейчас на форуме: bedop66938, -Sanchez-, barsik, vasilevradislav, vsv1 (+6 невидимых)

 eXeL@B —› Крэки, обсуждения —› Работа сообщений в ОС Widows
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 24 декабря 2007 16:32 · Поправил: smex
· Личное сообщение · #1

Доброго времени суток.
Как то когда начинал изучать основы Reverse Enginering возник вопросик, на который не могу ответить до сих пор. Решил создать тему. Вопрос такой - как известно в ОС Windows в каждой оконной проге имеется цикл обработки сообщений (GetMessage,TranslateMessage) куда по идее должны поступать все сообщения к проге и транслироваться нужным контролам этой проги. И все бы хорошо но провел эксперимент с виндовым блокнотом - окну самого Блокнота не поступают сообщения нажатия кнопки, тогда как полю Memo в этом блокноте поступает сообщение Wm_keydown,wm_keyup,wm_char. Может кто поможет пояснить это особенность ОС, ато нигде не могу найти ответа. Заранее благодарен любому ответу или ссылке по данной теме.




Ранг: 111.1 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 24 декабря 2007 16:38
· Личное сообщение · #2

Там вроде не Memo а Edit.

-----
The truth is out of there...




Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 24 декабря 2007 16:43
· Личное сообщение · #3

Ну разницы нет, думаю смысл вопроса ясен... Просто этот небольшой нюанс работы ОС недает мне покоя. Вот линукс к примеру - все понятно как работае, и почему нет сообщений (там типа прерывания, что кстати немало экономит процессорное время), а мелкие как всегда че нить придумают, сделают криво и впридачу никакой нормальной документации. MSDN по поводу моего вопроса молчит.



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 24 декабря 2007 16:52
· Личное сообщение · #4

У меня есть одно предположение. Возможно я перехватывал сообщения именно основному окну блокнота. А есть еще очередь сообщений приложения, куда по идее должны поступать все до единого сообщения. Но как его увидеть?



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 24 декабря 2007 17:04 · Поправил: HiEndsoft
· Личное сообщение · #5

Любому дочернему окну или контролу можно присвоить свой доп. обработчик сообщений в процессе работы (ф-ция SetWindowLong с GWL_WNDPROC) и при создании окна(GWL_HINSTANCE). Причем будет обрабатываться обработчик/и родительского окна/окон и твоего контрола.

-----
продавец резиновых утёнков




Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 24 декабря 2007 17:32
· Личное сообщение · #6

Да в том то и дело что не много не это спрашиваю, я не пишу прогу, я пытаюсь их реверсить и хочу понять как работает ОС...



Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 24 декабря 2007 17:38
· Личное сообщение · #7

Читай Рихтера, там целая глава.



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 24 декабря 2007 18:00
· Личное сообщение · #8

Да читал я его уже, когда пытался выяснить почему окну не приходят сообщения WM_GETEXT и WM_SETTEXT. Выяснил. А на свой вопрос ответа не нашел. Тут больше подходит чтение книг про внутреннее устройство Windows. Но сейчас специально прочитаю главу Рихтера еще раз.



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 24 декабря 2007 19:22
· Личное сообщение · #9

Возможно попробую перефразировать фопрос. Как послать окну сообщения клавиш Esc и таких подобных. Пробовал в Spy++ перехватывать сообщения а потом формировал и посылал окну такие же сообщения, однако мои сообщения не работали.



Ранг: 52.2 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 24 декабря 2007 20:14
· Личное сообщение · #10

smex пишет:
Как послать окну сообщения клавиш Esc и таких подобных.


keybd_event не пробовал вызывать ??



Ранг: 37.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 25 декабря 2007 05:20 · Поправил: sss
· Личное сообщение · #11

smex каждый контрол это окно.
1. Определись какому окну тебе необходимо послать сообщение ? Главное окно блокнота и окно EDIT не одно и то же. Каждое имеет свой обработчик. При этом выборка всех сообщений производится в одном месте, так называемом главном цикле выборки сообщений, вызовом GetMessage -> TranslateMessage -> DispatchMessage.

2. Прочитай какие сообщения воспримет контрол. Например, как работает сообщение EM_REPLACESEL.



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 25 декабря 2007 06:58
· Личное сообщение · #12

ладно объясню еще конкретнее чего хочу. имеется он лайн игра и хочу написать бота, который будет играть за меня, игра должна работать в фоне и не отвлекать меня от других полезных дел, поэту keybd_event не подходит, а нужно как то посылать нажатия клавиш F1,F2 и тд. Ну что, кто сталкивался с подобным?

PS: как я предполагаю, нужно послать сообщение не конкретному контролу, а в цикл выборки сообщений приложения...



Ранг: 37.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 25 декабря 2007 10:14 · Поправил: sss
· Личное сообщение · #13

smex пишет:
PS: как я предполагаю, нужно послать сообщение не конкретному контролу, а в цикл выборки сообщений приложения...


Фокус ввода может иметь только один контрол, а логика обработки может быть разной. Например обработчик проверяет, находится ли его контрол в фокусе и если нет отбрасывает сообщение. Главный цикл получает код сообщения и хэндл окна, которому оно предназначено. Далее вызывается обработчик окна которому послано сообщение. Если окна нет, то и обработки не будет. Сложно судить об структуре приложения которое ты описываешь. У тебя есть хэндл главного окна этого приложения ?
И вообще, может быть пример приведешь как ты вызываешь например PostMessage(...)?



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 25 декабря 2007 14:38
· Личное сообщение · #14

пока к практике не перешел, рассматриваю вопрос теоретически. эксперименты по посылке сообщений провожу при помощи программы WindowsScanner. Так вот. Открывается окно игры в котором два поля ввода, но поля ввода не обычные - они не выделяются программой spy++, тоесть наверняка созданы например средствами DirectX. Необходимо ввести логин и пароль. Я главному окну послылаю сообщений WM_Char логин и пароль вводится отлично. Но когда посылаю главному окну сообщение WM_Char с кодом символа 13(энтер) не происходит ничего(да и чего тока непробовал - и WM_keydown и тд). Пробовал шпионить за главным окном, и посылать такие же сообщения, но ничего не происходит. Еще одно предположение - может эта игра имеет внутреннюю защиту от ботов, тогда чувствую придется эмулировать нажатие клавиш уже на ядерном уровне, что явно куда сложнее средств обычных API.
PS: Но самое интересное, что если отослать сообщение WM_keydown с кодом 13 простому едиту любой проги, то все равно не происходит эмуляции нажатия в этом едите клавиши Enter...



Ранг: 29.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 25 декабря 2007 14:53
· Личное сообщение · #15

smex пишет:
PS: Но самое интересное, что если отослать сообщение WM_keydown с кодом 13 простому едиту любой проги, то все равно не происходит эмуляции нажатия в этом едите клавиши Enter...

а в этих "любых" прогах Ентер обрабатывается ?



Ранг: 29.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 25 декабря 2007 14:56 · Поправил: Grom_
· Личное сообщение · #16

а конкретно по теме , может те нуно сначало Фокус установить на нужном Контролле
ЗЫ ты когда посылаешь искуственно символы , курсор(коретка) сдвигается ?



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 25 декабря 2007 20:00
· Личное сообщение · #17

Да, такие символы нормально обрабатываются, например вводится отлично пароль. Но послать ентер не удается. А фокус ввода на тот едит установить невозможно, он создан игрой, походу с помощью DirectX, чего только не пробовал...




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 25 декабря 2007 21:12
· Личное сообщение · #18

smex, тебе надо послать движене мыши, потом click и потом ввод текста. Потом опять движение и click на enter/OK/login. Сделай так что б твоя прога читала script и потом колбась скрипт - это и есть простой бот.



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 25 декабря 2007 21:53
· Личное сообщение · #19

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



Ранг: 37.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 26 декабря 2007 07:44
· Личное сообщение · #20

smex посылай вначале именно WM_KEYDOWN с виртуальным кодом VK_RETURN, а затем WM_KEYUP. И наверное все получиться.



Ранг: 37.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 26 декабря 2007 08:03
· Личное сообщение · #21

smex пишет:
Собственно еще раз вопрос - как послать сообщение в саму оконную процедуру окна минуя винду.


Как такое возможно ? Минуя систему послать событие в системную очередь? Не используя ее (очереди) средств синхронизации получим deadlock или еще чего нехорошего...




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 26 декабря 2007 09:12
· Личное сообщение · #22

smex, ты не понял, эмулировать надо не "устройство мышь" а всего лишь её эффект для проги. То есть, посылать сообщения окну/контролю через API.



Ранг: 72.4 (постоянный), 33thx
Активность: 0.050.03
Статус: Участник

Создано: 26 декабря 2007 10:07
· Личное сообщение · #23

smex
как послать сообщение в саму оконную процедуру окна минуя винду
сначала найди хэндл, потом шли этому хэндлу.



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 26 декабря 2007 11:09
· Личное сообщение · #24

smex пишет:
Да, такие символы нормально обрабатываются, например вводится отлично пароль. Но послать ентер не удается.


Если цикл сообщений чуть сложнее чем "Get ->Translate -> Dispatch", то, возможно, код VK_RETURN вообще не доходит до Dispatch. Первым делом глянь, есть ли в этом цикле сообщений вызов IsDialogMessage.

ЗЫ Тут несколько раз было жесткое слова "ВСЕ", так вот, хочу заметить, не все сообщения попадают в очередь. Некоторые система шлёт окну напрямую.

-----
Всем привет, я вернулся




Ранг: 37.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 26 декабря 2007 12:43
· Личное сообщение · #25

Bitfry в контексте какого потока можно послать сообщение напрямую ? В смысле, в каком потоке будет произведена обработка сообщения?



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 26 декабря 2007 14:03
· Личное сообщение · #26

sss пишет:
Bitfry в контексте какого потока можно послать сообщение напрямую ? В смысле, в каком потоке будет произведена обработка сообщения?

Тут я ляпу дал.

Bitfry пишет:
ЗЫ Тут несколько раз было жесткое слова "ВСЕ", так вот, хочу заметить, не все сообщения попадают в очередь. Некоторые система шлёт окну напрямую.

Беру эти слова обратно

-----
Всем привет, я вернулся




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

Создано: 26 декабря 2007 19:44 · Поправил: Alex_Nik
· Личное сообщение · #27

smex пишет:
отослать сообщение WM_keydown с кодом 13 простому едиту любой проги, то все равно не происходит эмуляции нажатия в этом едите клавиши Enter

SCAN коды клавиатуры и ASC коды не одно и тоже
попробуй invoke keybd_event,1CH,1CH,0,0 ;ENTER

Дос-овские окна это понимают, у меня.



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 26 декабря 2007 22:15 · Поправил: smex
· Личное сообщение · #28

Всем спасибо за активные попытки помощи

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

Bitfry
Насчет твого проедложения обязательно посмотрю, может и вправду необычный цикл обработки сообщений

s0larian
а вот эмулировать мышь это само то, это ж надо, правду говорят, что всё гениальное просто...есть свои нюансы, но думаю они решаемы

Ну а теперь самое интересное. Мне, да и всем думаю это будет интересное, собственно чего не могу понять уже пол года:
Итак - лог сообщений от Spy++ окну игры от нажатия клавиши Enter
<00022> 01020614 P WM_KEYDOWN nVirtKey:VK_RETURN cRepeat:1 ScanCode:1C fExtended:1 fAltDown:0 fRepeat:0 fUp:0
<00023> 01020614 P WM_CHAR chCharCode:'000D' (13) cRepeat:1 ScanCode:1C fExtended:1 fAltDown:0 fRepeat:0 fUp:0
<00024> 01020614 P WM_KEYUP nVirtKey:VK_RETURN cRepeat:1 ScanCode:1C fExtended:1 fAltDown:0 fRepeat:1 fUp:1
Все хорошо, так и должно быть. Но почему посылая этому же окну (с тем же хэндлом) этих же сообщений не происходит никаких действий. Хотя бы теоретически как такое возможно, ведь я фактически для проги нажал Enter. Одно из двух - прога перехватывает API и недает в себя вводить данные(но почему текст вводится?) либо винда работает непонятно как... Кому не лень попробуйте найти в какой нибудь проге Edit реагирующий на Enter и нажать его программно. Всё щас заплачу ))))). Кому интересно присоединяйтесь - может вместе поймем этот момент работы ОС. А ввобще чувствую надо брать в руки SoftIce и хорошую книгу для изучения внутренностей винды...что не так то просто как кажется




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 27 декабря 2007 01:22
· Личное сообщение · #29

smex, с enter особенная тема. Просто пошли WM_CLICK кнопке и усё.



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 27 декабря 2007 02:48
· Личное сообщение · #30

Ну с этим то разобрался, прогу то думаю сделаю. Просто я так не люблю делать что то, не поняв как оно работает. И тут уже вопрос не в проге, а в чести). Вот и сейчас меня терзают сомнения, как возможно что эмулирую точно такие же сообщения, как поймал шпионом, а оно не пашет. Что то здест нечисто.


. 1 . 2 . >>
 eXeL@B —› Крэки, обсуждения —› Работа сообщений в ОС Widows
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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