Пошаговое руководство по Tiny Dumper
В этом руководстве по шагам описано как снять дамп со стека и раструктуризовать его. Если лень читать, то предлагаю посмотреть хотя бы последний скрин. Там можно увидеть результат. Это самый важный скрин.
Перед запуском CE устанавливаем файлы плагина в папку autorun (frmTinyDumper.xml и TinyDumper.lua)
Запускаем игру например "Painkiller - Battle out of Hell 1.64" поставленная в оконный режим через 3DAnalyze.
Оконный режим ставить обязательно, т.к. будет пошаговая отладка. В противном случае игра зависнет, а с CE рабтать нельзя будет
Запустить CE с установленным плагином и подключиться к игре
Ищем адрес здоровья (или брони, или патронов), тип Double (8 байт)
0x24571EA8 = 99.2900238037109
Ставим бряк на доступ или на запись на адрес 0x24571EA8
2bf8d038-de92-4de0-88f6-944b9093adf5-image.png
Идем в игру и встаем под удар персонажем
Появляются инструкции
3b2e99be-4a03-455c-a575-28511d347064-image.png
и там же нажимаем на кнопку Stop, чтобы бряки не мешались в окне бряков
Берем например инструкцию
1015C194 - 89 53 08 - mov [ebx+08],edx
6ad80302-80f1-4905-8bac-bdbfbb930bfd-image.png
По ней идем в дизассемблер и на инструкции жмем F5 - установка бряка на доступ
2755fb71-f09c-4815-88c7-191fbfdf2dc7-image.png
Открываем окно бряков, выделяем инструкцию и пишем условие на прерывание с остановкой процесса
EBX==0x24571EA0 (это условие взяли, потому что ebx находится в инструкции, а значение взяли EBX из отладчика)
2c1e1ed4-0df0-4314-981f-f8e31550959d-image.png
43e9dfd5-1c49-4bf2-bf1a-b588c308181c-image.png
Нажимаем Ок, идем в игру
9. Видим, что произошла остановка игры
148b600b-4ffe-4e2c-893a-df3330aff53f-image.png
10. Открываем окно ТиниДампера
6db64901-ca0e-4d32-8be9-2fcb27894556-image.png
Пишем значение регистра esp и название будущей зарегенной метки
26586a39-c6f1-40ee-a44b-bd966578e736-image.png
Нажимаем "Dump and Close" и CTRL+U чтобы видеть под рукой зареганные ваши метки
7f7a0d40-9107-4c19-b13f-2105a57422a5-image.png
Открываем окно расструктуризации CTRL+D и пишем метку в свободное поле
1104aed5-e0c1-45bd-b880-877433c6c1a1-image.png
Далее следуем действия как на рисунках
9cac0888-208c-4f0e-9ae2-b53f6c49aeb4-image.png
7db1307b-9305-4fd6-9b34-e75c2c8cc466-image.png
Наконец результат
6d506668-7bed-4cae-9c22-47af124c0c16-image.png
Не только сохраняются данные, которые пропадут на следующий такт процессора, но и расструктуризовали и можем сравнивать эти данные с другими дампами стека. Зачем, как и для чего это выходит за рамки этого руководства.
Сейчас процесс игры остановлен на бряке кода. Чтобы продолжить игру. Удаляем бряк из окна бряков и отпускаем игру по F9.
Теперь снимаем другие дампы на том же адресе для адресов здоровья врагов на предмет отличиях их или для поиска указателей... Во всяком случае сохраненный дамп может дать какие-то подсказки и зацепки. Главное не начать новый уровень игры или не загружать сохранения, т.к. обычно при переходе на новый уровень данные могут измениться... На этом пока все
-----
Tiny dumper 1.2 Сравнение структур после перезагрузки. Поиск фильтра свой-чужой-дружественый
Запускаем игру, запускаем CE и присоединяем процесс игры к CE
Сохраняем игровой слот перед тем как искать структуры
Находим три структуры игроков: свой игрок, дружественный, враг
Дампим три структуры из пункта 3 указывая: базовый адрес структуры, уникальную метку
Игру закрываем, снова открываем, загружаем слот, присоединяем процесс игры к CE
В Tiny dumper 1.2 вызываем контекстное меню правой кнопки мышки и вызываем опцию "Rewrite dumps" - дампы из кеша перезаписываются в память в процесса игры
Снова находим три структуры игроков: свой игрой, дружественный, враг
В окне расструктуризации создаем три группы
Группа1 "Свой игрок":
-адрес после перезагрузки
-метка из тини дампера своего игрока до перезагрузки
Группа2 "Чужой игрок":
-адрес после перезагрузки
-метка из тини дампера чужого игрока до перезагрузки
Группа3 "Дружественный игрок":
-адрес после перезагрузки
-метка из тини дампера дружественного игрока до перезагрузки
Если повезет, то находим фильтр - фиолетового цвета строка. Если филетовых строк несколько, то запоминаем их смещения и значения на всякий случай
Пишем АА-скрипт со смещением фильтра. Правильно написанный АА-скрипт не будет крешить игру.
Активируем АА-скрипт и проверяем в игре, что свой и дружественный игроки не получают урон, а вражеские получают урон. Если это не так, то берем другие смещения из пункта 9 и повторяем 10.
Если фильтр найти не удалось, то ищем 3 многоуровневых указателя до верхего статического адреса для своего, для 2-х врагов. Открываем Structure Spider.
Указываем в поиске уровень вложенности указателей.
Попеременно вводим два статических адреса - начала структур своего и чужих игроков. Правило поиска выбираем исходя из типов игроков. Если это свой и чужой, то искать отличные. Если это чужой и чужой, то искать одинаковые. Перезапускам игру и опять проделываем эти действия.
Если не нашлось ничего, то что-то делали не так или отличия между группами игроков нет. Однако графический интерфейс обычно связан только с нашим героем и не связан с другими. Поэтому по связи GUI как минимум фильтр свой-чужой можно сделать всегда. Что касается дружественных игроков, то нужно будет исследовать более углубленно.