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

Tiny Dumper. Руководство


MasterGH

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

Tiny Dumper ver 1.2

 

post-3-0-47847700-1425771312_thumb.png

 

Ссылка для скачивания Tiny Dumper 1.2

 

Пошаговое руководство по Tiny Dumper

 

 

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

 

 

1. Перед запуском CE устанавливаем файлы плагина в папку autorun (frmTinyDumper.xml и TinyDumper.lua)

 

2. Запускаем игру например "Painkiller - Battle out of Hell 1.64" поставленная в оконный режим через 3DAnalyze.

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

 

3. Запустить CE с установленным плагином и подключиться к игре

 

4. Ищем адрес здоровья (или брони, или патронов), тип Double (8 байт)

0x24571EA8 = 99.2900238037109

 

 

5. Ставим бряк на доступ или на запись на адрес 0x24571EA8

post-3-0-89287400-1420281457_thumb.jpg

 

6. Идем в игру и встаем под удар персонажем

Появляются инструкции

post-3-0-41271800-1420281464_thumb.jpg

и там же нажимаем на кнопку Stop, чтобы бряки не мешались в окне бряков

 

7. Берем например инструкцию

1015C194 - 89 53 08 - mov [ebx+08],edx

post-3-0-95128500-1420281470_thumb.jpg

По ней идем в дизассемблер и на инструкции жмем F5 - установка бряка на доступ

post-3-0-55338700-1420281476_thumb.png

 

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

EBX==0x24571EA0 (это условие взяли, потому что ebx находится в инструкции, а значение взяли EBX из отладчика)

post-3-0-54418500-1420281482_thumb.png

 

post-3-0-96973200-1420281487_thumb.png

Нажимаем Ок, идем в игру

 

9. Видим, что произошла остановка игры

post-3-0-70778800-1420281493_thumb.png

 

10. Открываем окно ТиниДампера

post-3-0-88476200-1420281498_thumb.png

 

11. Пишем значение регистра esp и название будущей зарегенной метки

post-3-0-97704000-1420281503_thumb.png

 

12. Нажимаем "Dump and Close" и CTRL+U чтобы видеть под рукой зареганные ваши метки

post-3-0-44910900-1420281515_thumb.png

13. Открываем окно расструктуризации CTRL+D и пишем метку в свободное поле

post-3-0-95796100-1420281520_thumb.png

14. Далее следуем действия как на рисунках

post-3-0-76956100-1420281527_thumb.pngpost-3-0-33596300-1420281533_thumb.png

15. Наконец результат

post-3-0-61545500-1420281539_thumb.png

 

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

 

16. Сейчас процесс игры остановлен на бряке кода. Чтобы продолжить игру. Удаляем бряк из окна бряков и отпускаем игру по F9.

 

17. Теперь снимаем другие дампы на том же адресе для адресов здоровья врагов на предмет отличиях их или для поиска указателей... Во всяком случае сохраненный дамп может дать какие-то подсказки и зацепки. Главное не начать новый уровень игры или не загружать сохранения, т.к. обычно при переходе на новый уровень данные могут измениться...

 

На этом пока все

 

Tiny dumper 1.2 Сравнение структур после перезагрузки. Поиск фильтра свой-чужой-дружественый

1. Запускаем игру, запускаем CE и присоединяем процесс игры к CE

2. Сохраняем игровой слот перед тем как искать структуры

3. Находим три структуры игроков: свой игрок, дружественный, враг

4. Дампим три структуры из пункта 3 указывая: базовый адрес структуры, уникальную метку

5. Игру закрываем, снова открываем, загружаем слот, присоединяем процесс игры к CE

6. В Tiny dumper 1.2 вызываем контекстное меню правой кнопки мышки и вызываем опцию "Rewrite dumps" - дампы из кеша перезаписываются в память в процесса игры

7. Снова находим три структуры игроков: свой игрой, дружественный, враг

8. В окне расструктуризации создаем три группы

Группа1 "Свой игрок":

-адрес после перезагрузки

-метка из тини дампера своего игрока до перезагрузки

Группа2 "Чужой игрок":

-адрес после перезагрузки

-метка из тини дампера чужого игрока до перезагрузки

Группа3 "Дружественный игрок":

