Перейти к содержанию

Очередной нубский вопрос


Рекомендуемые сообщения

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

Надеюсь,меня поняли :-D

P.S. Бесконечный цикл не предлагать

Изменено пользователем User123
Ссылка на комментарий
Поделиться на другие сайты

Надеюсь,меня поняли

Не очень поняли. Лучше было пояснить, что именно ты хочешь сделать. А так можем только строить предположения.

 

У каждого адреса есть инструкции, которые срабатывают на запись (Брейкпоинт на запись) - ты говоришь про них, но есть инструкции, которые срабатывают на чтение (Брейкпоинт на чтение)- так вот эти инструкции работают обычно всегда и не нужно ждать нанесения урона.

 

 

Может они тебе подойдут?

 

 

Бесконечный цикл не предлагать

Если инструкция очень часто обращается к адресу, а тебе нужно чтобы скрипт срабатывал один раз, то это тоже не проблема, много тем на форуме по созданию одноразовых скриптов.

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

Например,я хочу занопить инструкцию,наносящую урон

Сделал сигнатуру,но CE ее не находит пока игроку не нанесется урон

Из чего я предположил,что инструкция появляется в памяти игры только тогда,когда она вызывается в первый раз


А на счет бесконечного цикла,я имею ввиду постоянное сканирование сигнатуры в памяти

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

Как найти сигнатуру, которой не существует до первого определенного действия в игре? 

 

Ответ. Никак. Это же очевидно  ;)

Вот я и спрашиваю,вдруг есть какой-то способ

 

Вопрос:как можно это обойти,то-есть сканировать сигнатуру сразу,как только эта функция появляется

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

Инструкция есть всегда - ее просто не может не быть до какого-то определенного момента, другой вопрос: почему твоя сигнатура не указывает на нужную инструкцию?

И вообще, тут нужно уточнить, как сканирует сигнатуру автор темы; если он пишет трейнер на C++, Delphi, Assembler, и т.д., то проблем с поиском инструкции (если сигнатура верна) - не должно, а вот если автор пишет скрипт на СЕ, то скрипт срабатывает при каждом вызове конкретной инструкции игрой.

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

В общем, я надеюсь, что я правильно понял вопрос автора темы.

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

Вопрос: как можно это обойти, то-есть сканировать сигнатуру сразу, как только эта функция появляется

Нужно искать сигнатуру только после того, как функция появляется. Именно тогда, когда сигнатура существует, то именно тогда её можно найти. Это 100%.

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

Привет!

 

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

 

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

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

Chrome Gold. Код распаковывался в выделенную память. Игра на яве. Защищенные старфорсом игры тоже распаковывали код динамически. Так что пока функция не сработает хотя бы раз - гарантий нет.

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

Кстати, Securom какой-то из версий тоже грешил шифрованием. Но старфорс - это виртуальная машина с шифрованием на лету по топологии диска. Вообще головная боль была для взлома.

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

Psi-Ops.The Mindgate Conspiracy

 

HEX-код
======================================

00371857(00771857) B9 63 00 00 00 90 [бесконечные патроны]

 

Как задействовать этот хекс-код?

СПС!

P.S. ну не люблю я патроны экономить, не люблю....

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

Как задействовать этот хекс-код?

 

 

Предполагаю, что  00371857 - байты оригинальной инструкцию, а 00 37 18 57 B9 63 00 00 00 90 - это сигнатура.

Тогда так:

Если скрипт не включается значит наоборот: 00771857 - байты оригинальной инструкции и скрипт будет таким:

Попробуй.

[ENABLE]aobscan(InfiniteAmmo, 00 37 18 57 B9 63 00 00 00 90) registersymbol(InfiniteAmmo)InfiniteAmmo: db 00 77 18 57[DISABLE]InfiniteAmmo:db 00 37 18 57unregistersymbol(InfiniteAmmo) 
[ENABLE]aobscan(InfiniteAmmo, 00 77 18 57 B9 63 00 00 00 90) registersymbol(InfiniteAmmo)InfiniteAmmo: db 00 37 18 57[DISABLE]InfiniteAmmo:db 00 77 18 57unregistersymbol(InfiniteAmmo) 
Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

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

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

Так что,кто-нибудь поможет?

 

Скорее всего, никто, т.к. надо писать код, а никто не хочет.

 

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

 

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

 

Еще вариант, внедрять dll, которая работает с Unity3d функциями и без всяких сигнатур ищет GameObject по типу или имени, ищет поле (закрытое или открытое) и правит его.

 

Еще можешь поковырять mono примочки в Cheat Engine, если будешь CE использовать. С ними можно искать объекты и менять их значения. Т.е. никаких dll своих делать не придется.

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

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

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

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

 

P.S. Бесконечный цикл не предлагать

Ладно,я понял,никто с этим еще не заморачивался :-D

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

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

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

В игре,вроде как,если тебе попадают в голову,то убивают с одного выстрела,так что не катит.

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

Как написал GodMod в этом случае, нашёл инструкцию, которая записывала в здоровье 0 (ставил брейкпоинт на доступ). И потом выше по коду нашёл условные прыжки (их там было несколько) и самый нижний заменил на безусловный прыжок jmp, чтобы код гарантированно перепрыгивал запись 0 в здоровье и весь это участок. 

Потом объединил полученный скрипт с основным и God Mod заработал.

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

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

Так а тема то о чем?Надо найти адрес инструкции,наносящей урон

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

Тогда тебе не повезло, потому что получается замкнутый круг.

 

Возможно тебе будет проще использовать цепочки указателей и заморозку значений.

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

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.