|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
03.08.2015, 02:01 | #1 |
Пользователь
Регистрация: 01.02.2011
Сообщений: 33
|
Управление socket'ом чужого приложения, как в WPE PRO
Доброго времени суток!
Пытаюсь написать программу для отправки пакетов на сервер "от имени" игры (а точнее её socket'а). Если вам интересно зачем мне это, то вот история в кратце: Есть одна старая MMO игра, на Flash. Бой в ней происходит "на отдельной от игрового мира карте". Т.е., грубо говоря, нажимаем на монстра и попадаем с ним в бой на существующей только во время боя локации. Однако, не всегда мы в бой попадём. Зачастую вылетит сообщение о том, что монстры тут "кончились". Но потыкав по их иконке ещё несколько раз, и закрыв пару тройку таких окошек, мы таки попадём в бой. Я хочу написать программу, которая будет имитировать эти нажатия до тех пор, пока не окажусь в бою, потому что это занимает жутко много времени (в игре стоит таймер на это событие, с очень большим интервалом, хотя пакеты приходят моментально). К тому же есть желание в будущем сделать alert-бота, через которого игроки смогут обращаться к другим игрокам, например, за помощью, а те, при желании, отвечать им. Да и давно хотел изучить эту нишу программирования, хотя бы для того, что бы иметь представление об уязвимостях в подобных местах. Но пока что решил остановиться на программе для инициации боя. Пришёл к выводу, что самый простой вариант — работать напрямую с трафиком. Данный момент имею сниффер на Delphi, с возможностью фильтрации трафика (входящего/исходящего) по IP/Порту/Содержимому, иначе говоря, запросто имею весь "диалог" клиента игры и сервера. Через WPE PRO вручную отправлял пакеты с данными, сервер с радостью их принимает, присылает ответ. Игру вполне устраивают подобные "телодвижения" со стороны сервера (т.е. пакет со стороны сервер ни с того ни с сего). Что хочу сделать — каким-либо образом отправлять определённые данные на сервер через socket игры. Насколько я знаю, это можно сделать получив handle этого socket'а. Это в свою очередь можно сделать через инъекцию dll в игру. Что хочу узнать/в чём требуется ваша помощь: 1. Можно ли узнать handle без инъекции, например, по pid? Насколько я понимаю, это можно отследить (имею ввиду dll инъекцию, хотя игра и древняя, но тем не менее), а следовательно и бан получить. Не хотелось бы такого расклада, очень уж давно я с ней знаком, и пока прощаться не хотелось бы. 2. Каким образом получить handle socket'а с помощью внедрённой dll? Игра имеет .ехе оболочку. 3. Что делать заимев handle? Просто сделать клон? Не будет ли проблем с seq? Или клон будет работать как указатель на оригинал? Надеюсь тема не умрёт, и мне удастся решить все проблемы. Нашёл очень старую, схожую тему на другом форуме, и насколько понял, задача вполне решаема. К сожалению, там не было требуемой мне информации. |
03.08.2015, 09:35 | #2 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
Не стесняемся, плюсуем!
|
03.08.2015, 13:38 | #3 | |
Пользователь
Регистрация: 01.02.2011
Сообщений: 33
|
Цитата:
Последний раз редактировалось Reimscher; 03.08.2015 в 13:41. |
|
03.08.2015, 16:22 | #4 | |
Форумчанин
Регистрация: 01.06.2015
Сообщений: 497
|
Цитата:
Еще нужно учитывать то, что игра может при нажатии на монстра выполнять еще какие-то действия, кроме как отправить пакет. И если просто отправить пакет, то игра может начать что-то некорректно отображать или вообще повиснуть. А подмена функций не считается взломом случайно?
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
|
|
03.08.2015, 17:42 | #5 | |
Пользователь
Регистрация: 01.02.2011
Сообщений: 33
|
Цитата:
Я представлял следующую подмену: есть оригинальный send и мой (набор аргументов у них идентичен), разница лишь в том, что мой передаёт мне всю информацию о socket, а затем вызывает настоящий send (только, наверное, придётся использовать оригинальный send внутри, опять же, dll). Ну, а получив данные о socket, им можно было бы уже манипулировать. Насчёт подмены connect, как мне кажется, не лучший выход. Это ведь уже эмулятор игры придётся писать, т.к. там ведь игра постоянно с сервером "общается", а в случае разъединения происходит выброс и полная переинициализация данных. А мне всего-то хочется сделать свою кнопку инициации боя. А даже если socket будет доступен только внутри игры, то можно как-нибудь попытаться управлять им с помощью инъекцированной dll. Касательно этого — проверял через WPE PRO, игра вполне приемлет сообщение от сервера о том, что надо начать вывод данных боя, даже если оно пришло "ни с того ни с сего". Последний раз редактировалось Reimscher; 03.08.2015 в 17:52. |
|
03.08.2015, 18:11 | #6 |
Форумчанин
Регистрация: 01.06.2015
Сообщений: 497
|
С функции connect можно будет узнать socket и отправлять уже пакеты с помощью send. А если нужно еще отслеживать трафик, то тут нужно еще подменять send и recv.
Посмотрите как это делает WPE PRO, возможно, эта программа тоже встраивает свою dll в приложение.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
|
03.08.2015, 18:18 | #7 |
Пользователь
Регистрация: 01.02.2011
Сообщений: 33
|
Кажется только теперь до меня дошёл смысл подмены connect. Но, боюсь, этот вариант не подходит, т.к. я не знаю в какой момент он происходит, вероятнее всего в момент запуска игры. Слишком проблематично вылавливать этот момент. Доступ к трафику я уже и так имею, через WinPCap драйвер. Поэтому будут придерживаться пока что плана подмены send'а, к тому же, в случае успеха я откажусь от WinPCap'а, т.к. я там использую приложение от Magenta, в котором для меня очень много лишнего (точнее там вообще весь трафик идет, через написанный мною фильтр).
|
03.08.2015, 21:39 | #8 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Можно попробовать следующее,
простой способ добраться до чужого сокета, делаем проверку сокетов перебором номеров и находя нужный адрес находим и сам Handle сокета. Код:
В этом примере поиск идет нормально, но вот отправка получиться ли не проверял. Также теоретически можно закрывать ненужные сокеты используя closesocket(HSock). Запускать я думаю нужно из под админа для отправки и закрытия. В общем пробуйте код можно и без порта проверку сделать. Последний раз редактировалось Aliens_wolfs; 03.08.2015 в 22:42. |
04.08.2015, 12:04 | #9 | |
Пользователь
Регистрация: 01.02.2011
Сообщений: 33
|
Цитата:
Потому что у меня находит только Embarcadero'вский socket, и только если запускаю Debug, в Release вообще пусто. Однако, если код запихать в DLL и её инъецировать в клиент игры, то возможно, она найдёт все socket'ы. |
|
04.08.2015, 19:18 | #10 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Код:
Внедрять DLL умеете в чужую программу? Последний раз редактировалось Aliens_wolfs; 04.08.2015 в 20:22. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
как разрешить запуск второй копии чужого приложения | s1s1s1 | Общие вопросы Delphi | 4 | 02.11.2011 01:47 |
как запретить сворачивание чужого приложения | 856100 | Общие вопросы Delphi | 11 | 23.07.2010 01:36 |
Нужно найти или написать прогу, на подобие WPE Pro | ZBEP | Фриланс | 4 | 22.03.2010 17:03 |
Как скопировать текст чужого приложения? | Nikolay-niw32 | Общие вопросы Delphi | 17 | 12.03.2009 21:28 |
Как определить путь чужого приложения? | VVM | Win Api | 3 | 02.12.2008 18:22 |