MasterGH Опубликовано 3 января, 2015 Поделиться Опубликовано 3 января, 2015 (изменено) Tiny Dumper ver 1.2 Ссылка для скачивания 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 6. Идем в игру и встаем под удар персонажем Появляются инструкции и там же нажимаем на кнопку Stop, чтобы бряки не мешались в окне бряков 7. Берем например инструкцию 1015C194 - 89 53 08 - mov [ebx+08],edx По ней идем в дизассемблер и на инструкции жмем F5 - установка бряка на доступ 8. Открываем окно бряков, выделяем инструкцию и пишем условие на прерывание с остановкой процесса EBX==0x24571EA0 (это условие взяли, потому что ebx находится в инструкции, а значение взяли EBX из отладчика) Нажимаем Ок, идем в игру 9. Видим, что произошла остановка игры 10. Открываем окно ТиниДампера 11. Пишем значение регистра esp и название будущей зарегенной метки 12. Нажимаем "Dump and Close" и CTRL+U чтобы видеть под рукой зареганные ваши метки 13. Открываем окно расструктуризации CTRL+D и пишем метку в свободное поле 14. Далее следуем действия как на рисунках 15. Наконец результат Не только сохраняются данные, которые пропадут на следующий такт процессора, но и расструктуризовали и можем сравнивать эти данные с другими дампами стека. Зачем, как и для чего это выходит за рамки этого руководства. 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 как минимум фильтр свой-чужой можно сделать всегда. Что касается дружественных игроков, то нужно будет исследовать более углубленно. Изменено 8 марта, 2015 пользователем MasterGH 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 3 января, 2015 Поделиться Опубликовано 3 января, 2015 Отлично! Надо будет сам ТиниДампер перенести в файловый архив (в категорию "Сборки и билды СЕ"), а руководство по работе оформить отдельной статьей (форумный раздел дорабатывается). Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 26 января, 2015 Поделиться Опубликовано 26 января, 2015 Парочка косметических поправочек ))1. Dump size или Size of Dump (первый вариант правильнее), но никак не Size Dump.2. Name for new registered symbol, или как-то так ) На мой взгляд, проще New dump name, ведь регистрируется, по сути, метка, указывающая на создаваемый дамп. То есть, его имя )Сорри, если что, обидеть не хотел ) Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 26 января, 2015 Автор Поделиться Опубликовано 26 января, 2015 Xipho, я очень благодарен за помощь. С минуты на минуту будет новый плагин. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 3 февраля, 2015 Поделиться Опубликовано 3 февраля, 2015 Важное замечание по плагину есть, кстати, что если язык выставлен не английский по-умолчанию, то плагина в "Инструментах" ("Tools") - нет. Чтобы его использовать - нужно переключить языковой файл на английский, и перезапустить СЕ, и после этого плагин станет доступен в "Tools". Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 3 февраля, 2015 Автор Поделиться Опубликовано 3 февраля, 2015 2 NullAlex Потому что плагин ТиниДампер ищет подменю по названию "Tools" и не ищет "Инструменты". В следующей версии Тини Дампера я исправлю. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 3 февраля, 2015 Поделиться Опубликовано 3 февраля, 2015 В 03.02.2015 в 09:53, MasterGH сказал: 2 NullAlex Потому что плагин ТиниДампер ищет подменю по названию "Tools" и не ищет "Инструменты". В следующей версии Тини Дампера я исправлю.Ну, суть-то не в этом, а в том, что из-за языка - плагин не может встроиться в меню, поэтому я и обратил внимание пользователей на этот факт. Будет исправлено в следующей версии - отлично, но мало-ли, кому-то понадобятся предыдущие версии, а там - такое. По этому поводу, кстати, может попробовать лучше не по названию пункта меню встраивать плагин, а по ID, или его аналогу какому-нибудь? Я API СЕ не изучал, но может там есть что-то такое, что позволит встроить плагин независимо от языка. Было-бы отлично. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 3 февраля, 2015 Автор Поделиться Опубликовано 3 февраля, 2015 В 03.02.2015 в 10:11, NullAlex сказал: лучше не по названию пункта меню встраивать плагин, а по 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)-----Обнова будет в следующей версии. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 21 февраля, 2015 Автор Поделиться Опубликовано 21 февраля, 2015 Сравнение структуры и её копии после события в игре Найдено еще одно применение плагина. Мы расструктуризовали структуру по базовому адресу, но если в ней что-то меняется, то это никак не сигнализируется и нельзя увидеть прошлое значение, а только значение в данный момент. Это и есть проблема. Я хочу увидеть, что изменилось в структуре после события в игре и плагин это позволяет сделать. Посмотрим на примере игры СТАЛКЕР Чистое небо 1. Находим адрес патронов2. Находим инструкцию после перезарядки на запись03CD2C21 - 01 97 88060000 - add [edi+00000688],edx << EDI=3CA440803. Делаем перезарядку и делаем плагином дамп по 3CA44080 с меткой количества патронов Ammo85. Делаем выстрел и делаем плагином дамп по 3CA44080 с меткой количества патронов Ammo76. Делаем выстрел и делаем плагином дамп по 3CA44080 с меткой количества патронов Ammo67. Расструктуризуем Ammo8. 8. Добавляем экстраадреса Ammo7, Ammo6, 3CA440809. И наблюдаем все изменения10. Поменяем в руке пукло на шотган и перенесем адрес 3CA44080 в новую группу. Покрутили вниз по фиолетовому цвету и нашли палевный поинтер... раскрываем и видим интересные данные, которые могут помочь, а могут и нет.. Во всяком случае с этим поинтером работает инструкция, которая меняет оружие и это может пригодится при чите, которое дает оружие Т.е. теперь можно сравнивать все, что придет в голову после случившихся событий в игре и из кучи мусора находить отличия. Затем можно группировать дампы по событиям... Я решил поковырять сегодня Сталкера и вот случайно увидел потенциал сравнения дампов. Так что пользуйтесь при поиске id оружия или что-то в этом роде. Еще можно попробовать наводить прицел на игрока, на вещи и снимать его, и делать дампы по базовому адресу игрока. Подходить к вещи близко или далеко чтобы взять её и делать дампы... возможно что-то найдется интересное, а возможно и нет. Пару слов и о Structure spider. Он оказался очень похожим по сравнению структур через тини дампер, только в автоматическом режиме, а не вручную и на указанную глубину. Есть ограничения на правила поиска и тип данных. Правил поиска только три: изменилось, не изменилось, оба варианта. Правила поиска можно чередовать. Уровень вложенности сравнения структур можно задавать. Работают с двумя базовыми адресами. Тип данных: только один из предложенных: текст, 1,2,4,8 байта, float, double, pointer(HEX) Недостаток, который я заметил, это обновление значений с глюками - показываются значения указателей старые, пока не растянешь границы таблицы. Пример поиска изменившихся данных в структуре, когда держим в руках оружие и не держим Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 24 февраля, 2015 Поделиться Опубликовано 24 февраля, 2015 Я просто сделал так:if (item.Caption == 'Tools') or (item.Caption == 'Инструменты') thenИ заработало на обеих версиях Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 24 февраля, 2015 Поделиться Опубликовано 24 февраля, 2015 (изменено) Былобы не плохо, сделать дамп куска памяти, загрузить его в анализ структур и сохранить. Чтоб можно было его потом открыть.Это очень бы помогло в поиске идентификатора. А то очень часто предполагаемый идентификатор меняется после перезапуска.А так сохранил структуру своего игрока и нескольких других. Перезапустил игру, опять нашел адреса и сохранил новую структуру.Потом взяли и в анализ структур загрузили наши 2 сдампленные структуры и нашли различия. Изменено 24 февраля, 2015 пользователем Vlad2 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 24 февраля, 2015 Автор Поделиться Опубликовано 24 февраля, 2015 Vlad2 интересную идею подал по отличию данных после перезагрузки и после загрузки определенных слотов игры. Теоретически можно будет отличать как изменившиеся так и не изменившиеся данные. Не изменившиеся после перезагрузки игры или слота:1. Постоянные значения в структуре от начала базового адреса (id, типы, и прочее)2. Статические адреса в структуре от начала базового адреса (указывающий на место в памяти) Изменившиеся после перезагрузки игры или слота это:1. Меняющиеся адреса от начала базового адреса (динамические указатели, т.е. мы знаем, что по смещению от базового адреса меняется адрес после перезагрузки и это явление можно исследовать)2. Меняющиеся данные от начала базового адреса (при загрузках разных слотов где игрок имеет разный опыт и свойства) ---------- В новой версии накопились следующие задачи: 1. Поддержка в русской версии2. Изменении в логике GUI. Если кликаем на запись в списке, то имя и адрес показываются в полях3. Обдумать GUI и механизм сохранения и загрузки дампов, чтобы после перезагрузки игры можно было дампы с жесткого диска скопировать в память для исследования. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 1 марта, 2015 Автор Поделиться Опубликовано 1 марта, 2015 У кого есть желание, время и опыт просьба потестить перед релизом. Начиная от проверки названия новых опций и заканчивая тестированием новых функций. 1. Исправлено подключение к русской версии. Этот способ предложили выше, мне он больше понравился2. При выделении записи в поля прописываются данные3. Добавлена опция сохранения дампов4. Добавлена опция загрузки дампов. Если в таблице что-то есть, то будет диалог с предупреждением о потери данных на инглише. Кнопки Да/нет. Если да, то показывается диалог о выборе файлов. Если выбор подтверждается, то загружаются дампы из файла5. Добавлена опция очистить таблицу6. Добавлено несколько проверок с защитой "от дурака", если нужны еще проверки, то предложите * Три новые функции добавлены в контекстное меню. Форма не изменилась. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 1 марта, 2015 Автор Поделиться Опубликовано 1 марта, 2015 Бала исправлена критическая ошибка, которая вызывала вылет из игры после загрузки дампов из файла. Так что для тестов, новый файлец TinyDumper 1.2.rar Ну и для тех, кто хочет в первые в своей жизни увидеть сравнения структур после перезагрузки игры. Это просто песня. Нужно распаковать архив, там на два метра очень большой скрин всей этой расструктуризации. Структура из игры Сталкер Чистое Небо, которая хранит патроны на смещении +688. Это не совсем патроны, это счетчик структур патронов. Патроны имеют структурный тип. Этот большой скрин из архива лучше смотреть через баузер - придется скролить CompareStructures.rar Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 1 марта, 2015 Поделиться Опубликовано 1 марта, 2015 Забрал. Потестирую сегодня вечером. Обязательно включу сей инструмент в один из уроков своих. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 1 марта, 2015 Автор Поделиться Опубликовано 1 марта, 2015 В 01.03.2015 в 09:13, Xipho сказал: Забрал. Потестирую сегодня вечером. Обязательно включу сей инструмент в один из уроков своих. Как только оно появится, то я с интересом посмотрю такое видео Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 1 марта, 2015 Поделиться Опубликовано 1 марта, 2015 Ну, до этого видео еще несколько предстоит, так что не думаю, что очень скоро появится, но появится обязательно. Полезный инструмент. Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 1 марта, 2015 Поделиться Опубликовано 1 марта, 2015 Ну в толком ничего существенного не скажу, но 6 часов активно пользуюсь плагином и заметил такие чудеса:Иногда при загрузке сохраненных дампов СЕ перестает отвечать. И еще когда определяешь структуру по сохраненному дампу, то данные из дампа(как я понял) записываются в какуюто область игры и игра крашится.Хотелось бы в будущих версиях увидеть:1. В дамп менеджере отображение всех загруженных дампов.2, Чтоб при открытые сохраненных дампов, старые дампы из менеджера не удалялись, а лучше чтоб тебе спрашивали "Вы хотите объединить текущие дампы с существующими?". Если нет - заменить. Да - Добавлять новые.3. Сохранение выделенных дампов. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 1 марта, 2015 Автор Поделиться Опубликовано 1 марта, 2015 В 01.03.2015 в 14:05, Vlad2 сказал: Ну в толком ничего существенного не скажу, но 6 часов активно пользуюсь плагином и заметил такие чудеса:Иногда при загрузке сохраненных дампов СЕ перестает отвечать. И еще когда определяешь структуру по сохраненному дампу, то данные из дампа(как я понял) записываются в какуюто область игры и игра крашится.Хотелось бы в будущих версиях увидеть:1. В дамп менеджере отображение всех загруженных дампов.2, Чтоб при открытые сохраненных дампов, старые дампы из менеджера не удалялись, а лучше чтоб тебе спрашивали "Вы хотите объединить текущие дампы с существующими?". Если нет - заменить. Да - Добавлять новые.3. Сохранение выделенных дампов. Похоже релиз откладывается раз происходит вылет из игры. Буду тестить на ошибки. 1. Все дампы, которые отображаются должны фактически указывать на то, что они загружены в игре. Здесь надо решать задачу, чтобы после перезагрузки игры дамп без сохранения и загрузки мог быть в самой игре. Т.е. нужна обработка отключения/подключения к процессу. Также чтобы можно было сохранить дампы даже когда игра была закрыта.2. Я думал над объединением, но тут мешают уникальные имена дампов. Если старые имена будут совпадать с загружаемыми, то получиться что дампы с существующими именами избирательно не смогут загружаться или их предлагать переименовывать последовательно. Так что я отказался от объединения. Лишние мороки.3. Опять же из-за уникальности имен дампов нет смысла сохранять отдельные и подключать. Можно удалить ненужные оставив в таблице нужные и сохранить Ближайшие задачи1. После закрытия игры дампы можно было бы сохранять. Сейчас это сделать нельзя.2. После повторного подключения к процессу игры дампы находящиеся списке были бы рабочими, а не просто висели в списке, а в памяти игры их нет.3. Буду проверять вылеты игры Скорее всего, релиз откладывается не раньше следующих выходных. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 6 марта, 2015 Автор Поделиться Опубликовано 6 марта, 2015 Новая версия Функция потери процесса в CE Lua Engine не работает. Так что переписывание дампов нужно делать вручную через контекстную функцию. Dalloс из АА тоже не робит, память засоряется. Но 4Кб погоды не сделает, а это средний размер дампа для сравнения структуры. Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 7 марта, 2015 Поделиться Опубликовано 7 марта, 2015 (изменено) А если сделать так:При создании нового дампа во временных файлах будет создаваться файл, который будет нести в себе все созданные нами дампы.Если процесс закрылся - не беда.Открываем процесс заново, как он только открылся то подгружаем все дампы из временного файла в процесс. Когда СЕ закрывает - временный файл удаляем.При вылете процесса все дампы будут сохранены и никуда не пропадут Изменено 7 марта, 2015 пользователем Vlad2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 7 марта, 2015 Поделиться Опубликовано 7 марта, 2015 Еще мне как пользователю не удобно то, когда много созданных дампов нужно их записать в файл, но в тоже время расклассифицировать, приходится сохранять 2 раза, а потом открывать файлы в блокноте и вырезать лишнее. Нужна функция сохранения выделенных дампов. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 7 марта, 2015 Автор Поделиться Опубликовано 7 марта, 2015 В первый пост добавлено руководство "Сравнение структур после перезагрузки. Поиск фильтра свой-чужой-дружественый (Tiny dumper 1.2) В 07.03.2015 в 13:29, Vlad2 сказал: А если сделать так:При создании нового дампа во временных файлах будет создаваться файл, который будет нести в себе все созданные нами дампы.Если процесс закрылся - не беда.Открываем процесс заново, как он только открылся то подгружаем все дампы из временного файла в процесс. Когда СЕ закрывает - временный файл удаляем.При вылете процесса все дампы будут сохранены и никуда не пропадут Функцию-обработчик подключения процесса нельзя вызывать в файлах-плагинах иначе её не смогут использовать другие луа скрипты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 В 07.03.2015 в 13:43, Vlad2 сказал: Еще мне как пользователю не удобно то, когда много созданных дампов нужно их записать в файл, но в тоже время расклассифицировать, приходится сохранять 2 раза, а потом открывать файлы в блокноте и вырезать лишнее. Нужна функция сохранения выделенных дампов. ИМХО лишняя функция - сохранение выделенных дампов в файл. Это все равно, что сохранять выделенные записи-читы в главной таблице CE. Для "расклассифицирования" ты можешь называть дампы особым образом, чтобы отличать их. При это сохранять в один файл. Если хочешь, можешь открыть дампы текстовым редактором, чтобы вручную править дампы и названия меток. Там обычный текст. Ссылка на комментарий Поделиться на другие сайты Поделиться
Submarina Опубликовано 3 марта, 2016 Поделиться Опубликовано 3 марта, 2016 (изменено) хотел проверить что за плагин Tiny Dumper ver 1.2 но он на последней версии Cheat Engine v 6.5 не работает. Изменено 3 марта, 2016 пользователем Baracuda Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 3 марта, 2016 Автор Поделиться Опубликовано 3 марта, 2016 Пиши подробнее, что именно не работает иначе я не смогу ни чем помочь. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения