![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запустить процедуру в чужом процессе
Chorniy © (2008-03-03 11:40:00)Все еще пытаюсь "кликнуть" мышкой по окну игры, которое не обрабатывает сообщения виндовс.
Имеем:
Запущенную игру (известен ID процесса), название и сдвиг процедуры клика мышки внутри чужого процесса (скажем ClickXY).
Вопрос:
Есть ли способ запустить эту процедуру внутри чужого процесса? Или каким-нибудь образом переставить точку выполнения с одной команды на другую? Вот дебаггеры же умеют вроде так делать... В сторону каких процедур копать и что почитать по этой теме?
Palladin (2008-03-03 15:05:00) [1]
> Chorniy (03.03.08 14:44) [25]
ну все, теперь ты обязан ее купить, а еслив не купишь, то... ну в doom, я думаю, играл... надпись видел....
Sapersky (2008-03-03 14:51:00) [2]здесь ее не будет. только в магазин.
Что ж так сурово. Один из местных админов ещё в 2005 г выложил и не особо это скрывает:
http://rouse.drkb.ru/books.php
Глава называется, насколько помню, "Внедрение DLL и перехват API-функций". Про DirectInput там, конечно, ничего нет, но для понимания общих принципов полезно.
Chorniy (2008-03-03 14:44:00) [3]
> достаточно установить в своем тестовом мышином DI-приложении
> уровень кооперации = exclusive
а это пожалуй то с чего начну..реализовать проще всего. возможно отпадет необходимость в ковырянии чужого процесса на предмет переноса адреса процедуры.
Palladin (2008-03-03 14:42:00) [4]здесь ее не будет. только в магазин.
Chorniy (2008-03-03 14:38:00) [5]
> Но это легко проверить, перехватив как раз с пом. SetWindowLong
> штатную оконную ф-цию
О!!!! так и поступлю. самое оно чтобы проверить.
> см. в известной книге Рихтера
к своему стыду (хотя все говорят о ней) не читал..есть ли ссылочка откуда скачать. или тока в магазин идти?
Сергей М. (2008-03-03 14:35:00) [6]Собссно если следы ведут в сторону DI, то проверить это проще простого - достаточно установить в своем тестовом мышином DI-приложении уровень кооперации = exclusive на доступ к мышиному дивайсу, после чего попытаться запустить цацку , которая обязана грязно выругаться по поводу невозможности получить доступ к DI-интерфейсу этого дивайса.
Sapersky (2008-03-03 14:24:00) [7]> mouse_event пробовал
я напрямик слал туда WM_LBUTTONDOWN и WM_LBUTTONUP.. ноль результата.
Может, mouse_event работает не через сообщения.
а вот ДиректИнпут там вполне может использоваться... а есть возможность его перехвата/послыки?
Возможность есть. Теория внедрения/перехвата (если не в курсе, что это такое) - см. в известной книге Рихтера.
Практический пример - в библиотеке madCodeHook есть перехват методов интерфейсов Direct3D, c DirectInput можно сделать аналогично.
Сергей М. (2008-03-03 14:21:00) [8]
> она с мышкой работает как-то..но минуя Messages виндовса
>
Крайне маловероятно.
Но это легко проверить, перехватив как раз с пом. SetWindowLong штатную оконную ф-цию и не пуская эти сообщения на обработку штатной ф-ции
Chorniy (2008-03-03 14:15:00) [9]То есть она с мышкой работает как-то..но минуя Messages виндовса
Chorniy (2008-03-03 14:14:00) [10]
> что цацка никак не обрабатывает это сообщение
дак в том и фишка, что када вручную кликаешь, то все замечательно... а вот из своей проги не могу сымитировать.
Сергей М. (2008-03-03 14:12:00) [11]
> как мне разместить свою процедуру в адресном пространстве
> чужого процесса? DLL?
Как один из возможных способов - да.
> надо както запустить родной для игры механизм обработки
> мыши... то есть некую процедуру
Откуда ж она там возьмется. если ты сам говоришь, что цацка никак не обрабатывает это сообщение ?
Chorniy (2008-03-03 14:10:00) [12]
> mouse_event пробовал
я напрямик слал туда WM_LBUTTONDOWN и WM_LBUTTONUP.. ноль результата.
а вот ДиректИнпут там вполне может использоваться... а есть возможность его перехвата/послыки?
Sapersky (2008-03-03 14:08:00) [13]mouse_event пробовал?
Если не работает, можно попробовать перехват интерфейсов (точнее, методов интерфейсов) DirectInput, хотя это довольно сложное и муторное занятие.
Chorniy (2008-03-03 14:00:00) [14]Кстати..я еще не дочитал всю справку, однако пока темка свежа:
1. С помощью SetWindowLong я сменю адрес оконной процедуры (т.е. той которая обрабатывает сообщения виндовс)
2. А на какой адрес ево менять? то есть как мне разместить свою процедуру в адресном пространстве чужого процесса? DLL?
3. И что мне делать-то с этим сообщением? То есть я в своей процедуре получаю скажем: WM_LBUTTONDOWN в точке 120х437, теперь надо както запустить родной для игры механизм обработки мыши... то есть некую процедуру, которая может находиться даже в другом потоке (а вдруг мышка обрабатывается в обход виндовс-сообщений в отдельном потоке?)
Washington (2008-03-03 13:53:00) [15]по фазе наверное
Сергей М. (2008-03-03 13:41:00) [16]
> вдруг да она экспортируемая
За каким лешим экспортировать оконную функцию ?)
> подозреваю, что найти сдвиг процедуры не так уж и сложно
Что такое "сдвиг" ? Смещение что ли ? Тогда отн-но чего ты желаешь получить этот "сдвиг" ?
Chorniy (2008-03-03 13:38:00) [17]
> У тебя в этом PE-файле хранятся имена неэкспортируемых процедур
> ?
нет. а вдруг да она экспортируемая ;)))) ну всерно подозреваю, что найти сдвиг процедуры не так уж и сложно.
всем спс за ответ. ушел читать надолго )
Сергей М. (2008-03-03 13:36:00) [18]Впрочем, и для интересующих тоже, иначе грабли неминуемы
Сергей М. (2008-03-03 13:35:00) [19]
> там наверняка регистры процессора сохранять надо
Нет.
"Там" следует сохранять результат предварительного вызова GetWindowLong, чтобы для всех неинтересующих тебя сообщений вызвать "родную" оконную функцию
Сергей М. (2008-03-03 13:33:00) [20]
> ну из PE файла
У тебя в этом PE-файле хранятся имена неэкспортируемых процедур ?
Вот это номер)
> какого именно ряда условий
Справку ты уже проштудировал ?