17 сообщений в этой теме

Самый распространенный способ использования указателя в скриптах СЕ - это найти указатель автоматически, при помощи самого СЕ, и, затем, использовать его в скрипте

push eax

mov eax,[game.exe+123]

mov eax,[eax+456]

mov [address],eax

pop eax

Но данный способ не очень быстрый по поиску указателей и отсеиванию левых + приходится запускать виртуалку с ХР, чтобы окончательно выявить левые указатели. К тому же, после обновления игры, смещение в указателе может поменяться и тогда ни только нужно искать это смещение, но и не будет уверенности, что текущей трейнер будет работать на всех версиях игры (в случае использования аобскана).

Есть выход, а именно - найти в структуре игрока (или другого объекта, за который мы играем) смещение с уникальным статическим значением и уже его использовать в скрипте.

cmp [eax+123],1a2b3c

jne ....

В большинстве случаев, данный адрес, по этому смещению, не будет менять своего значения, даже после глобального обновления игры.

Допустим сделал я такой скрипт и все прекрасно работает, но игру я еще не прошел, а вдруг, на последнем уровне, есть вражеская единица, в структуре которого, адрес с этим же смещением, имеет то же значение, что и у нас.

Как узнать что это значение уникально только для нашей структуры в течении всей игры ? Мб есть какой прием ?

P.S. с этой проблемой еще не столкнулся, просто на "а вдруг?".

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ANT' date='07 Ноябрь 2010 - 19:27' timestamp='1289136454' post='1499']

Есть выход, а именно - найти в структуре игрока (или другого объекта, за который мы играем) смещение с уникальным статическим значением и уже его использовать в скрипте.

cmp [eax+123],1a2b3c

jne ....

В большинстве случаев, данное адрес по этому смещению не будет менять своего значения, даже после глобального обновления игры.

Думаю, что не для всех игр подойдёт такой прием. Для начала нужно узнать что это "1a2b3c" - поставить бряк на чтение и проанализировать что это за "зверь" , что это за значение, почему оно здесь.

ANT' date='07 Ноябрь 2010 - 19:27' timestamp='1289136454' post='1499']

Есть выход, а именно - найти в структуре игрока (или другого объекта, за который мы играем) смещение с уникальным статическим значением и уже его использовать в скрипте.

cmp [eax+123],1a2b3c

jne ....

Допустим сделал я такой скрипт и все прекрасно работает, но игру я еще не прошел, а вдруг, на последнем уровне, есть вражеская единица, в структуре которого, адрес с этим же смещением, имеет то же значение, что и у нас.

Как узнать что это значение уникально только для нашей структуры в течении всей игры ? Мб есть какой прием ?

Я думаю, тебе стоит смотреть по своему желанию. Поступить тут можно как угодно.

1) Возможно о "плохой" функции в трейнере тебе скажут пользователи (оставь им адрес твоей почты) и если они тебе напишут, то тогда уже стоит думать что делать дальше.

2) Написать хитрый скрипт: если "уникальное значение" расположено в нескольких структурах, то свернуть окно игры и выдать мессагу с уведомлением для пользователей и также для тебя самого. Для этого случая надо применить навыки смекалки и умение писать скрипты на CE.

Я все же сторонник своего метода: писать в адрес здоровья в зависимости от значений  флагов находящихся в массиве в определённой последовательности. Последовательность флагов "устанавливают инъекции" на определённых участках кода найденных по сигнатурам. Например, эта последовательность должна быть уникальная для героя которому делаем бессмертие. И склоняюсь я больше к этому методу, т.к. по моей интуиции у него больше вероятности стабильно работать при изменениях версий игры.  Дело в том что данные внутри структур могут быть более подвержены изменению чем изменение в логике срабатывания тех или иных участков кода. В твоём случае девелопер игры может изменить класс твоего героя (добавив пару полей в начало класса) и тогда твоё смещение "съедет вниз" или окажется где угодно из-за оптимизации компилятора. А в моём случае девелоперу придется изменить логику игры базовых действий, которых по идее менять-то и не нужно, а если и нужно, то мало вероятно. Но все это в теории, я на практике пока не реализовывал.   

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В твоём случае девелопер игры может изменить класс твоего героя (добавив пару полей в начало класса) и тогда твоё смещение "съедет вниз" или окажется где угодно из-за оптимизации компилятора.  

