IPB

Добро пожаловать, гость ( Вход | Регистрация )

> Работа с отладчиком
Siberian GRemlin
Jun 14 2018, 11:14
Сообщение #1


Advanced Member
***

Группа: CTPAX-X
Сообщений: 533
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Дайте кто-нибудь совет новичку, кратко, чтобы не читать целую книгу.

Как найти в отладчике функцию в exe игры, которая отвечает за расшифровку файла? Игра полностью читает файл в память, в котором предположительно лежит ключ и сами зашифрованные данные, либо ключ как-то генерируется из имени файла или его размера, ибо для каждого файла ключ свой. Проблема в том, что файл сначала был сжат zlib'ом, затем зашифрован, также используется выравнивание до размера кратного 16. Возможно, файлы сжимаются блоками и уже их выравнивали, а затем всё шифровали, так как чем больше размер файла тем больше разница со сжатым мной — в паке есть и зашифрованные/сжатые файлы и чистые, но использует только зашифрованные.

Судя, по основному архиву игры, шифруется обычным цикличным xor. В архиве к каждому файлу прилагался свой ключ в 20 байт.

Хотелось бы овладеть навыком находить ключи и сами алгоритмы шифрования.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов
LexSafonov
Oct 30 2020, 08:10
Сообщение #2


Member
**

Группа: Authorized
Сообщений: 21
Регистрация: 29-October 20
Пользователь №: 18,034
Спасибо сказали: 1 раз(а)



Внесу свою лепту вопросов.
Существуют сейчас в природе нормальные инструменты для отладки Dos приложений?(Ну помимо отладчика самого досбокса)
Ida Pro + DosBox у меня чёт вообще нивкакую не пашет. Более того, не пашет даже сам досбокс, он запускается, даже открывает игру, но не может включить процесс отладки. Всё просто зависает намертво.

Более того, скачал я версию Ida Pro 6.1, бинарники к этой версии. Делаю по мануалу, всё положил в нужные директории. Запускаю досбок, монтирую диски, пишу "debug TRILOGY.exe", процесс зависает. Ладно, иду тем временем в Ida Pro, там открываю сам exe, но в списках дебаггера упрямо не вижу вариант DosBox debugger. Только "борщ" и GDB.
Версию иды 6.4 я вообще найти не смог.
Хотел попробовать через "борщ" отладить, как многие советуют, но тоже нифига не понял, игру не открывает, жалуется на "некорректные" файлы, которые создаёт сама IDA.

Я так понял тот же "борщ" надо компилить под определённую версию иды?
Если вариантов вообще нет и остаётся только встроенный отладчик коробки, то есть ли в природе нормальные мануалы по отладке в этой среде? Листать миллион строк кода(и непонятно какого) тоже ведь не вариант.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Oct 30 2020, 14:28
Сообщение #3


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,353
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



QUOTE(LexSafonov @ Oct 30 2020, 08:10) *
Существуют сейчас в природе нормальные инструменты для отладки Dos приложений? (Ну помимо отладчика самого досбокса)
Если и есть, то мне они неизвестны.

QUOTE(LexSafonov @ Oct 30 2020, 08:10) *
Я так понял тот же "борщ" надо компилить под определённую версию иды?
Никогда с этим не работал, так что, увы, не могу что-то посоветовать.

QUOTE(LexSafonov @ Oct 30 2020, 08:10) *
Если вариантов вообще нет и остаётся только встроенный отладчик коробки, то есть ли в природе нормальные мануалы по отладке в этой среде? Листать миллион строк кода(и непонятно какого) тоже ведь не вариант.
Ну, листать код в любом случае придётся, даже при отладке, но меньше.

Набор того что понадобится при работе с DOSBox Debugger и, вообще, отладке DOS-приложений:

1) Собственно, сам отладчик: DOSBox Debugger. На текущий момент там последняя версия 0.74-3 - её и рекомендую.

2) Примочка к нему DOSBox Debugger Helper, которая будет очень круто экономить время позволяя сохранять набранные команды и прочее. С 0.74-3 версия из первого сообщения не работает, но в последнем сообщение (самом низу) есть данные, которые необходимо добавить в "DOSBoxDH.ini" чтоб заработало.

3) Справка по DOS под название TechHelp! Есть отдельный сайт techhelpmanual.com, где она представлена, но как-то криво сконвертированна. Есть скомпилированная нормальная версия в здесь: TECH Help! 6 by Flambeaux Software in .CHM.
Справочник содержит ошибки, так что осторожно. Более или менее безопасно там можно функции DOS смотреть: TECH Topics - DOS Functions QuickRef. Ассемблер там точно смотреть не стоит из-за ошибок - лучше здесь искать нужную команду: x86 Instruction Set Reference.