-адрес после перезагрузки

-метка из тини дампера дружественного игрока до перезагрузки

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

10. Пишем АА-скрипт со смещением фильтра. Правильно написанный АА-скрипт не будет крешить игру.

11. Активируем АА-скрипт и проверяем в игре, что свой и дружественный игроки не получают урон, а вражеские получают урон. Если это не так, то берем другие смещения из пункта 9 и повторяем 10.

Если фильтр найти не удалось, то ищем 3 многоуровневых указателя до верхего статического адреса для своего, для 2-х врагов. Открываем Structure Spider.

Указываем в поиске уровень вложенности указателей.

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

 

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

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

Отлично! Надо будет сам ТиниДампер перенести в файловый архив (в категорию "Сборки и билды СЕ"), а руководство по работе оформить отдельной статьей (форумный раздел дорабатывается).

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

  • 4 недели спустя...

Парочка косметических поправочек ))

1. Dump size или Size of Dump (первый вариант правильнее), но никак не Size Dump.

2. Name for new registered symbol, или как-то так ) На мой взгляд, проще New dump name, ведь регистрируется, по сути, метка, указывающая на создаваемый дамп. То есть, его имя )

Сорри, если что, обидеть не хотел )

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

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

post-10895-0-77599800-1422956319_thumb.j

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

2 NullAlex

 

Потому что плагин ТиниДампер ищет подменю по названию "Tools" и не ищет "Инструменты".  В следующей версии Тини Дампера  я исправлю.

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

2 NullAlex

 

Потому что плагин ТиниДампер ищет подменю по названию "Tools" и не ищет "Инструменты".  В следующей версии Тини Дампера  я исправлю.

Ну, суть-то не в этом, а в том, что из-за языка - плагин не может встроиться в меню, поэтому я и обратил внимание пользователей на этот факт. Будет исправлено в следующей версии - отлично, но мало-ли, кому-то понадобятся предыдущие версии, а там - такое. :)

По этому поводу, кстати, может попробовать лучше не по названию пункта меню встраивать плагин, а по ID, или его аналогу какому-нибудь? Я API СЕ не изучал, но может там есть что-то такое, что позволит встроить плагин независимо от языка. Было-бы отлично.

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

лучше не по названию пункта меню встраивать плагин, а по ID, или его аналогу какому-нибудь?

ID как такого нет, можно взять порядковый номер "4"

 

local menuItems = getMemoryViewForm().findComponentByName('MainMenu1').Itemslocal count = menuItems.Count - 1for i = 0, count do	local item = menuItems.getItem(i)	if(item.Caption == 'Tools') then	     print(i) -- выводит 4	     break	endend

Т.е. можно сделать так

-----local menuItems = getMemoryViewForm().findComponentByName('MainMenu1').Itemslocal itemTools = menuItems.getItem(4)local mi = createMenuItem(popupmenu)menuItem_setCaption(mi, '* TinyDumper [Plugin]')menuItem_onClick(mi, OnClickMenuItemDT)itemTools.add(mi)-----

Обнова будет в следующей версии.

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

  • 3 недели спустя...

Сравнение структуры и её копии после события в игре

 

Найдено еще одно применение плагина.

 

Мы расструктуризовали структуру по базовому адресу, но если в ней что-то меняется, то это никак не сигнализируется и нельзя увидеть прошлое значение, а только значение в данный момент. Это и есть проблема. Я хочу увидеть, что изменилось в структуре после события в игре и плагин это позволяет сделать.

 

Посмотрим на примере игры СТАЛКЕР Чистое небо

 

1. Находим адрес патронов

2. Находим инструкцию после перезарядки на запись

03CD2C21 - 01 97 88060000 - add [edi+00000688],edx << 

EDI=3CA44080

3. Делаем перезарядку  и делаем плагином дамп по 3CA44080 с меткой количества патронов Ammo8

5. Делаем выстрел и делаем плагином дамп по 3CA44080 с меткой количества патронов Ammo7

6. Делаем выстрел и делаем плагином дамп по 3CA44080 с меткой количества патронов Ammo6

7. Расструктуризуем Ammo8. 

8. Добавляем экстраадреса Ammo7, Ammo6, 3CA44080

9. И наблюдаем все изменения