В этом случае, есть большая вероятность того, что поменяется и смещение нужного нам адреса (не того, которое мы используем как указатель, а основного, для которого пишем скрипт), а значит скрипт по любому работать не будет.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ты не совсем прав, должен быть особый подход - использование ассемблера и дизассемблера (я это делал на Дельфи в скрытом разделе).

Если помнишь я там выбрал несколько часто встречающихся инструкций для которых формируюется автоматически скрипт.

Разберём поподробнее. Вот возможные случаи при новом патче

Инструкция:

00456844: mov [eax+542],edx

Случай из которого можно выпутаться:

другой адрес: mov [другой регистр+другое смещение], другой регистр

Если же будет другая инструкция mov, то сигнатура не будет найдена и сделать уже ничего нельзя будет.

Если меняется смещение, то можно применить ассемблер и дизассемблер в трейнере и логику создания скриптов.  Это можно запрограммировать. Я это сделал включив модули CE ассемблера и дизассемблера, что увеличило размер трейнера. Но по сути в этих модулях ассемблера и дизассемблера можно оставить оставить только ассемблирование и дизассемблеривания некоторых инструкций: mov, add, sub, fld, fstp, push, pop, cmp и некоторых других, тогда это значительно сбавит размер модулей, которые можно будет включить в трейнер. Ну а пока я придерживаюсь своей цели. Один трейнер для многих игр, поэтому у меня бдует один трейнер и с включениеми этих модулей. А не сто трейнеров "тянущих" в себе ассемблер и дизассемблер или тянущих их как модули библиотек .dll

---

SER[G]ANT, можешь ли ты привести примеры игр, в которых тебе пришлось писать каждый раз трейнер при выходе нового патча. Одну игру я знаю это Метро 2033. Ещё есть игры?  

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

SER[G]ANT, можешь ли ты привести примеры игр, в которых тебе пришлось писать каждый раз трейнер при выходе нового патча. Одну игру я знаю это Метро 2033. Ещё есть игры?  

Если на вскидку вспомнить игры где менялись указатели и долго не думать, то

Disciples3

Elemental War of Magic

Front Mission Evolved

Maunt & Blade: Warband

Mafia2

StarCraft II

Эадор

Игры, где менялось смещение в инструкции

Maunt & Blade: Warband

Worms Reloaded

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо. Учту эти игры, когда буду что-то тестировать. Особенно привлекают две последние игры с изменяющимися смещениями. Если действительно в этих играх меняются смещения в инструкциях "в которые следует делать иньекцию", то без дизассемблера и ассемблера явно не обойтись.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо. Учту эти игры, когда буду что-то тестировать. Особенно привлекают две последние игры с изменяющимися смещениями. Если действительно в этих играх меняются смещения в инструкциях "в которые следует делать иньекцию", то без дизассемблера и ассемблера явно не обойтись.

Там не постоянно меняются смещения, а начиная с какого-то патча (в вормсах, начиная с v1.0.0.455, полностью изменилась инструкция, отвечающая за здоровье, в маунте изменилось смещение инструкция отвечающее за здоровье, но начиная с какого патча, не помню)

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Долго не заставил ждать с новостями...

Worms Reloaded

Версия  1.0.0.447

00451820 - 8b 88 88 00 00 00  - mov ecx,[eax+00000088]

// инструкция типа B - работает с адресами здоровья всех червяков, все адреса здоровья расположены по жёсткому смещению +0x88 от начала структуры (или структуры объекта)

В этой версии можно было найти рабочий адрес поиском 4 байта целое.

Версия 1.0.0.457

00650609 - 89 45 f6                  - mov [ebp-0a],eax

В этой версии найти рабочий адрес поиском 4 байта целое НЕЛЬЗЯ. Это адрес можно даже сказать "обманка" специально подсунутый разработчиками, потому что значение здоровья червяка восстанавливается на глазах. Т.к. я сегодня долго сидел за компом, голова разболелась, дальше копать не стал.

---