4) Небольшая, но очень годная документация от разработчиков SCUMMVM о том как работать с IDA и DOSBox: Using the DosBox Debugger - там как раз рассказывается как искать смещения.



И, по традиции, добавлю несколько советов от себя.

Если нужно узнать что делается в каком-то коде, то я поступаю так:
- создаю копию (чтобы потом откатиться можно было) исполняемого файла игры под другим именем;
- в оригинальном файле перехожу на смещение (IDA его показывает) которое мне нужно и два байта перед интересующим меня кодом (или в начале функции) заменяю на байты EB FE - именно в этом порядке. Это короткий jump на самого себя (т.е. на ту позицию, где эти байты написаны);
- теперь запускаю игру под отладчиком DOSBox и жду пока указанный код выполнится - т.е. игра зависнет (ВАЖНО: если игра перехватывает прерывание таймера, то музыка, например, может без проблем продолжать играть, главное чтобы всё остальное не двигалось);
- теперь в окне DOSBox где игра нажимаю Alt+Break, что останавливает выполнение кода;
- переходив во второе окно, где отладчик и восстанавливаем там код назад такой командой (32-х битного режима как в Alien Trilogy):
SM CS:EIP 85 C0
Или такой (для 16-ти битного режима):
SM CS:IP 85 C0
Вместо 85 и C0 должны быть те байты, которые были на том месте перезаписанных нами EB FE.
Далее уже можно отлаживать код по шагам.
- если предполагается что программу придётся перезапускать несколько раз, то записываем сегмент и смещение по которому оказался зацикленный код, затем восстанавливаем оригинальный исполняемый файл из копии, перезапускаем DOSBox Debugger и просто ставим бряк уже на известный нам адрес:
BP 0168:12345678
Где вместо сегмента 0168 и смещения 12345678 вписываем тот, которые у нас был, где начинались байты EB FE. Тогда нам не придётся восстанавливать код командой SM каждый раз при перезапуске программы.

К сожалению, в DOSBox Debugger нет возможности поставить бряк на обращение к памяти. Поэтому тут приходится выкручиваться через бряки на изменение памяти. Делается это так (только для 1 байта):
BPM X:Y
Где X - сегмент, а Y - смещение. Обращаю внимание, что отладчик по умолчанию считает что байт на который поставили бряк равен нулю. Так что если он отличен от нуля, то первую остановку отладчик сделает когда это видит, а не когда байт поменялся.
Дальше начинаются сложные размышления на тему того, а как бы так нам подобраться к нужному коду?
Например, когда Siberian GRemlin просил помочь с указателями на текст во вступительном ролике первой Кирандии, то я долго ломал голову как бы на них выйти. Потом понял что это можно сделать через изменение видеопамяти. В режиме VGA 13h 320x200, если не используются bank'и, то экран напрямую отображается в память по адресу A000:0000 (начало). Дальше делаем скриншот, когда на экране выводится текст субтитров, затем считаем координаты какого-нибудь пикселя из строки текста. Например, пусть это будет пиксель X:100, Y:45. Тогда нам нужно поставить такой бряк:
BPM A000:38A4
Потому что (45 * 320) + 100 = 14500 или 38A4 в шестнадцатеричном.
Всё, теперь перезапускаем программу и ждём пока этот байт изменится в нужном месте (на экране могут быть промежуточные спецэффекты, пока выполнение не дойдёт до нужного места - игнорируем такие остановки).
Когда отладчик остановится на нужном месте - это будет функция вывода текста на экран. Ищем там указатель на текст, затем поднимаемся выше и смотрим кто её вызвал, ну и там дальше очевидно.
Это штука не очень поможет в случае Alien Trilogy, потому что там bank'и используются и будет слишком много ложных срабатываний, чтобы этот подход можно было применить, даже с 256-ти цветовым исполняемым файлом.
Ещё одна проблема будет если игра использует прокрутку (как заставка в Кирандии). Тогда нужный пиксель может оказаться совсем не там, где ожидается. Можно так поступить (опять же, если игра не использует bank'и):
MEMDUMPBIN A000:0000 FA00
320 * 200 = 64000 или FA00 в шестнадцатеричном (в случае с прокрутной может взять размер больше).
Теперь находим появившийся в каталоге DOSBox файл с дампом MEMDUMP.BIN и открываем его чем-нибудь, что может интерпретировать файлы как картинки, с параметрами 320x200 256 цветов и ищем где и как там расположен нужный нам пиксель шрифта, затем пересчитываем его по формуле ((Y * 320) + X) и ставим бряк на этот байт в памяти.

Это - основное. Может быть потом что-нибудь ещё допишу, если вспомню.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Сообщения в этой теме


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 28th March 2024 - 17:11