PDA

Просмотр полной версии : Новое слов в создании интерфеса для InGame утилит на примере AutoPot


krukovis
20.02.2012, 20:04
Хочу познакомить вас с интересной статьей по поводу создания интерфейса для своих утилит и обсудить ее. Автор Interest07, статья на английсом ТУТ ([Ссылки могут видеть только зарегистрированные и активированные пользователи]).
Мой вариант перевода :
Эта небольшая утилита над которой я работал последнее время. Меня всегда интересовало добавление внутриигрового меню для моих утилит. Потому что хорошо интегрированные утилиты легче использовать и они лучше "ощущаются" при использовании.
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Самый простой путь сделать это (на сколько я знаю) это сделать внедрение DLL в процесс elementclient. Вы можете сделать это при запуске процесса или когда процесс уже запущен. Я выбрал первый вариант: "Внедрение DLL при запуске", описанный здесь более подробно. На этой странице вы так же можете скачать простой в использовании пример внедрения, я использовал точно такой же в своем инжекторе. Не нужно снова изобретать велосипед.

У нас есть инжектор, теперь нам нужна DLL для внедрения. Инжектор вызывает функцию 'Initialize()' из этой DLL, ждет ответа и затем выходит. Итак, в DLL мы должны сделать функцию Initialize() , которая при получении ответа, создаст новый поток в котором мы можем создать основной цикл. До инициализации все потоки ждут создания основного окна. Создание окна можно контролировать на существование hWnd в памяти. Вам понадобится hWnd окна для вызовов различных Win32 API-функций.


Игра использует Direct3D для отображения графических объектов между запросами BeginScene и EndScene . Итак, если мы хотим отобразить наши объекты мы должны прикрепить вызов функции к EndScene и добавить наши объекты прямо перед этим вызовом. Таким образом наши объекты отобразятся во всех фреймах (и над всеми меню). К счастью, существует много инструкций как прикрепить функцию к EndFrame для различных версий Direct3D. PWI использует Direct3D 8, вы можете нагуглить метод прикрепления функции. Если вам не инетересно досконально изучать как это работает, я прикрепил исходный код для этой небольшой утилиты, вы можете просто посмотреть там.

Сделав это мы можем просто создать некоторый класс-обертку для создания различных контролов для управления основным окном (кнопки, лейблы, флажки и т.д.) Итак...теперь мы можем нарисовать меню, но мы все еще не знаем как определить когда пользователь нажмет например на кнопку, или перетащит меню. Вы так же не можете кликать по контролам в основном окне игре, клики нужно перехватывать до того как их сделают. Хорошо, что win32 API-функции представляют хорошие методы для этого:

WNDPROC wpOrigEditProc = (WNDPROC)SetWindowLong(hwnd, GWL_WNDPROC, (LONG) WndProc);

Где WndProc - это наша функция для управления различными посланиями окну, такими как клик кнопки мыши/нажатие клавиши, и wpOrigEditProc - это функция PWI. Теперь вы проверяете послания окну PWI, вашим ли контролам они адресованы, и если нет, вы вызываете wpOrigEditProc с теми же параметрами и игра продолжается по обычному сценарию.


Хорошо, это первый кирпичик по созданию внутриигрового меню. Проще посмотреть исходники, чтобы увидеть как это работает (итоговая функциональность программы, конечно, спорна, двухминутный исходник на авто ит мог бы сделать тоже самое). Структуры были созданы в программе "ReClass" которую можно найти ЗДЕСЬ ([Ссылки могут видеть только зарегистрированные и активированные пользователи]). Это изящный инструмент для исследования структуру игры в памяти.

Прикрепленный AutoPot.rar содержит Инжектор + DLL + ресурсы необходимые для отрисовки внутриигрового меню. Просто распакуйте это в папку Element (рядом с elementclient.exe)

Заметка: Для нормальной компиляции DLL нужно установить Direct3D 8 SDK. (прим. пер. - видимо исходники DLL автор уже удалил на момент перевода)