10. Поменяем в руке пукло на шотган и перенесем адрес  3CA44080 в новую группу. Покрутили вниз по фиолетовому цвету и нашли палевный поинтер... раскрываем и видим интересные данные, которые могут помочь, а могут и нет.. Во всяком случае с этим поинтером работает инструкция, которая меняет оружие и это может пригодится при чите, которое дает оружие

post-3-0-45686100-1424546802_thumb.png

 

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

 

Я решил поковырять сегодня Сталкера и вот случайно увидел потенциал сравнения дампов. Так что пользуйтесь при поиске id оружия или что-то в этом роде. Еще можно попробовать наводить прицел на игрока, на вещи и снимать его, и делать дампы по базовому адресу игрока. Подходить к вещи близко или далеко чтобы взять её и делать дампы... возможно что-то найдется интересное, а возможно и нет.

 


Пару слов и о Structure spider.  Он оказался очень похожим по сравнению структур через тини дампер, только в автоматическом режиме, а не вручную и на указанную глубину. Есть ограничения на правила поиска и тип данных. Правил поиска только три: изменилось, не изменилось, оба варианта. Правила поиска можно чередовать. Уровень вложенности сравнения структур можно задавать. Работают с двумя базовыми адресами. Тип данных: только один из предложенных: текст, 1,2,4,8 байта, float, double, pointer(HEX) Недостаток, который я заметил, это обновление значений с глюками - показываются значения указателей старые, пока не растянешь границы таблицы.

 

Пример поиска изменившихся данных в структуре, когда держим в руках оружие и не держим

post-3-0-69896000-1424552861_thumb.png

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

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

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

Vlad2 интересную идею подал по отличию данных после перезагрузки и после загрузки определенных слотов игры. Теоретически можно будет отличать как изменившиеся так и не изменившиеся данные.

 

Не изменившиеся после перезагрузки игры или слота:

1. Постоянные значения в структуре от начала базового адреса (id, типы, и прочее)

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

 

Изменившиеся после перезагрузки игры или слота это:

1. Меняющиеся адреса от начала базового адреса (динамические указатели, т.е. мы знаем, что по смещению от базового адреса меняется адрес после перезагрузки и это явление можно исследовать)

2. Меняющиеся данные от начала базового адреса (при загрузках разных слотов  где игрок имеет разный опыт и свойства)

 

----------

 

В новой версии накопились следующие задачи:

 

1. Поддержка в русской версии

2. Изменении в логике GUI. Если кликаем на запись в списке, то имя и адрес показываются в полях

3. Обдумать GUI и механизм сохранения и загрузки дампов, чтобы после перезагрузки игры можно было дампы с жесткого диска скопировать в память для исследования.

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

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

 

 

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

2. При выделении записи в поля прописываются данные

3. Добавлена опция сохранения дампов

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

5. Добавлена опция очистить таблицу

6. Добавлено несколько проверок с защитой "от дурака", если нужны еще проверки, то предложите

 

* Три новые функции добавлены в контекстное меню. Форма не изменилась.

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

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

 

Так что для тестов, новый файлец

 

TinyDumper 1.2.rar

 

Ну и для тех, кто хочет в первые в своей жизни увидеть сравнения структур после перезагрузки игры. Это просто песня. Нужно распаковать архив, там на два метра очень большой скрин всей этой расструктуризации. Структура из игры Сталкер Чистое Небо, которая хранит патроны на смещении +688. Это не совсем патроны, это счетчик структур патронов. Патроны имеют структурный тип. Этот большой скрин из архива лучше смотреть через баузер - придется скролить

 

CompareStructures.rar

 

 

 

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

Забрал. Потестирую сегодня вечером. Обязательно включу сей инструмент в один из уроков своих.

 

Как только оно появится, то я с интересом посмотрю такое видео  :)

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

Ну в толком ничего существенного не скажу, но 6 часов активно пользуюсь плагином и заметил такие чудеса:
Иногда при загрузке сохраненных дампов СЕ перестает отвечать. И еще когда определяешь структуру по сохраненному дампу, то данные из дампа(как я понял) записываются в какуюто область игры и игра крашится.
Хотелось бы в будущих версиях увидеть:
1. В дамп менеджере отображение всех загруженных дампов.
2, Чтоб при открытые сохраненных дампов, старые дампы из менеджера не удалялись, а лучше чтоб тебе спрашивали "Вы хотите объединить текущие дампы с существующими?". Если нет - заменить. Да - Добавлять новые.
3. Сохранение выделенных дампов.

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

