Форум: "Начинающим";
Текущий архив: 2008.03.30;
Скачать: [xml.tar.bz2];
ВнизЗапустить процедуру в чужом процессе Найти похожие ветки
← →
Chorniy (2008-03-03 11:40) [0]Все еще пытаюсь "кликнуть" мышкой по окну игры, которое не обрабатывает сообщения виндовс.
Имеем:
Запущенную игру (известен ID процесса), название и сдвиг процедуры клика мышки внутри чужого процесса (скажем ClickXY).
Вопрос:
Есть ли способ запустить эту процедуру внутри чужого процесса? Или каким-нибудь образом переставить точку выполнения с одной команды на другую? Вот дебаггеры же умеют вроде так делать... В сторону каких процедур копать и что почитать по этой теме?
← →
Сергей М. © (2008-03-03 11:43) [1]
> окну .., которое не обрабатывает сообщения виндовс
Это нонсенс
← →
Chorniy (2008-03-03 11:58) [2]Я уже создавал тут тему по этому вопросу. Уточню: не обрабатывает события виндовс WM_LBUTTONDOW, WM_LBUTTONUP... мне оветили, что игра может работать с мышкой и без этих сообщений, как-то через заднее отверстие ;)
← →
Сергей М. © (2008-03-03 12:44) [3]
> игра может работать с мышкой и без этих сообщений
Да мало ли как игра может работать !)
Но это же вовсе не ознаает, что окно никак не обрабатывает некие поступающие в его адрес сообщения)
> название и сдвиг процедуры клика мышки внутри чужого процесса
> (скажем ClickXY).
Здесь подробнее - откуда тебе стало об этом известно ..
← →
Сергей М. © (2008-03-03 12:52) [4]
> Или каким-нибудь образом переставить точку выполнения с
> одной команды на другую?
Оч даже простым способом - SetWindowLong(..GWL_WNDPROC..).
Но для успешного выполнения этой ф-ции требуется отнюдь непростое соблюдение ряда условий.
← →
Chorniy (2008-03-03 13:30) [5]
> Здесь подробнее - откуда тебе стало об этом известно ..
ну из PE файла... хотя честно скажу, что еще не реализовал это. Потому что даже не был уверен в возможности перестановки точки выполнения программы.
> Оч даже простым способом - SetWindowLong(..GWL_WNDPROC..
> ).
Вот почитать бы где-нить статейку про реализацию SetWindowLong(..GWL_WNDPROC ...) или на словах поясните какого именно ряда условий, попытаюсь поковыряться.
← →
Chorniy (2008-03-03 13:33) [6]там наверняка регистры процессора сохранять надо (GetThreadContext), чтобы вернуть точку обратно... а еще что?
← →
Palladin © (2008-03-03 13:33) [7]http://www.google.ru/search?hl=ru&q=setwindowlong+gwl_wndproc&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=&aq=f
← →
Сергей М. © (2008-03-03 13:33) [8]
> ну из PE файла
У тебя в этом PE-файле хранятся имена неэкспортируемых процедур ?
Вот это номер)
> какого именно ряда условий
Справку ты уже проштудировал ?
← →
Сергей М. © (2008-03-03 13:35) [9]
> там наверняка регистры процессора сохранять надо
Нет.
"Там" следует сохранять результат предварительного вызова GetWindowLong, чтобы для всех неинтересующих тебя сообщений вызвать "родную" оконную функцию
← →
Сергей М. © (2008-03-03 13:36) [10]Впрочем, и для интересующих тоже, иначе грабли неминуемы
← →
Chorniy (2008-03-03 13:38) [11]
> У тебя в этом PE-файле хранятся имена неэкспортируемых процедур
> ?
нет. а вдруг да она экспортируемая ;)))) ну всерно подозреваю, что найти сдвиг процедуры не так уж и сложно.
всем спс за ответ. ушел читать надолго )
← →
Сергей М. © (2008-03-03 13:41) [12]
> вдруг да она экспортируемая
За каким лешим экспортировать оконную функцию ?)
> подозреваю, что найти сдвиг процедуры не так уж и сложно
Что такое "сдвиг" ? Смещение что ли ? Тогда отн-но чего ты желаешь получить этот "сдвиг" ?
← →
Washington © (2008-03-03 13:53) [13]по фазе наверное
← →
Chorniy (2008-03-03 14:00) [14]Кстати..я еще не дочитал всю справку, однако пока темка свежа:
1. С помощью SetWindowLong я сменю адрес оконной процедуры (т.е. той которая обрабатывает сообщения виндовс)
2. А на какой адрес ево менять? то есть как мне разместить свою процедуру в адресном пространстве чужого процесса? DLL?
3. И что мне делать-то с этим сообщением? То есть я в своей процедуре получаю скажем: WM_LBUTTONDOWN в точке 120х437, теперь надо както запустить родной для игры механизм обработки мыши... то есть некую процедуру, которая может находиться даже в другом потоке (а вдруг мышка обрабатывается в обход виндовс-сообщений в отдельном потоке?)
← →
Sapersky (2008-03-03 14:08) [15]mouse_event пробовал?
Если не работает, можно попробовать перехват интерфейсов (точнее, методов интерфейсов) DirectInput, хотя это довольно сложное и муторное занятие.
← →
Chorniy (2008-03-03 14:10) [16]
> mouse_event пробовал
я напрямик слал туда WM_LBUTTONDOWN и WM_LBUTTONUP.. ноль результата.
а вот ДиректИнпут там вполне может использоваться... а есть возможность его перехвата/послыки?
← →
Сергей М. © (2008-03-03 14:12) [17]
> как мне разместить свою процедуру в адресном пространстве
> чужого процесса? DLL?
Как один из возможных способов - да.
> надо както запустить родной для игры механизм обработки
> мыши... то есть некую процедуру
Откуда ж она там возьмется. если ты сам говоришь, что цацка никак не обрабатывает это сообщение ?
← →
Chorniy (2008-03-03 14:14) [18]
> что цацка никак не обрабатывает это сообщение
дак в том и фишка, что када вручную кликаешь, то все замечательно... а вот из своей проги не могу сымитировать.
← →
Chorniy (2008-03-03 14:15) [19]То есть она с мышкой работает как-то..но минуя Messages виндовса
← →
Сергей М. © (2008-03-03 14:21) [20]
> она с мышкой работает как-то..но минуя Messages виндовса
>
Крайне маловероятно.
Но это легко проверить, перехватив как раз с пом. SetWindowLong штатную оконную ф-цию и не пуская эти сообщения на обработку штатной ф-ции
← →
Sapersky (2008-03-03 14:24) [21]> mouse_event пробовал
я напрямик слал туда WM_LBUTTONDOWN и WM_LBUTTONUP.. ноль результата.
Может, mouse_event работает не через сообщения.
а вот ДиректИнпут там вполне может использоваться... а есть возможность его перехвата/послыки?
Возможность есть. Теория внедрения/перехвата (если не в курсе, что это такое) - см. в известной книге Рихтера.
Практический пример - в библиотеке madCodeHook есть перехват методов интерфейсов Direct3D, c DirectInput можно сделать аналогично.
← →
Сергей М. © (2008-03-03 14:35) [22]Собссно если следы ведут в сторону DI, то проверить это проще простого - достаточно установить в своем тестовом мышином DI-приложении уровень кооперации = exclusive на доступ к мышиному дивайсу, после чего попытаться запустить цацку , которая обязана грязно выругаться по поводу невозможности получить доступ к DI-интерфейсу этого дивайса.
← →
Chorniy (2008-03-03 14:38) [23]
> Но это легко проверить, перехватив как раз с пом. SetWindowLong
> штатную оконную ф-цию
О!!!! так и поступлю. самое оно чтобы проверить.
> см. в известной книге Рихтера
к своему стыду (хотя все говорят о ней) не читал..есть ли ссылочка откуда скачать. или тока в магазин идти?
← →
Palladin © (2008-03-03 14:42) [24]здесь ее не будет. только в магазин.
← →
Chorniy (2008-03-03 14:44) [25]
> достаточно установить в своем тестовом мышином DI-приложении
> уровень кооперации = exclusive
а это пожалуй то с чего начну..реализовать проще всего. возможно отпадет необходимость в ковырянии чужого процесса на предмет переноса адреса процедуры.
← →
Sapersky (2008-03-03 14:51) [26]здесь ее не будет. только в магазин.
Что ж так сурово. Один из местных админов ещё в 2005 г выложил и не особо это скрывает:
http://rouse.drkb.ru/books.php
Глава называется, насколько помню, "Внедрение DLL и перехват API-функций". Про DirectInput там, конечно, ничего нет, но для понимания общих принципов полезно.
← →
Palladin © (2008-03-03 15:05) [27]
> Chorniy (03.03.08 14:44) [25]
ну все, теперь ты обязан ее купить, а еслив не купишь, то... ну в doom, я думаю, играл... надпись видел....
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.03.30;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.135 c