Ссылки на файлы:
AutoPot ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) - тот же что и на сайте.
Исходники инжектора ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

Примечание: Автопот не работает. Основная польза от этого - сам прицип создания меню для программ и инжектор DLL.

Скачать ReClass ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) - перезалил сюда, потому что по ссылке выше нужно пройти семь кругов ада чтобы скачать эту утилиту.

lcd1232
20.02.2012, 22:13
krukovis, Интересно. Обидно, что инжект на С++. Как я понимаю для создания полноценного бота придется потратить немало нервов и проблем.

Mars'
20.02.2012, 23:04
я так понял что можно внедрить в сам клиент игры чит который будет использовать графический интерфейс пв? Обьясните нубу

HellD
21.02.2012, 00:06
спс за труды ) как банкожер по мне так бред ) но дорожки может открыть не плохие )) видел тему в оригинале ) но идеи почему то зародились ток сейчас ) спс автору-переводчику ))

BritishColonist
21.02.2012, 06:10
>"Новое слово в создании.."
Слишком громко сказано ;D

PWI использует Direct3D 8, вы можете нагуглить метод прикрепления функции.
Что верно, то верно - удачного "нагугливания". Есть одна годная и подробная статья на немецком, ещё парочку видел на инглише, но там приводятся какие-то куски кода и не понятно, что с чем связано.

krukovis
21.02.2012, 07:07
Обидно, что инжект на С++. Как я понимаю для создания полноценного бота придется потратить немало нервов и проблем.

В статье описано только создание интерфейса. Для создания крутых ботов с огромным кол-вом настроек - думаю слишком сложно и проще воспользоваться обычными средствами. А для небольших утилиток с несколькими флажками или кнопками - очень даже можно и главное как это смотрится со стороны юзера - дополнительное меню в программе - круто же! :)
Саму DLL можно и на Delphi писать и на C# и вообще на любом языке.

Добавлено через 2 минуты
я так понял что можно внедрить в сам клиент игры чит который будет использовать графический интерфейс пв? Обьясните нубу
Нет, графический интерфейс нужно создавать самому. А в статье описан способ этот графический интерфейс в игру загрузить.

Добавлено через 5 минут
Слишком громко сказано
Есть еще инфа по этой теме? Расскажи что знаешь, пожалуйста. Очень хочется написать что то подобное.

BritishColonist
21.02.2012, 14:24
krukovis, я просто хотел сказать, что создание in-game интерфейса к плагину/читу - уже давно не новый подход, применяемый для удобного конфигурирования пользователями работы данного ПО.