Ну в толком ничего существенного не скажу, но 6 часов активно пользуюсь плагином и заметил такие чудеса:

Иногда при загрузке сохраненных дампов СЕ перестает отвечать. И еще когда определяешь структуру по сохраненному дампу, то данные из дампа(как я понял) записываются в какуюто область игры и игра крашится.

Хотелось бы в будущих версиях увидеть:

1. В дамп менеджере отображение всех загруженных дампов.

2, Чтоб при открытые сохраненных дампов, старые дампы из менеджера не удалялись, а лучше чтоб тебе спрашивали "Вы хотите объединить текущие дампы с существующими?". Если нет - заменить. Да - Добавлять новые.

3. Сохранение выделенных дампов.

 

Похоже релиз откладывается раз происходит вылет из игры. Буду тестить на ошибки.

 

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

2. Я думал над объединением, но тут мешают уникальные имена дампов. Если старые имена будут совпадать с загружаемыми, то получиться что дампы с существующими именами избирательно не смогут загружаться или их предлагать переименовывать последовательно. Так что я отказался от объединения. Лишние мороки.

3. Опять же из-за уникальности имен дампов нет смысла сохранять отдельные и подключать. Можно удалить ненужные оставив в таблице нужные и сохранить

 

Ближайшие задачи

1. После закрытия игры дампы можно было бы сохранять. Сейчас это сделать нельзя.

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

3. Буду проверять вылеты игры

 

Скорее всего, релиз откладывается не раньше  следующих выходных.

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

Новая версия

 

Функция потери процесса в CE Lua Engine не работает. Так что переписывание дампов нужно делать вручную через контекстную функцию. Dalloс из АА тоже не робит, память засоряется. Но 4Кб погоды не сделает, а это средний размер дампа для сравнения структуры.

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

А если сделать так:
При создании нового дампа во временных файлах будет создаваться файл, который будет нести в себе все созданные нами дампы.
Если процесс закрылся - не беда.
Открываем процесс заново, как он только открылся то подгружаем все дампы из временного файла в процесс. 
Когда СЕ закрывает - временный файл удаляем.

При вылете процесса все дампы будут сохранены и никуда не пропадут :)

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

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

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

В первый пост добавлено руководство "Сравнение структур после перезагрузки. Поиск фильтра свой-чужой-дружественый (Tiny dumper 1.2)

 

А если сделать так:

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

Если процесс закрылся - не беда.

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

Когда СЕ закрывает - временный файл удаляем.

При вылете процесса все дампы будут сохранены и никуда не пропадут :)

Функцию-обработчик подключения процесса нельзя вызывать в файлах-плагинах иначе её не смогут использовать другие луа скрипты

function onOpenProcess(processid)...end
Эта функция ниже, возвращающая id открытого процесса возвращает id-кешированный, когда процесс был уже закрыт, т.е. она не возвращает ноль, когда процесс был закрыт

getOpenedProcessID() : Returns the currently opened process. If none is open, returns 0
Все. Больше нет простых возможностей определить, что процесс был переоткрыт или отключен. Названные функции выше использовать нельзя для включения Rewrite dumps

В версиии Tiny dumper 1.2 временные файлы дампов практически больше не нужны. Так как теперь есть функция Rewrite dumps в контекстном меню. Её можно вызывать после переподключения к процессу. Сохранения и загрузки дампов по сути вообще не нужны. Только для подстраховки, что CE зависнет, например, при работе с Ultimap или DBVM

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

 

ИМХО лишняя функция - сохранение выделенных дампов в файл. Это все равно, что сохранять выделенные записи-читы в главной таблице CE.

 

Для "расклассифицирования" ты можешь называть дампы особым образом, чтобы отличать их. При это сохранять в один файл.

 

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

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

  • 11 месяцев спустя...

хотел проверить что за плагин Tiny Dumper ver 1.2 но он на последней версии Cheat Engine v 6.5 не работает.

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

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

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

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