Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.30;
Скачать: CL | DM;

Вниз

Запустить процедуру в чужом процессе   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.044 c
2-1204444353
dmitry_12_08_73
2008-03-02 10:52
2008.03.30
Создание ресурса с файлом png


2-1204112380
webpauk
2008-02-27 14:39
2008.03.30
определение констант


15-1203320038
dr_creigan
2008-02-18 10:33
2008.03.30
драйвера


15-1203166532
x.pro
2008-02-16 15:55
2008.03.30
Хостинг для БД


2-1204201182
ply
2008-02-28 15:19
2008.03.30
Выполнить действие для всех объектов формы