Сейчас на форуме: bedop66938, -Sanchez-, barsik, vasilevradislav, vsv1 (+6 невидимых) |
eXeL@B —› Крэки, обсуждения —› Работа сообщений в ОС Widows |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 24 декабря 2007 16:32 · Поправил: smex · Личное сообщение · #1 Доброго времени суток. Как то когда начинал изучать основы Reverse Enginering возник вопросик, на который не могу ответить до сих пор. Решил создать тему. Вопрос такой - как известно в ОС Windows в каждой оконной проге имеется цикл обработки сообщений (GetMessage,TranslateMessage) куда по идее должны поступать все сообщения к проге и транслироваться нужным контролам этой проги. И все бы хорошо но провел эксперимент с виндовым блокнотом - окну самого Блокнота не поступают сообщения нажатия кнопки, тогда как полю Memo в этом блокноте поступает сообщение Wm_keydown,wm_keyup,wm_char. Может кто поможет пояснить это особенность ОС, ато нигде не могу найти ответа. Заранее благодарен любому ответу или ссылке по данной теме. |
|
Создано: 24 декабря 2007 16:38 · Личное сообщение · #2 |
|
Создано: 24 декабря 2007 16:43 · Личное сообщение · #3 Ну разницы нет, думаю смысл вопроса ясен... Просто этот небольшой нюанс работы ОС недает мне покоя. Вот линукс к примеру - все понятно как работае, и почему нет сообщений (там типа прерывания, что кстати немало экономит процессорное время), а мелкие как всегда че нить придумают, сделают криво и впридачу никакой нормальной документации. MSDN по поводу моего вопроса молчит. |
|
Создано: 24 декабря 2007 16:52 · Личное сообщение · #4 |
|
Создано: 24 декабря 2007 17:04 · Поправил: HiEndsoft · Личное сообщение · #5 |
|
Создано: 24 декабря 2007 17:32 · Личное сообщение · #6 |
|
Создано: 24 декабря 2007 17:38 · Личное сообщение · #7 |
|
Создано: 24 декабря 2007 18:00 · Личное сообщение · #8 |
|
Создано: 24 декабря 2007 19:22 · Личное сообщение · #9 |
|
Создано: 24 декабря 2007 20:14 · Личное сообщение · #10 |
|
Создано: 25 декабря 2007 05:20 · Поправил: sss · Личное сообщение · #11 smex каждый контрол это окно. 1. Определись какому окну тебе необходимо послать сообщение ? Главное окно блокнота и окно EDIT не одно и то же. Каждое имеет свой обработчик. При этом выборка всех сообщений производится в одном месте, так называемом главном цикле выборки сообщений, вызовом GetMessage -> TranslateMessage -> DispatchMessage. 2. Прочитай какие сообщения воспримет контрол. Например, как работает сообщение EM_REPLACESEL. |
|
Создано: 25 декабря 2007 06:58 · Личное сообщение · #12 ладно объясню еще конкретнее чего хочу. имеется он лайн игра и хочу написать бота, который будет играть за меня, игра должна работать в фоне и не отвлекать меня от других полезных дел, поэту keybd_event не подходит, а нужно как то посылать нажатия клавиш F1,F2 и тд. Ну что, кто сталкивался с подобным? PS: как я предполагаю, нужно послать сообщение не конкретному контролу, а в цикл выборки сообщений приложения... |
|
Создано: 25 декабря 2007 10:14 · Поправил: sss · Личное сообщение · #13 smex пишет: PS: как я предполагаю, нужно послать сообщение не конкретному контролу, а в цикл выборки сообщений приложения... Фокус ввода может иметь только один контрол, а логика обработки может быть разной. Например обработчик проверяет, находится ли его контрол в фокусе и если нет отбрасывает сообщение. Главный цикл получает код сообщения и хэндл окна, которому оно предназначено. Далее вызывается обработчик окна которому послано сообщение. Если окна нет, то и обработки не будет. Сложно судить об структуре приложения которое ты описываешь. У тебя есть хэндл главного окна этого приложения ? И вообще, может быть пример приведешь как ты вызываешь например PostMessage(...)? |
|
Создано: 25 декабря 2007 14:38 · Личное сообщение · #14 пока к практике не перешел, рассматриваю вопрос теоретически. эксперименты по посылке сообщений провожу при помощи программы WindowsScanner. Так вот. Открывается окно игры в котором два поля ввода, но поля ввода не обычные - они не выделяются программой spy++, тоесть наверняка созданы например средствами DirectX. Необходимо ввести логин и пароль. Я главному окну послылаю сообщений WM_Char логин и пароль вводится отлично. Но когда посылаю главному окну сообщение WM_Char с кодом символа 13(энтер) не происходит ничего(да и чего тока непробовал - и WM_keydown и тд). Пробовал шпионить за главным окном, и посылать такие же сообщения, но ничего не происходит. Еще одно предположение - может эта игра имеет внутреннюю защиту от ботов, тогда чувствую придется эмулировать нажатие клавиш уже на ядерном уровне, что явно куда сложнее средств обычных API. PS: Но самое интересное, что если отослать сообщение WM_keydown с кодом 13 простому едиту любой проги, то все равно не происходит эмуляции нажатия в этом едите клавиши Enter... |
|
Создано: 25 декабря 2007 14:53 · Личное сообщение · #15 |
|
Создано: 25 декабря 2007 14:56 · Поправил: Grom_ · Личное сообщение · #16 |
|
Создано: 25 декабря 2007 20:00 · Личное сообщение · #17 |
|
Создано: 25 декабря 2007 21:12 · Личное сообщение · #18 |
|
Создано: 25 декабря 2007 21:53 · Личное сообщение · #19 Ну да насчет мыши конечно же хорошо, но главная задумка как не отвелкать меня от работы. То есть эмулировать мышь можно, но сэмулировать надо как то, чтобы это сообщение получила только оконная процедура игры, а винда оставалась в неведении. То есть SendMessage и тп не катят. Собственно еще раз вопрос - как послать сообщение в саму оконную процедуру окна минуя винду. Тут думаю нужны глубокие знания внутреннего устройства винды, поэтому и решил спросить у вас, так как никто не знает внутренности винды, как реверсеры. Да оно и понятно, исходников то нет. |
|
Создано: 26 декабря 2007 07:44 · Личное сообщение · #20 |
|
Создано: 26 декабря 2007 08:03 · Личное сообщение · #21 |
|
Создано: 26 декабря 2007 09:12 · Личное сообщение · #22 |
|
Создано: 26 декабря 2007 10:07 · Личное сообщение · #23 |
|
Создано: 26 декабря 2007 11:09 · Личное сообщение · #24 smex пишет: Да, такие символы нормально обрабатываются, например вводится отлично пароль. Но послать ентер не удается. Если цикл сообщений чуть сложнее чем "Get ->Translate -> Dispatch", то, возможно, код VK_RETURN вообще не доходит до Dispatch. Первым делом глянь, есть ли в этом цикле сообщений вызов IsDialogMessage. ЗЫ Тут несколько раз было жесткое слова "ВСЕ", так вот, хочу заметить, не все сообщения попадают в очередь. Некоторые система шлёт окну напрямую. ----- Всем привет, я вернулся |
|
Создано: 26 декабря 2007 12:43 · Личное сообщение · #25 |
|
Создано: 26 декабря 2007 14:03 · Личное сообщение · #26 sss пишет: Bitfry в контексте какого потока можно послать сообщение напрямую ? В смысле, в каком потоке будет произведена обработка сообщения? Тут я ляпу дал. Bitfry пишет: ЗЫ Тут несколько раз было жесткое слова "ВСЕ", так вот, хочу заметить, не все сообщения попадают в очередь. Некоторые система шлёт окну напрямую. Беру эти слова обратно ----- Всем привет, я вернулся |
|
Создано: 26 декабря 2007 19:44 · Поправил: Alex_Nik · Личное сообщение · #27 |
|
Создано: 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 и хорошую книгу для изучения внутренностей винды...что не так то просто как кажется |
|
Создано: 27 декабря 2007 01:22 · Личное сообщение · #29 |
|
Создано: 27 декабря 2007 02:48 · Личное сообщение · #30 |
. 1 . 2 . >> |
eXeL@B —› Крэки, обсуждения —› Работа сообщений в ОС Widows |