Вывод: первое впечатление, что найти универсальный метод чтобы трейнер работал и на той и на той версии практически не возможно. Т.к. вероятно ("вероятно, потому что я не особо ещё копался.)... в новом патче используется новая сигнатура кода для работы с адресом и мало того что "просто новая" - она имеет отличную от прошлой логику. В этом случае нужно писать заново трейнер для версии нового патча. Однако, есть ещё один вариант - ПОИСК ОДИНАКОВЫХ СИГНАТУР и на том и на том патчах и пытаться отталкиваться от них, возможно это будут сигнатуры не только кода, но и данных. Для этого надо написать особый сканер памяти.

Видно, что разработчики намерено изменили код работающий с данными полей объектов - это я думаю редкий случай (скорее исключение) и касается защиты от читинга. В остальных случаях такое тоже могут делать, но я сталкиваюсь с этим в первые. В Метро 2033 делали кучу патчев и логику работы с полями объектов не меняли ни разу и тоже касается ещё нескольких игр. Сказывает, ещё то что мне надо побольше практики в играх к которым пишут патчи.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Распишите все способы проверки указателей в редакторах памяти. Вроде Мастер писал где-то на Чемаксе способ - там вроде нужно было запускать кучу процессов. Я пользуюсь только одним - перезапускаю комп.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я вроде писал что-то типа этого.

1. Найти возможные указатели.

2. Закрыть игровой процесс.

3. Запускать не кучу процессов, а процесс (или несколько) который подгружает несколько своих dll-ок. Я этот способ уже не использую.

4. Запустить игровой прцесс и отсеять указатели.

Но я уже не помню, когда я применял этот способ последний раз и вообще уже давно от него отказался.

Сейчас все указатели ищу в дизассемблере через установку простого и условных брейкпоинтов. Подобно этому примеру из статьи.  И считаю это интересным единственным правильным способом. Иногда искать весь указатель не нужно, можно найти код который с ним работает и изменить его так чтобы указатель записывался в известный адрес. Таким образом весь указатель от статичного начала до конечной точки искать не нужно.

Ещё можешь поэкспериментировать с эмулятором Windows и запускать игровой процесс внутри него. Про этот способ спроси у SER[G]ANT-а. 

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А хорош ли такой способ - сделать поиск указателей, дважды перезапустить процесс игры/эмулятора, оба раза отсеяв указатели?

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В большинстве случаев это может помочь в играх эмуляторах при таком указателе.

[[Указатель на нулевой адрес]+смещение на данные в роме] = значение.

"Указатель на нулевой адрес" должен быть в статической памяти. В Арматни для этого можно посмотреть карту процесса.

"Смещение на данные в роме" в большинстве случаев не меняется. Но была какая-то игра то ли Томб Райдер. В ней при переходе на другой уровень адрес здоровья перемещался. Я так и не изучил в чём дело (похоже там ещё надо искать указатели и они скорее связаны с кодом эмулятора)

При повышении уровней указателей начинаются проблемы с выявлением правильного указателя. Решить эту проблему лучше всего в отладке.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо. Про карту процесса знаю. Вот я буду видеотуторы по созданию настроек эмуляторов делать - там лучше два раза перезапустить/отсеять указатели, чем ребутить комп и отсеивать только один раз?

Потом ещё есть эмуляторы, где указатель на нулевой адрес один (PC Engine/Turbografx эмулятор OOtake) - вот там надо ребутить комп и проверить работают ли адреса с этой настройкой, есть ли ещё способы?

Указатель на указатель вроде есть в Nes эмуляторе Nestopia.

>Но была какая-то игра то ли Томб Райдер. В ней при переходе на другой уровень адрес здоровья перемещался. Я так и не изучил в чём дело (похоже там ещё надо искать указатели и они скорее связаны с кодом эмулятора)

IBM PC имела 20-разрядную адресацию, что позволяло адресовать память до 1Mb. Физический 20-битный адрес формируется из двух 16-битных чисел: сегмент и смещение. Сегмент и смещение складываются, и получается физический 20-битный адрес. Сегмент может грузиться в разный физический адрес, а вот адресация внутри сегмента уже постоянна и не меняется. Именно поэтому адреса в таблице для DOS игр могут меняться и требуют использование команды "авто изменение адресов".

http://artmoney.ru/manual/russian/emul.htm

Изменено пользователем M4K
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

Спасибо. Про карту процесса знаю. Вот я буду видеотуторы по созданию настроек эмуляторов делать - там лучше два раза перезапустить/отсеять указатели, чем ребутить комп и отсеивать только один раз?

Не то и  не то решение не может быть правильным всегда на 100% ИМХО. Исследование я не проводил. В твоём случае проще ставить эмулятор винды, а внём запукать эмулятор ромов и проверять указатели. Это лучший вариант чем ребутить комп или перезапускать игру на одной и той же винде. Самый лучший вариант как я писал - дебажить.

Потом ещё есть эмуляторы, где указатель на нулевой адрес один (PC Engine/Turbografx эмулятор OOtake) - вот там надо ребутить комп и проверить работают ли адреса с этой настройкой, есть ли ещё способы?

Указатель на указатель вроде есть в Nes эмуляторе Nestopia.

О всех способах я уже написал, врядли кто-то знает ещё :) Если только не писать особую программу по распределению памяти в чужом процессе при каких-то условиях..