Я знаю один хороший пример крутого чита с доступными исходниками (которые даже прокомментированы). Исходники эти запилены не одним файлом, а кучей файлов (для удобства), т.к. общее кол-во строк перевалило за 100K. Чит этот написан для GTA: San Andreas (в особенности - для San Andreas Multiplayer), при этом хочется заметить, что весьма здорово описаны многие стандартные (изначально созданные разработчиками самой игры) структуры, функции, перечисления (enum'ы). Ну так вот, чит этот использует весьма удобный интерфейс - окошко с пунктами меню. Можно листать всё клавишами, переходить в подменюшки. Собственно, вот линк: m0d_sa ([Ссылки могут видеть только зарегистрированные и активированные пользователи]). San Andreas использует DirectX9, а ElementClient (Perfect World, Jade Dynasty и т.д.) - DirectX8.

Такие вот дела.
Посетителей темы прошу поделиться ссылками на туториалы (пусть даже и иностранные) о "D3D-Hooking", либо поделиться личным опытом и знаниями в данной области.


edited:
Кстати, судя по скриншоту из шапки, можно сказать, что данное окно полностью вписывается в интерфейс самой игры. Сомневаюсь, что автор той статьи сам его рисовал (скорее всего взял из стандартных .pck-файлов), однако это навело на мысль о том, что можно не изощряться с DirectX, а создавать окна стандартными средствами игры (тогда у них будут стандартные обработчики (хукнуть которые будет в разы проще, чем EndScene) и с некоторыми функциями, например, с функцией закрытия окна, можно будет не заморачиваться).

P.S. krukovis, что-то ты давно не обновлял свой PW Patcher :D

edited#2:
Вот тут зачётные наработки: [Ссылки могут видеть только зарегистрированные и активированные пользователи]
Особо не разбирался, но вроде с помощью этого можно заменять любую оригинальную функцию своей и наоборот вызовом соответствующих функций (HookAPI и UnHookAPI).
А здесь, кажется, есть ещё и примеры: [Ссылки могут видеть только зарегистрированные и активированные пользователи]

krukovis
21.02.2012, 16:02
стати, судя по скриншоту из шапки, можно сказать, что данное окно полностью вписывается в интерфейс самой игры. Сомневаюсь, что автор той статьи сам его рисовал (скорее всего взял из стандартных .pck-файлов)
Не сомневайся - сам он не рисовал ничего. Все взято из *.pck.


krukovis, что-то ты давно не обновлял свой PW Patcher :D
Следишь... Польщен :pandal: Пользовался? Если да, отпишись о впечатлениях.

Не обновляю, потому что не знаю что еще добавить. Есть идеи?

Добавлено через 11 минут
а создавать окна стандартными средствами игры (тогда у них будут стандартные обработчики (хукнуть которые будет в разы проще, чем EndScene) и с некоторыми функциями, например, с функцией закрытия окна, можно будет не заморачиваться).

Игра - это программа эксплуататор, а не Visual Studio как ты там предполагаешь окна создавать? :). Там можно пользоваться только теми формами, которые уже были созданы чудесными китайскими программистами и в которые заложен некоторый функционал. Можно, конечно, при помощи асма вписать в игру какой то дополнительный функционал окну или убрать ненужный, но это ИМХО неблагодарный труд. И придется лишить пользователя какого то окошка, возможно очень ему нужного ))). Ну или в динамической памяти на время создавать контролы на готовых формах. Ну в любом случае - это много-много строк кода на асме. Может Hook D3D все же попроще будет?

BritishColonist
21.02.2012, 16:46
Пользовался?
Не, я сам такие штуки пишу ;P Однако для меня самое крутое в этой штучке - несомненно, горны и галочки в настройках чатов (ибо раньше я подобных вещей не встречал).

можно пользоваться только теми формами, которые уже были созданы
Думаю, там есть функция, создающая окошко. Ну точно должна быть. Как иначе?

Есть идеи?
Идеи? Даа.. Поделюсь? Неет ;D

Dinmaite
21.02.2012, 19:10
Думаю, там есть функция, создающая окошко. Ну точно должна быть. Как иначе?
Жестко заданные параметры окон. Нет как таковых контролов и тому подобного "изврата" винды.

BritishColonist
21.02.2012, 20:25
Жестко заданные параметры окон.
Будь это не Perfect World, я бы ещё, может, и сомневался в возможности этого.
Так или иначе, даже "жёстко заданные параметры" можно дополнить своими ;D
Хотя на это уйдёт немало времени и нервов..

VeTaL_UA
21.02.2012, 21:14
ElementClient (Perfect World, Jade Dynasty и т.д.) - DirectX8.
После Descent'а ПВ перешло на DX9. :)

BritishColonist
21.02.2012, 22:50
После Descent'а ПВ перешло на DX9.
Не перешло. Это подтверждается тем, что эта штучка ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) запускает плагины (через d3d8).
Однако, действительно, Perfect World так же кушает библиотеку d3d9.dll, что подтверждает инфа из отладчика.

Я полагаю, что основная отрисовка идёт всё же средствами старого доброго d3d8, т.к. та самая штучка ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) грузит плагины только при удачном перехвате функции "Direct3DCreate8".