Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1204417319
Аврам
2008-03-02 03:21
2008.03.30
получить список ссылок


15-1202559091
md10
2008-02-09 15:11
2008.03.30
какую СУБД выбрать выбрать


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


2-1204209428
максим
2008-02-28 17:37
2008.03.30
hex


2-1204138273
Рустам
2008-02-27 21:51
2008.03.30
драйвера ADO





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский