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

Ultimap


MasterGH

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

post-3-0-52397900-1421550577_thumb.png
 
Данный инструмент позволяет найти call-ы и ret-ы в игре, которые связаны с каким-то событием в игре. call - вход в ветвь кода, ret - выход из ветви кода.
 
Описание функций (пока не полное)


1. Нет данных.  Если игра вылетает, то попробовать поставить больше в два или более раз
2. Не понятно
3. Не понятно
4. Количество потоков по умолчанию 2 (если процесс поддерживает можно попробовать поставить 4 или больше). Если игра вылетает, попробовать поставить 1.
5. Не понятно
6. Начало сканирования
7. Пауза (код игры который выполняется вне паузы сканером не может учитываться)
8.  Остановить сканирование
9. Не понятно (возможно количество веток кода)
10. Код не выполнялся
11. Код выполнялся
12. Убрать из поиска инструкции между условным началом и ret  внутри ветви кода. Визуально это выглядит так. От начала функции до ret может попадать множество инструкций, которые выполнились так же по счетчику как и начало и ret. Это любые инструкции связанные с прыжками и с выходом из call-ов. Их можно убрать этой кнопкой.

 

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

 

 Начало и конец функции это границы условные. Есть очень компактное скопления дизассемблерного кода без выравнивая функций пустыми байтами и не поймешь где там начало, где конец... Я например не стал нажимать эту кнопку. Поставил на все адреса бряки и отпустил игру. К моему удивлению игра прервалась где-то в середине функции, а начало этой функции даже не было в списке. Поэтому лучше нажимать эту кнопку, только тогда, когда хотите оставить начала функций и конец, а остальное как мусор удалить. Если не уверены, то лучше не нажимать кнопку.

 

13. Не понятно. Вызывает сообщение об ошибке
14. Убрать из фильтра ветви кода, которые вызывались НЕ указанное количество раз
15. Выбрать специфичные модули (чем их меньше тем меньше вероятность вылета игры)
16. Если опция активна, то все новые данные (после последнего сканирования) исключаются из результата (на практике не проверено мной)
17. Сброс сканирования
18. Поле, в которое нужно ввести число количества раз вызова ветви кода и нажать на 14(самый эффективный способ отсеять не нужные ветви кода)
19. Сбросить счетчик (все ветви кода буду считаться с нуля)
20. Поле результатов. Первая колонка содержит адрес, на который прыгает call из второй колонки. Третья колонка - счетчик срабатываний call.
21. Отображает результат отсева функций в поле 20
22. Не понятно

 
Что представляет из себя ветвь кода?

 
Функция в программировании, например, в C++/C# .

Поток игры перемещающийся по регистру eip входит в call и выходит по ret обратно. Это и есть ветвь кода. Чем больше вложенных call-ов тем больше ветвь.

В отладчике это будет как
push адрес2 // esp = esp  + 4
push адрес1 // esp = esp  + 4
call Summ // сместить esp = esp  + 4
 
А в стеке будет пара аргументов. Результат может быть eax.
 
Summ-функция это и есть ветвь кода или часть другой ветви кода...

 
Пошаговая отладка?
Она здесь не требуется, но может пригодиться на несколько шагов
F5 - поставить бряк на call.
F7 - исполнить инструкцию, если это будет call, то войти внутрь call
F8 - исполнить инструкцию, если это будет call, то не входить внутрь call
 
Снять дамп стека?
Стек покажет характеристику части ветви кода, которая уже была пройдена. Можно снять дампы и отличить какую-то полезную информацию. Например дамп стека, когда подняли вещь1 и дамп стека, когда подняли вещь2 могут помочь в поднятии несуществующей вещи, т.е. вызов call со специальными параметрами. (о том как снять дам  здесь, пример вызова функции здесь)
 
Как значение попало в стек?
Иногда мы видим в стеке число. Это либо копия данных, либо результат, либо копия указателя на базовый адрес. Позарез надо узнать какая инструкция записала в стек это значение. Это можно сделать через тернистый путь реверса в пошаговой отладке с условным бряками (хороший пример). А можно здесь как в этой статье на видео через трейсер.  Если использовать трейс лог  важно отработать до автомата следующее. Останавливаем процсс на условном бряке. Затем пускаем трейс. Получаем трейс лог. Отпускаем игру. Поднимается вверх по call-ам через трейс лог до того как адрес в стеке будет иметь ложное значение, затем ныряем в глубь по F7 пока не найдем инструкцию, которая запишет в стекой адрес похожее число. Если это долго, то тупо ставим условный бряк на стековый адрес и F5 (отпустить игру). Этот бряк будет без остановки процесса. Хм...Я уже забыл как в CE сделать бряк на память и оставить процесс... В общем будет несколько инструкций в логе прервавшихся инструкций и там первая будет нужной.
 
Теоретически Ultimap поможет в следующих случаях:
1) повторить желаемое действие или избежать это действие

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

 
3) найти ветвь кода, которая работает только с определенным игроком

 
4) найти ветвь кода для поиска структуры игрока
здесь). Объединив дампы стека в группы  можно отличить нужные базовые указатели на структуры данных.
 
 
Как происходит поиск на примере поднятия оружия (внимание не проверено на практике, на практике попробую в течении не дели)

1) Подключаемся к процессу игры.
2) Жмем Кнопку Start(6)
3) Жмем Кнопку Выбора модуля (15). Выбираем главный *.exe игры и его *.dll в директории игры)
4) Идем в игру, которая должна быть в оконном режиме
5) В игре происходит желаемое действие (например, подняли вещь с земли в инвентарь)
6) Нажали на Кнопку 11, говорит о том что код был выполнен
7) Выбросили вещь, нажали на кнопку 10
8) В игре подняли ту же вещь еще несколько раз, например еще 4 раза
9) В поле 18 вводим количество раз поднятия 4 + 1 = 5 раз и нажать на 14
10) Нажимаем на кнопку 21, показать адреса в поле 20
 
Чем найденных адресов меньше, тем лучше.
Если адресов нет, то значит сделали что-то не правильно.
Если адресов много, то значит дело тухлое. Либо поиск продолжать с пункта 7 пока адресов не станет меньше.
 
11) На каждом адресе или нескольких адресах двойной клик и нажать F5. 
12) Поднимаем вещь. Игра должна прерваться. Все остальные бряки снимаем в окне бряков.
13) Снимаем дамп со стека (о том как это делать здесь). Отпускаем игру по F9
14) Поднимаем еще вещь и опять снимаем дамп с другой меткой. Отпускаем игру по F9
16) Поднимаем другую вещь2 и опять снимаем дамп с другой меткой. Отпускаем игру по F9
17) Поднимаем другую вещь2 и опять снимаем дамп с другой меткой. Отпускаем игру по F9
18) Делаем расструктуризацию. Одна группа это дамп 1 и дамп2 поднятой вещи1, другая группа это дамп 3 и дамп4 поднятой вещи. 
19) Поднимаем первую вещь, прервываемся и разбирае стек и в расструктуризацию дампов стека
 
Через сравнение дампов стека определяем, что предать в call на котором стоим. Т.к. мы ранее прервались на первой инструкции из множества других, то это должен быть самый верхний call и его параметры должны быть наиболее простыми.
 
20) Пытается написать АА скрипт, который вызывает новый поток игры и поднимает существующее оружие на замле. Затем пытаемся написать АА-скрипт, который пытается поднять не существующее оружие (или предмет). Если повезло, то все получиться
 
21) Связываем скрипт с горячими клавишами. И добавляем себе не существующее оружие множество раз
 
21 пункт это все теория... Пока...

 
 
Продолжение следует...

Например, теоритически можно

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

Если на ветке кода только наш игрок или только враг, то можно поискать зацепки в виде указателя на базовый адрес в стеке или где-то внутри ветви. Вытащить указатель в известный адрес и сравнивать в инъекции кода, когда делаем one hit kill, беск. патроны, здоровье или прочее

Если на ветке кода, точнее на call-е проходят множество разных игроков, предметов, вещей или прочее, то можно сравнить дампы со стека (о том как это делать

int Summ(int arg1, int arg2){  return arg1 + arg2;}int sum = Summ(5, 5)
Изменено пользователем MasterGH
Добавлены описания колонок для поля 20 (под первым спойлером).
Ссылка на комментарий
Поделиться на другие сайты

Спасибо MasterGH. Много применений. Сделал в своей теме ссылку сюда. Как написал Bromvol - нужно будет все это опробовать на практике.

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

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

 

Надо наработать схему, по которой можно будет по происходящим действиям в игре искать функции, повторять их, не повторять, повторять с измененными аргументами... и прочее. Пока этой схемы нет и все прощупывается. В общем если что-то толковое появиться, то будут статьи и возможно даже видео  (в том числе и Fallout 3, и по Chicken Invaders 4, где шифрованные значения, и по Function Hacker).

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

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

Все игры какие я пробовал вылетают. Иногда просто вылетают, иногда с BSOD'ом :( Надо будет попробовать советы выше, но я вроде всё пробовал, ничего не помогает. Может кто потом поделится инфой на каких осях и конфигах компов вылетов меньше.

Function Hacker не умеет аттачиться к 64-битным играм, а это - все современные игры :(

Так что пока единственными играми в которых мне удалось воспользоваться вызовами call это две игры с PDB-файлами (файл с именами функций и их аргументов), а именно Cry of fear (делал квиксейвы) и Wolfenstein The new order (прохождение сквозь стены).

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

Насколько я помню, для работы ультимапа нужен работающий DBVM. У меня он даже на чистенькой Windows 7 работает через раз, так что приходится трейсить код в основном руками.

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

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

Все игры какие я пробовал вылетают. Иногда просто вылетают, иногда с BSOD'ом :( Надо будет попробовать советы выше, но я вроде всё пробовал, ничего не помогает. Может кто потом поделится инфой на каких осях и конфигах компов вылетов меньше.

Function Hacker не умеет аттачиться к 64-битным играм, а это - все современные игры :(

Так что пока единственными играми в которых мне удалось воспользоваться вызовами call это две игры с PDB-файлами (файл с именами функций и их аргументов), а именно Cry of fear (делал квиксейвы) и Wolfenstein The new order (прохождение сквозь стены).

 

Привет. Ну, один пример уже был. Эта статья, которую ты переводил. Я просто не видел, что ты её переводил. Там я Ultimap-ом нашел зашифрованное значение. Можешь скачать эту игру и прогнать на практике. Т.е. ты на практике найдешь зашифрованное значение и место откуда оно вызывается

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

 

БСОД у меня был один раз, когда я игру зависшую под Ultimap закрывал, а в CE заранее не останавливал работу Ultimap

 

Ultimap очень сильно тормозит игру, дай Бог чтобы было 1 - 4 fps и то хорошо.

 

Win7 64. Настройки игры надо ставить по минимуму. Оконные режим с минимальным читабельным разрешением. Отключать все, что обращается к жесткому диску (Интернет, антивирусы, фаерволы и прочее). Чем меньше работаешь с Ultimap тем меньше шанс, что игра вылетет. При повторных поисках я перезагружал игру и CE. 

 

Function Hacker очень капризный. Игры, которые я пытался с ним ковырять вылетаю через некоторое время

 

 

Насколько я помню, для работы ультимапа нужен работающий DBVM. У меня он даже на чистенькой Windows 7 работает через раз, так что приходится трейсить код в основном руками.

 

DBVM у меня работает прекрасно. Не разу не было, чтобы он у меня не грузился.  Win7 64 Pro лицензия. Проц интеловский E7500 (2 ядра 2,9Гц), GTX 560 Ti видюха. Я думаю Ultimap хорошо работает на мощном процессоре с быстрой памятью. Есть второй комп на котором я мог бы потестить Ultimap, он помощнее (i5-4670K 4 ядра 3,4Гц, GTX 980, твердотельный накопитель, памяти 16 Гб уже не помню какой-то быстрой памяти) , но этот комп занят под игрушки. За ним постоянно играют в arch age и он занят.

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

Эксперименты с Ultimap переносятся на другое время. Функции находятся и дампы со стека снимаются, и видны возможные аргументы функций как в стеке так и в регистрах, но происходят ошибки и вылеты при вызове функций...

 

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

 

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

 

 Подпишитесь на тему. Как будет что-то новое, то придет уведомление.

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

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

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

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