>Но была какая-то игра то ли Томб Райдер. В ней при переходе на другой уровень адрес здоровья перемещался. Я так и не изучил в чём дело (похоже там ещё надо искать указатели и они скорее связаны с кодом эмулятора)

Цитата

IBM PC имела 20-разрядную адресацию, что позволяло адресовать память до 1Mb. Физический 20-битный адрес формируется из двух 16-битных чисел: сегмент и смещение. Сегмент и смещение складываются, и получается физический 20-битный адрес. Сегмент может грузиться в разный физический адрес, а вот адресация внутри сегмента уже постоянна и не меняется. Именно поэтому адреса в таблице для DOS игр могут меняться и требуют использование команды "авто изменение адресов".

Про это мне стало известно ещё 3,5 года назад на 3-ем курсе по дисцеплине Микропроцессорная техника. Сложноть в том, что эмулятор ДосБокс это программа Windows. Это программа используя механизмы Windows распределяет память ПЛЮС эмулируемая платформа DOS "распределяет" память по правилам которые ты привел. Уловить эти две вещи у меня не было возможности, т.к. я не нашёл полную версию Томба Райдера. (помню я делал по этой игре видео).  

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ещё одна игра, в которой меняется смещение при переходе на другую карту - Gex на эмуляторе FreeDO (раздача с этой игрой http://rutracker.org/forum/viewtopic.php?t=458264). В других играх в этом эмуле нулевой адрес работает, а тут облом :(

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Понимаешь в чем дело. Игровой процесс всегда находит данные как бы они не были "закручены в клубок" по указателям или другим операциям... Если действительно требуется найти тот или иной указатель используй отладчик. Для эмулируемых программ свой отладчик (он может быть подходящим в некоторых эмуляторах), для Windows свой (как обычно OllyDbg или другие). 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

//aliast какую настройку ты пользуешь? http://www.artmoney....wnload_emul.htm

Пробуй FreeDo TestBuild 2.1 Alpha, там всё должно работать.

Читай здесь как настраивать управление: http://www.emu-land.net/forum/index.php/topic,1216.msg341742.html#msg341742

А смещение меняется для нулевого адреса или для адреса(ов) игровых параметров? Если второе, то надо найти разницу между адресом со старой карты и с новой, и потом прибавить эту разницу ко всем адресам первой карты. Вот тут - пока только три видео, во всех них есть это высчитывание разницы между группами адресов.

//MasterGH правила распределения памяти - это копипаст из справки к ArtMoney. А вообще разрабы давно писали что нужно чтобы указатель был в модуле EXE - так лучше всего. Или в каком-нибудь другом модуле (вот у меня когда-то в старой версии мультисистемного эмулятора MESS указательна нулевой адрес был в модуле messui.dll). Если указатель не в модуле, то он может работать на такой же версии ОС (например если сделан на XP SP2 - то будет работать на точно такой же), а на других вряд ли. Ещё, если указатель работает на двух разных ОС, то будет работать на всех. Пишу по памяти, ибо это письмо у меня не сохранилось)

Ещё можно тут почитать - эмулятор NullDC использует DMA, а Demul нет: http://forum.emu-rus...t=458&start=560

Также есть еще одна статья - в конце этой страницы: http://artmoney.ru/m...ian/advices.htm С примерами формул.

Изменено пользователем M4K
1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас