MasterGH Опубликовано 18 января, 2015 Поделиться Опубликовано 18 января, 2015 (изменено) Данный инструмент позволяет найти 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. Отображает результат отсева функций в поле 2022. Не понятно Что представляет из себя ветвь кода? Функция в программировании, например, в C++/C# . Показать контент Поток игры перемещающийся по регистру eip входит в call и выходит по ret обратно. Это и есть ветвь кода. Чем больше вложенных call-ов тем больше ветвь.В отладчике это будет какpush адрес2 // esp = esp + 4push адрес1 // esp = esp + 4call Summ // сместить esp = esp + 4 А в стеке будет пара аргументов. Результат может быть eax. Summ-функция это и есть ветвь кода или часть другой ветви кода... Пошаговая отладка?Она здесь не требуется, но может пригодиться на несколько шаговF5 - поставить бряк на call.F7 - исполнить инструкцию, если это будет call, то войти внутрь callF8 - исполнить инструкцию, если это будет 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) Выбросили вещь, нажали на кнопку 108) В игре подняли ту же вещь еще несколько раз, например еще 4 раза9) В поле 18 вводим количество раз поднятия 4 + 1 = 5 раз и нажать на 1410) Нажимаем на кнопку 21, показать адреса в поле 20 Чем найденных адресов меньше, тем лучше.Если адресов нет, то значит сделали что-то не правильно.Если адресов много, то значит дело тухлое. Либо поиск продолжать с пункта 7 пока адресов не станет меньше. 11) На каждом адресе или нескольких адресах двойной клик и нажать F5. 12) Поднимаем вещь. Игра должна прерваться. Все остальные бряки снимаем в окне бряков.13) Снимаем дамп со стека (о том как это делать здесь). Отпускаем игру по F914) Поднимаем еще вещь и опять снимаем дамп с другой меткой. Отпускаем игру по F916) Поднимаем другую вещь2 и опять снимаем дамп с другой меткой. Отпускаем игру по F917) Поднимаем другую вещь2 и опять снимаем дамп с другой меткой. Отпускаем игру по F918) Делаем расструктуризацию. Одна группа это дамп 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) Изменено 22 января, 2015 пользователем MasterGH Добавлены описания колонок для поля 20 (под первым спойлером). Ссылка на комментарий Поделиться на другие сайты Поделиться
Bromvol Опубликовано 18 января, 2015 Поделиться Опубликовано 18 января, 2015 MasterGH хорошая статья. Надо все это опробовать на практике. Хотелось бы еще и о Function Hacker узнать больше. Все равно спасибо за статью. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 19 января, 2015 Поделиться Опубликовано 19 января, 2015 Спасибо MasterGH. Много применений. Сделал в своей теме ссылку сюда. Как написал Bromvol - нужно будет все это опробовать на практике. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 19 января, 2015 Автор Поделиться Опубликовано 19 января, 2015 К сожалению, я с понедельника ограничен по времени и силам. Началась рабочая неделя. На данное время интересной информации по ломанию игрушек у меня нет. Надо наработать схему, по которой можно будет по происходящим действиям в игре искать функции, повторять их, не повторять, повторять с измененными аргументами... и прочее. Пока этой схемы нет и все прощупывается. В общем если что-то толковое появиться, то будут статьи и возможно даже видео (в том числе и Fallout 3, и по Chicken Invaders 4, где шифрованные значения, и по Function Hacker). Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 19 января, 2015 Поделиться Опубликовано 19 января, 2015 MasterGH. заранее БОЛШОЙ, ПРИБОЛШОЙ СПАСЫБ!!! Будем ждать.И хорошей рабочей недели! Ссылка на комментарий Поделиться на другие сайты Поделиться
aliast Опубликовано 22 января, 2015 Поделиться Опубликовано 22 января, 2015 (изменено) Да, было бы интересно разобрать хоть какой-нибудь рабочий пример по использованию этого Ultimap. А то в теории всё понятно, а на практике:Все игры какие я пробовал вылетают. Иногда просто вылетают, иногда с BSOD'ом Надо будет попробовать советы выше, но я вроде всё пробовал, ничего не помогает. Может кто потом поделится инфой на каких осях и конфигах компов вылетов меньше.Function Hacker не умеет аттачиться к 64-битным играм, а это - все современные игры Так что пока единственными играми в которых мне удалось воспользоваться вызовами call это две игры с PDB-файлами (файл с именами функций и их аргументов), а именно Cry of fear (делал квиксейвы) и Wolfenstein The new order (прохождение сквозь стены). Изменено 22 января, 2015 пользователем aliast Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 22 января, 2015 Поделиться Опубликовано 22 января, 2015 Насколько я помню, для работы ультимапа нужен работающий DBVM. У меня он даже на чистенькой Windows 7 работает через раз, так что приходится трейсить код в основном руками. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 22 января, 2015 Автор Поделиться Опубликовано 22 января, 2015 (изменено) В 22.01.2015 в 12:39, aliast сказал: Да, было бы интересно разобрать хоть какой-нибудь рабочий пример по использованию этого 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 очень капризный. Игры, которые я пытался с ним ковырять вылетаю через некоторое время В 22.01.2015 в 12:55, keng сказал: Насколько я помню, для работы ультимапа нужен работающий 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 и он занят. Изменено 22 января, 2015 пользователем MasterGH Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 24 января, 2015 Автор Поделиться Опубликовано 24 января, 2015 Эксперименты с Ultimap переносятся на другое время. Функции находятся и дампы со стека снимаются, и видны возможные аргументы функций как в стеке так и в регистрах, но происходят ошибки и вылеты при вызове функций... В ближайшее время лень ковыряться в рутине отладочного кода, когда можно провести время более весело. Тем не менее, мы когда-нибудь научимся вызывать любую функцию. Это обязательно произойдет. Если общими усилиями искать решение, то это произойдет еще быстрее. Подпишитесь на тему. Как будет что-то новое, то придет уведомление. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения