Я в отдельном файле прописываю оффсеты вот так:
#define OFFSET 0x34
подключаю файл к проекту и в программе уже пишу
mov esi, dword ptr [eax+OFFSET]
в делфи наверное есть тоже аналог #define
gurin, переменная объявлена внутри процедуры и инициализируется там же?
Значит в там же и открывается файл? Но ведь эта процедура выполняется в игре, а не в программе : D
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
Последний раз редактировалось BritishColonist; 23.04.2012 в 00:13.
Я в отдельном файле прописываю оффсеты вот так:
#define OFFSET 0x34
подключаю файл к проекту и в программе уже пишу
mov esi, dword ptr [eax+OFFSET]
в делфи наверное есть тоже аналог #define
Такой метод не подойдёт
Я хочу сделать так, что бы программу не надо было перекомпилировать под новые оффсеты.
Добавлено через 6 минут
Цитата:
Сообщение от BritishColonist
gurin, переменная объявлена внутри процедуры и инициализируется там же?
Значит в там же и открывается файл? Но ведь эта процедура выполняется в игре, а не в программе : D
Нет, файл открывается в моём приложении, данные передаются через параметры. Значения параметров верные. Внутри процедуры локальным переменным присваиваются значения переданные параметрами.
А все эти "ofs" инициализируются для передаваемой в функцию записи PWalkParams?
Добавлено через 33 минуты
Ладно, вот годный вариант.
До внедрения кода процедура находится в памяти приложения. В ней смещения и BA указаны статически (не переменными). Читаем из основной программы INI-конфиг, чтобы получить новые значения для BA и оффсетов, патчим код процедуры. Для этого понадобится определить точное смещение от начала процедуры до нужных оффсетов, следовательно, процедуру нужно правильно составить для частного случая (для определённых оффсетов), а затем исследовать в отладчике, чтобы получить смещения до оффсетов.
Уже пропатченный код можно внедрять (при этом патч придётся поставить лишь один раз - при считывании конфига).
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
Последний раз редактировалось BritishColonist; 23.04.2012 в 11:15.
Причина: Добавлено сообщение
До внедрения кода процедура находится в памяти приложения. В ней смещения и BA указаны статически (не переменными). Читаем из основной программы INI-конфиг, чтобы получить новые значения для BA и оффсетов, патчим код процедуры. Для этого понадобится определить точное смещение от начала процедуры до нужных оффсетов, следовательно, процедуру нужно правильно составить для частного случая (для определённых оффсетов), а затем исследовать в отладчике, чтобы получить смещения до оффсетов.
Уже пропатченный код можно внедрять (при этом патч придётся поставить лишь один раз - при считывании конфига).
О_О, эээмммм.... написать патч для собственного приложения? И как понимаю ни в коем случае не менять там ничего, а то не дай бог смещения поедут... Не, вариант с перекомпиляцией лучше. Во всяком случае надежнее.
Цитата:
Сообщение от dwa83
Проверял ли значения параметров ofs перед инжектом? Может считываются не правильно?
gurin, а в чём проблема установки патча в собственное приложение?
Просто при запуске берутся оффсеты и производится запись по некоторым адресам. Это несложно.
Я имел в виду "самопатч", чтобы программа изменила несколько байтов собственного кода. Этот код в любом случае будет выполнен не в самой программе, а в клиенте игры.
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
gurin, а в чём проблема установки патча в собственное приложение?
Просто при запуске берутся оффсеты и производится запись по некоторым адресам. Это несложно.
Я имел в виду "самопатч", чтобы программа изменила несколько байтов собственного кода. Этот код в любом случае будет выполнен не в самой программе, а в клиенте игры.
Мне кажется подобный путь еще больше проблем доставит. Все-таки хотелось бы понять как данные из переменных использовать в asm-коде. Там что-то простое, только вот что... знать бы
я заменил
mov esi, dword ptr [eax+$34]
на
mov esi, dword ptr [eax+ofs]
в связи с чем собственно и вопрос
патамуушта - сюрприз - ofs трактуется как адрес, а не как значение по этому адресу.
mov esi, dword ptr [ofs] - загружает значение переменной ofs
mov esi, dword ptr [eax+ofs] - загружает что?
ПОтому что не умеет оно в одной такой команде обращаться к двум адресам памяти сразу.
Чтобы корректно заработало нужно значение переменной в регистр сначала поместить, а потом уже пользоваться:
Код:
mov esi, ofs
mov esi, dword ptr [eax + esi]
________________
-------------------------------------------- PerfectAutoLogin v 7.4 - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
-------------------------------------------- [for 1.4.6] PW Patcher 12.0 - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
-------------------------------------------- InGamePatcher 1.2 - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
Чтобы корректно заработало нужно значение переменной в регистр сначала поместить, а потом уже пользоваться:
пробовал, но видимо не всеми регистрами можно пользоваться - вышибает клиента
понятно что пользовался не теми, что используются тут же, за исключением случаев, когда они там же и инициализировались
Судя из вышесказанного, я понял что понимаю я все верно. Буду копать. Спасибо всем кто ответил.
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]
#define в delphi нет. в XE тоже не появилось...
Аналога также нет)))
Да и include нормального няма) Всё клёвенько))))
include в delphi нормальный - полный аналог С++, даже лучше, т.к. без всяких условностей, аналога define не знаю, т.к. не требовалось столь жестко поступать, боюсь что он там есть и объявляется также, но не уверен, const вполне достаточно для моих целей
Цитата:
Сообщение от vogel
и всё отличненько работает.
но я хотел считывать адреса из файла, дабы не перекомпилировать программу каждый раз после обновы
решение тут пока вижу только одно
Цитата:
Сообщение от krukovis
Чтобы корректно заработало нужно значение переменной в регистр сначала поместить, а потом уже пользоваться: