eXeL@B —› Вопросы новичков —› Помогите с CIV 3 |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 27 октября 2019 14:51 · Личное сообщение · #1 Всем привет, у меня проблема с нахождением статического адреса ресурсов (напр. денег) в игре civilization iii (версии 1.29f). Пробовал через CheatEngine 7.0 вел поиск по текущей сумме - не находит значение. Что интересно есть трейнер |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 27 октября 2019 16:16 · Личное сообщение · #2 d3coy пишет: статического адреса ресурсов ( d3coy пишет: вел поиск по текущей сумме - не находит значение. ArtMoney находит? Деньги где-то в выделенной памяти. Проще всего искать крупные числа - 10 000, 100 000 и более. Даже если пошифровано где-то глубоко, то в gui выводится открытое значение. Но последнее крайне маловероятно. Откройте .exe файл игры в отладчике, поищите строки "gold", "money" и тд. Обычно, когда денег в игрушке не хватает, выводятся В крайнем случае, сложный способ: берете и делаете два сейва с разницей в деньгах - например, сделали сейв, за секунду заказали себе солдатиков (танки, здания, подводные лодки и тд) - сумма поменялась, делаете сейв и сравнивате байты. После нахождения байт, необходимо смотреть в отладчике, в каком месте читается сейв, и куда пишутся деньги | Сообщение посчитали полезным: d3coy |
|
Создано: 27 октября 2019 16:25 · Личное сообщение · #3 |
|
Создано: 27 октября 2019 16:33 · Личное сообщение · #4 Мало того, что тип данных может быть с плавающей точкой, само значение может скалироваться перед выводом на экран. Статического адреса у ресурсов может не быть, часто это цепочка вложенных объектов в динамически выделенной памяти. Ищи артманей через гориллиард отсеиваний изменилось/не изменилось, ставь в ольге бряк на обращение по этому адресу и изучай откуда адрес берется. ----- 2 оттенка серого |
|
Создано: 27 октября 2019 16:43 · Личное сообщение · #5 d3coy пишет: Пробовал через CheatEngine 7.0 вел поиск по текущей сумме - не находит значение. А |
|
Создано: 27 октября 2019 17:03 · Поправил: d3coy · Личное сообщение · #6 Вот exe'шник |
|
Создано: 27 октября 2019 18:07 · Личное сообщение · #7 |
|
Создано: 27 октября 2019 19:13 · Личное сообщение · #8 |
|
Создано: 27 октября 2019 20:00 · Личное сообщение · #9 |
|
Создано: 27 октября 2019 20:13 · Личное сообщение · #10 |
|
Создано: 27 октября 2019 20:44 · Поправил: user99 · Личное сообщение · #11 d3coy пишет: Ну, скачаю я ее. А самому как научиться? использовать готовую таблицу как помощник для первого поиска (по крайней мере там можно посмотреть как должно выглядеть значение в памяти) d3coy пишет: Пробовал уже cs 1.6 нашел только значение денег на экране, в следующем раунде значение сбрасывается. Всю голову сломал уже в сетевых играх артмани и читенджин не всегда рулят |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 27 октября 2019 21:53 · Личное сообщение · #12 |
|
Создано: 28 октября 2019 18:57 · Личное сообщение · #13 Как искать, по изменению значений ? Сравнить два дампа и найти разницу, при этом отфильтровать переменные которые изменились между двумя событиями(при изменении к примеру выводимого значения) - это не сработает, если значение округляется. Это всё сомнительные способы. По нормальному нужно найти переменную связанную с искомым обьектом, а значит нужно найти обращение к обьекту. Обычно при выводе значения(отрисовки текста) есть промежуточная строка в буфере, даже если это посимвольный ввод к примеру. Что бы строку такую обнаружить, нужно либо изучать механизм вывода(те реверсить), либо крутить(трассировать). Учитывая что графика сильно загружает систему, то не совсем ясно как такое провернуть. Тем более что в играх обычно нужен быстрый отклик, не всегда можно ждать пока поток варится по часу. ----- vx |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 28 октября 2019 20:28 · Личное сообщение · #14 difexacaw пишет: если значение округляется. "Как это ... работает в игрушках?" Во всех игрушках, которые видел - начиная с X-COM и заканчивая Dota2 всегда money || gold || health || resources (что собственно читерится в 99% случаев, ТС так-же за них спрашивает) в integer/long и тд офомлялись. Понимаю округлять fload, double - броня у юнитов в Warcraft III разве что хранится так. Но там округление имеет смысл из-за артфектов, которые бафают variables юнита на проценты. Деньги то зачем округлять - к примеру остается у Вас 4 кредита в Dune 2000, а игра, исходя из Вашей логики выполнит округление до нуля. А ведь за 4 кредита можно 80% малой бетонной плиты построить, между прочим. |
|
Создано: 28 октября 2019 21:25 · Личное сообщение · #15 ELF_7719116, в Borderlands 2 жизни, щиты и патроны имеют вещественный тип. ELF_7719116 пишет: к примеру остается у Вас 4 кредита в Dune 2000, а игра, исходя из Вашей логики выполнит округление до нуля странное округление, все-таки по умолчанию округляется до целого, т.е. диапазон от 3.5 до 4.49 округляется до 4. |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 28 октября 2019 21:37 · Личное сообщение · #16 |
|
Создано: 28 октября 2019 22:19 · Поправил: difexacaw · Личное сообщение · #17 ELF_7719116 Игра как и любое иное апп может иметь произвольного типа переменные. Вот только что произвольно выбрал посмотреть небольшую игру Там триал пол часа наверно, но хватает нескольких кликов в отладчике что бы найти переменную: - загружается счётчик, int; затем вычисляется что то и округляется(важно что операции через fpu). Затем самое главное - значение идёт на вывод в текст, так почти всегда. Я бы и искал в динамике текстовый вывод текущего счётчика, а не его значение в памяти. Так как текстовая строка и связывает счётчик с его отображением. Это просто повезло в данном случае, значение как инт лежит в памяти, иначе пришлось бы строки искать ----- vx |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 28 октября 2019 23:56 · Личное сообщение · #18 difexacaw Для gui оно то вполне работает с float аля DirectX. Тем более игрушка простая. Но графики и всего отрисовочного багажа, например, в той же dota 2 столько, что разбирать и дебажить не очень комфортно. Проще и интересней сам движок игры потрошить, попутно извлекая лузлы - https://exelab.ru/f/action=vthread&forum=2&topic=22501&page=0#29 В данном кейсе Valve не говнокодили - добраться до логики движка не сложно. Алсо, если игрушка работает "клиент-сервер", то логика работы с resources всегда находится в соотвествующей dll'ке. Насколько помню, применительно к данному кейсу это tier.dll |
|
Создано: 29 октября 2019 00:11 · Поправил: Boostyq · Личное сообщение · #19 d3coy пишет: Пробовал уже cs 1.6 нашел только значение денег на экране В онлайн играх такое не прокатит, потому что реальное значение денег хранится на сервере, и даже изменив значение у себя в клиенте кроме визуального эффекта ты ничего не получишь, даже если удасться отправить пакет на сервер о покупке чего-либо сервер все равно пошлет т.к. его значение ты никак не изменишь. Ты не уточнил было ли это онлайн, но даже если ты играешь не по сети, твой клиент так же создает локальный сервер, в этом случае ты уже можешь поменять значения, это должно быть в mp.dll ---- А по твоему основному вопросу, значение не всегда может хранится так, как ты думаешь. Деньги например могут хранится в числе 16-бит, когда ты ищешь 32-битное число, соседний байт рядом с этими 16 изменился и все, уже 32-битное значение будет другое. Так же значение может вообще быть зашифрованным, можно попробовать неточный поиск в Cheat Engine (не "Exact value" а "Unknown inital value", далее можно попробовать "Increased/Decreased value", но прокатит только если соблюдается какое-то умножение, иначе же можно пробовать "Changed/Unchanged value". При этом всегда нужно всячески вертеть значение, чтобы отсеивать от других, потому что их миллионы. Но это все не 100% варианты требующие мало знаний, в идеале проще найти где это число выводится, и уже оттуда узнавать какие преобразования с ним производятся и откуда оно читается, цепочку до статического адреса, но требует гораздо больше знаний статического анализа. ---- Рискну предположить, что инфа о цивилизациях хранится начиная с адреса 0x00065B618, класс размером 0x1898 байт, а конкретно деньги хранятся в двух 4-байтовых значениях по смещениям 0x44 и 0x48, итоговое значение денег это сумма этих двух значений, то есть первое это ключ, который просто генерируется из времени и часто меняется, а второе это количество денег минус ключ. Т.е. тебе нужно uint32_t civ3_exe = 0x400000; // тут адрес базы игры, если меняется то получай откуда-нибудь int civ_idx = ??; // тут нужно узнать/подобрать номер своей цивилизации, мб твоя это 0 uint8_t* civ_ptr = (uint8_t*)(civ3_exe + 0x25B618 + (civ_idx * 0x1898)); uint32_t gold_key = *(const uint32_t*)(civ_ptr + 0x44); uint32_t new_gold_val = 123456; *(uint32_t*)(civ_ptr + 0x48) = new_gold_val - gold_key; Учитывай что если будет писать память извне, может так получится что игра перепишет ключ после того как ты его прочитаешь и ты сгенерируешь неверное значение, ну получишь миллиарды тогда. ----- В облачке многоточия |
|
Создано: 29 октября 2019 19:07 · Поправил: difexacaw · Личное сообщение · #20 ELF_7719116 > Для gui оно то вполне работает с float аля DirectX. Тем более игрушка простая. У меня такое впечатление что вы рассматриваете задачу даже не как задачу, а как сложности с отладкой при ручном" реверсе На тип переменной и работу с ней не влияет предназначение софта. Толщина игровой среды это помеха лишь для автоматики по таймингу. Для визоров нет размера и сложности кода, есть лишь тайминг для обработки В принципе такие тяжёлые апп можно и локальным визором крутнуть, я кстате попробую. Для этого необходимо скипнуть всю не нужную обработку, в частности графику. Я это уже пытался сделать, весьма успешно сработало Если крутить лишь ключевую часть апп не трогая остальной код, то можно получить довольно высокое быстродействие и пытаться реализовать поиск строковых констант в динамике. Но для этого нужно решить одну небольшую проблемку, а именно - под визором ап не исполняемо и если функция, в которую отдаётся управление выполняет обратный вызов сработает ловушка и нужно фиксить точку входа, аналогично как в этой задаче(и таже проблема с патчем соотвественно) ----- vx |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 29 октября 2019 19:41 · Личное сообщение · #21 |
|
Создано: 29 октября 2019 19:52 · Личное сообщение · #22 ELF_7719116 Единственно возможное решение в данном случае. Константа всегда печатается перед отрисовкой, а это событие можно найти только визором, так как это промежуточное событие. В идеале можно пойти дальше и связать выборки по данным, тем самым найти по строке саму переменную(наследование указателей), но реализация по времени слишком тяжёлая. ----- vx |
|
Создано: 30 октября 2019 06:09 · Личное сообщение · #23 Понавыдумывают всякого. Code:
То есть eax = (((DWORD[618488]*64 + DWORD[618488])*2 + DWORD[618488])*3)*2 + DWORD[618488] или DWORD[618488]*787 На языке понятном ольге (на ctrl-G можно вставить): Code:
Два значения складываются, получается количество золота. ----- 2 оттенка серого |
|
Создано: 30 октября 2019 06:13 · Личное сообщение · #24 |
|
Создано: 30 октября 2019 06:21 · Поправил: f13nd · Личное сообщение · #25 |
|
Создано: 30 октября 2019 13:27 · Поправил: Boostyq · Личное сообщение · #26 |
|
Создано: 30 октября 2019 18:45 · Личное сообщение · #27 f13nd Частный ведь случай строка. А если её нет как на скрине выше(символ $), поиск не получится. Только по значению, но если и его нет как в вашем случае, то придётся повозиться с отладчиком. Интересно общим путём решить. Если найти печать статикой, нп сигнатурным сканом. Функции печати должны быть приблизительно похожи. ----- vx |
|
Создано: 30 октября 2019 19:24 · Личное сообщение · #28 |
|
Создано: 30 октября 2019 20:25 · Личное сообщение · #29 |
|
Создано: 01 ноября 2019 19:52 · Личное сообщение · #30 f13nd Всё же мне интересен вариант решения статикой, если можно упростить, зачем тяжёлые инструменты. Нужно перебрать сотни игр что бы найти общее в функциях печати. Это займёт много времени, я играми не особо интересовался, так что не знаю как там печать реализуется. Если определить общий критерий достаточный для сигнатурного поиска функций печати, тогда можно решить автоматикой. ----- vx |
. 1 . 2 . >> |
eXeL@B —› Вопросы новичков —› Помогите с CIV 3 |