Русский / Russian English / Английский

Сейчас на форуме: (+3 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Вопросы новичков —› Помогите с CIV 3
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 0.4 (гость)
Статус: Участник

Создано: 27 октября 2019 14:51 New!
Цитата · Личное сообщение · #1

Всем привет, у меня проблема с нахождением статического адреса ресурсов (напр. денег) в игре civilization iii (версии 1.29f). Пробовал через CheatEngine 7.0 вел поиск по текущей сумме - не находит значение. Что интересно есть трейнер --> Link <-- где сумма без проблем добавляется. Помогите, в этой теме я новичок, программу по записи значения в память на плюсах уже написал, осталась проблема с адресом.

Ранг: 414.8 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 27 октября 2019 16:16 New!
Цитата · Личное сообщение · #2

d3coy пишет:
статического адреса ресурсов (

d3coy пишет:
вел поиск по текущей сумме - не находит значение.

ArtMoney находит? Деньги где-то в выделенной памяти. Проще всего искать крупные числа - 10 000, 100 000 и более. Даже если пошифровано где-то глубоко, то в gui выводится открытое значение. Но последнее крайне маловероятно.
Откройте .exe файл игры в отладчике, поищите строки "gold", "money" и тд. Обычно, когда денег в игрушке не хватает, выводятся предложения взять кредит в Сбербанке всякие ругательства или проигрываются звуки. Выложите сам. exe штоле.

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

| Сообщение посчитали полезным: d3coy


Ранг: 38.7 (посетитель)
Статус: Участник

Создано: 27 октября 2019 16:25 New!
Цитата · Личное сообщение · #3

d3coy, какой тип данных использовался при поиске? в некоторых играх видел данные хранились вещественными значениями, хотя в игре (в GUI) выводились как целочисленные


Ранг: 264.8 (наставник)
Статус: Участник

Создано: 27 октября 2019 16:33 New!
Цитата · Личное сообщение · #4

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


Ранг: 51.9 (постоянный)
Статус: Участник

Создано: 27 октября 2019 16:43 New!
Цитата · Личное сообщение · #5

d3coy пишет:
Пробовал через CheatEngine 7.0 вел поиск по текущей сумме - не находит значение.

А готовые таблицы для CheatEngine разве не для того служат, что бы это не искать вручную?

Ранг: 0.4 (гость)
Статус: Участник

Создано: 27 октября 2019 17:03 · Поправил: d3coy New!
Цитата · Личное сообщение · #6

Вот exe'шник --> Link <--. CheatEngine, ArtMoney не находит значение 2-4байта, float, double. Пробовал поискать по сохранениям - при изменении суммы (4693 -> 5512h, например на 5000) игра делает сохранение (.SAV -> .BAK) и загружает копию до изменений. Мне хочется научиться самому искать вручную статический адрес, но тут напряги прям.


Ранг: 51.9 (постоянный)
Статус: Участник

Создано: 27 октября 2019 18:07 New!
Цитата · Личное сообщение · #7

d3coy, для CIV 6 это выглядит так:
"You multiply your money by 256 and search 4 byte value for this value and use between search. For the upper bound multiply your money by 257. I was able to find gold using Cheat Engine with this."
Так что, может и в 3й подобная математика была.

Ранг: 0.4 (гость)
Статус: Участник

Создано: 27 октября 2019 19:13 New!
Цитата · Личное сообщение · #8

Adler пишет:
d3coy, для CIV 6 это выглядит так:

Блин, так и думал что там что-то такое. Спасибо, попробую

Добавлено спустя 46 минут
Adler пишет:
Так что, может и в 3й подобная математика была.

Умножение на 256 и 257 не сработало.


Ранг: 51.9 (постоянный)
Статус: Участник

Создано: 27 октября 2019 20:00 New!
Цитата · Личное сообщение · #9

d3coy, выше я ссылку дал на готовую таблицу CheatEngine, можно же пойти от обратного.

Ранг: 0.4 (гость)
Статус: Участник

Создано: 27 октября 2019 20:13 New!
Цитата · Личное сообщение · #10

Adler пишет:
выше я ссылку дал на готовую таблицу

Ну, скачаю я ее. А самому как научиться? Пробовал уже cs 1.6 нашел только значение денег на экране, в следующем раунде значение сбрасывается. Всю голову сломал уже.

Ранг: 38.7 (посетитель)
Статус: Участник

Создано: 27 октября 2019 20:44 · Поправил: user99 New!
Цитата · Личное сообщение · #11

d3coy пишет:
Ну, скачаю я ее. А самому как научиться?

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

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

в сетевых играх артмани и читенджин не всегда рулят

Ранг: 414.8 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 27 октября 2019 21:53 New!
Цитата · Личное сообщение · #12

d3coy пишет:
Пробовал уже cs 1.6 нашел только значение денег

В случае cs 1.6 читы в консоли существуют (impulse101) - через них проще всего выйти на money.

Заодно накиньте sv_gravity 100 - буст на ускорение поиска money в отладчике


Ранг: 329.0 (мудрец)
Статус: Участник

Создано: 28 октября 2019 18:57 New!
Цитата · Личное сообщение · #13

Как искать, по изменению значений ?

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

Это всё сомнительные способы. По нормальному нужно найти переменную связанную с искомым обьектом, а значит нужно найти обращение к обьекту. Обычно при выводе значения(отрисовки текста) есть промежуточная строка в буфере, даже если это посимвольный ввод к примеру. Что бы строку такую обнаружить, нужно либо изучать механизм вывода(те реверсить), либо крутить(трассировать). Учитывая что графика сильно загружает систему, то не совсем ясно как такое провернуть. Тем более что в играх обычно нужен быстрый отклик, не всегда можно ждать пока поток варится по часу.

Ранг: 414.8 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 28 октября 2019 20:28 New!
Цитата · Личное сообщение · #14

difexacaw пишет:
если значение округляется.

"Как это ... работает в игрушках?" Во всех игрушках, которые видел - начиная с X-COM и заканчивая Dota2 всегда money || gold || health || resources (что собственно читерится в 99% случаев, ТС так-же за них спрашивает) в integer/long и тд офомлялись. Понимаю округлять fload, double - броня у юнитов в Warcraft III разве что хранится так. Но там округление имеет смысл из-за артфектов, которые бафают variables юнита на проценты. Деньги то зачем округлять - к примеру остается у Вас 4 кредита в Dune 2000, а игра, исходя из Вашей логики выполнит округление до нуля. А ведь за 4 кредита можно 80% малой бетонной плиты построить, между прочим.

Ранг: 38.7 (посетитель)
Статус: Участник

Создано: 28 октября 2019 21:25 New!
Цитата · Личное сообщение · #15

ELF_7719116, в Borderlands 2 жизни, щиты и патроны имеют вещественный тип.

ELF_7719116 пишет:
к примеру остается у Вас 4 кредита в Dune 2000, а игра, исходя из Вашей логики выполнит округление до нуля

странное округление, все-таки по умолчанию округляется до целого, т.е. диапазон от 3.5 до 4.49 округляется до 4.

Ранг: 414.8 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 28 октября 2019 21:37 New!
Цитата · Личное сообщение · #16

user99 пишет:
умолчанию округляется до целого,

Там integer, запятых нет, округлять нечего. Конечно пост выше больше для лузлов был.

user99 пишет:
патроны имеют вещественный тип.

Три целых и два десятых патрона в магазине)


Ранг: 329.0 (мудрец)
Статус: Участник

Создано: 28 октября 2019 22:19 · Поправил: difexacaw New!
Цитата · Личное сообщение · #17

ELF_7719116

Игра как и любое иное апп может иметь произвольного типа переменные. Вот только что произвольно выбрал посмотреть небольшую игру --> Link <--

Там триал пол часа наверно, но хватает нескольких кликов в отладчике что бы найти переменную:



- загружается счётчик, int; затем вычисляется что то и округляется(важно что операции через fpu). Затем самое главное - значение идёт на вывод в текст, так почти всегда.

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

Ранг: 414.8 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 28 октября 2019 23:56 New!
Цитата · Личное сообщение · #18

difexacaw
Для gui оно то вполне работает с float аля DirectX. Тем более игрушка простая. Но графики и всего отрисовочного багажа, например, в той же dota 2 столько, что разбирать и дебажить не очень комфортно. Проще и интересней сам движок игры потрошить, попутно извлекая лузлы - https://exelab.ru/f/index.php?action=vthread&forum=2&topic=22501&page=0#29
В данном кейсе Valve не говнокодили - добраться до логики движка не сложно.
Алсо, если игрушка работает "клиент-сервер", то логика работы с resources всегда находится в соотвествующей dll'ке. Насколько помню, применительно к данному кейсу это tier.dll


Ранг: 89.6 (постоянный)
Статус: Участник

Создано: 29 октября 2019 00:11 · Поправил: Boostyq New!
Цитата · Личное сообщение · #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;
Учитывай что если будет писать память извне, может так получится что игра перепишет ключ после того как ты его прочитаешь и ты сгенерируешь неверное значение, ну получишь миллиарды тогда.


Ранг: 329.0 (мудрец)
Статус: Участник

Создано: 29 октября 2019 19:07 · Поправил: difexacaw New!
Цитата · Личное сообщение · #20

ELF_7719116

> Для gui оно то вполне работает с float аля DirectX. Тем более игрушка простая.

У меня такое впечатление что вы рассматриваете задачу даже не как задачу, а как сложности с отладкой при ручном" реверсе

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

В принципе такие тяжёлые апп можно и локальным визором крутнуть, я кстате попробую. Для этого необходимо скипнуть всю не нужную обработку, в частности графику. Я это уже пытался сделать, весьма успешно сработало --> Link <--

Если крутить лишь ключевую часть апп не трогая остальной код, то можно получить довольно высокое быстродействие и пытаться реализовать поиск строковых констант в динамике. Но для этого нужно решить одну небольшую проблемку, а именно - под визором ап не исполняемо и если функция, в которую отдаётся управление выполняет обратный вызов сработает ловушка и нужно фиксить точку входа, аналогично как в этой задаче(и таже проблема с патчем соотвественно) --> Link <--

Ранг: 414.8 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 29 октября 2019 19:41 New!
Цитата · Личное сообщение · #21

difexacaw пишет:
впечатление что вы рассматриваете задачу даже не как задачу, а как сложности с отладкой при ручном" реверс

Это заблуждение. Творческий подход к речешию задачи
difexacaw пишет:
Я это уже пытался сделать, весьма успешно сработало --> Link <-

Годный подход! :like:


Ранг: 329.0 (мудрец)
Статус: Участник

Создано: 29 октября 2019 19:52 New!
Цитата · Личное сообщение · #22

ELF_7719116

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


Ранг: 264.8 (наставник)
Статус: Участник

Создано: 30 октября 2019 06:09 New!
Цитата · Личное сообщение · #23

Понавыдумывают всякого.
Code:
  1. 004E2C9D MOV EAX,DWORD PTR DS:[618488]
  2. ...
  3. 004E2CA9 MOV ECX,EAX
  4. 004E2CAB SHL ECX,6
  5. 004E2CAE ADD ECX,EAX
  6. 004E2CB0 LEA ECX,[ECX*2+EAX]
  7. 004E2CB3 LEA EDX,[ECX*2+ECX]            
  8. ...
  9. 004E2CBB LEA EAX,[EDX*2+EAX]                 
  10. 004E2CBE MOV EDX,DWORD PTR DS:[EAX*8+65B660] 
  11. 004E2CC5 MOV ECX,DWORD PTR DS:[EAX*8+65B65C] 
  12. ...
  13. 004E2CD3 ADD EDX,ECX

То есть eax = (((DWORD[618488]*64 + DWORD[618488])*2 + DWORD[618488])*3)*2 + DWORD[618488]
или DWORD[618488]*787

На языке понятном ольге (на ctrl-G можно вставить):
Code:
  1. 0x65B660 + 0x1898*DWORD[0x618488]   ;значение раз
  2. 0x65B65C + 0x1898*DWORD[0x618488]   ;значение два


Два значения складываются, получается количество золота.


Ранг: 329.0 (мудрец)
Статус: Участник

Создано: 30 октября 2019 06:13 New!
Цитата · Личное сообщение · #24

f13nd

Как это найдено ?
И что дальше происходит со значением, оно печатается ?


Ранг: 264.8 (наставник)
Статус: Участник

Создано: 30 октября 2019 06:21 · Поправил: f13nd New!
Цитата · Личное сообщение · #25

difexacaw, чем-то типа принтфа форматится, если меню города закрываешь - брякается или на следующем ходе. Найдено хардварным бряком на строчку "золотых" (ascii), найденную в какой-то динамической области. Задача детская, никакие тут технологии не нужны.


Ранг: 89.6 (постоянный)
Статус: Участник

Создано: 30 октября 2019 13:27 · Поправил: Boostyq New!
Цитата · Личное сообщение · #26

f13nd пишет:
никакие тут технологии не нужны

Более того, тут и отладка не нужна, в иде нашла по строке недостаточно голды за 1 минуту, не понимаю зачем вы раскопали тоже самое, что я описала выше, но ок XD


Ранг: 329.0 (мудрец)
Статус: Участник

Создано: 30 октября 2019 18:45 New!
Цитата · Личное сообщение · #27

f13nd

Частный ведь случай строка. А если её нет как на скрине выше(символ $), поиск не получится. Только по значению, но если и его нет как в вашем случае, то придётся повозиться с отладчиком. Интересно общим путём решить.
Если найти печать статикой, нп сигнатурным сканом. Функции печати должны быть приблизительно похожи.

Ранг: 0.4 (гость)
Статус: Участник

Создано: 30 октября 2019 19:24 New!
Цитата · Личное сообщение · #28

Попробуй поискать моей программой


{ Атач доступен только для участников форума } - Topaz.zip


Ранг: 264.8 (наставник)
Статус: Участник

Создано: 30 октября 2019 20:25 New!
Цитата · Личное сообщение · #29

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


Ранг: 329.0 (мудрец)
Статус: Участник

Создано: 1 ноября 2019 19:52 New!
Цитата · Личное сообщение · #30

f13nd

Всё же мне интересен вариант решения статикой, если можно упростить, зачем тяжёлые инструменты. Нужно перебрать сотни игр что бы найти общее в функциях печати. Это займёт много времени, я играми не особо интересовался, так что не знаю как там печать реализуется. Если определить общий критерий достаточный для сигнатурного поиска функций печати, тогда можно решить автоматикой.
. 1 . 2 . >>
 eXeL@B —› Вопросы новичков —› Помогите с CIV 3

Видеокурс ВЗЛОМ