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
Ответов
-=CHE@TER=-
Jun 14 2018, 17:15
Сообщение #2


Walter Sullivan
***

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



Ты прям хочешь руководство в две строчки. Так не бывает.
Короче (для x86 - 32х битных приложений) - только самое основное:
1) Скачиваешь Ольку 1.10 (слева в меню "Odbg110.zip").
2) Скачиваешь CommandBar для неё: CommandBar
3) Распаковываешь Ольку, распаковываешь CommandBar и кидаешь в каталог к Ольке.
4) Запускаешь и открываешь там свой исполняемый файл (F3 или File - Open).
5) Т.к. ты брезгуешь нормальными системами, то запускаешь Ольку от имени Администратора, плюс помни, что первый вылет в ней будет не на OEP, а где-то в дебрях системы, ибо Windows Vista и выше - гоумно. Так что делай сразу F9, чтобы оно до OEP дошло.
6) Теперь жмёшь Ctrl+D или переключаешься на CommandBar снизу.
7) Пишешь там и жмёшь Enter:
bpx CreateFileA
Убедись, что там появилось "+ Breakpoint is set" или вводи CreateFileW или ещё чем там игра файлы открывает.
8) Отпускаешь программу на выполнение (F9). Если там нет антиотладочных приёмов, то она должна выпасть на вызове CreateFileA или на чём ты бряк ставил.
9) Когда выпадет - смотри окно справа-снизу. Это стек - смотри там имя открываемого файла. Жмёшь F9, пока там не будет интересующий тебя файл.
10) Теперь делаешь F8 - Step over, чтобы функция открытия выполнилась. Смотришь окно в верхнем-правом углу - это регистры, тебя интересует eax - это дескриптор только что открывшегося файла. Если там -1 (0xFFFFFFFF), значит файл не открылся - смотри в том же окне сообщение об ошибке (LastErr).
11) Теперь ты знаешь дескриптор файла. Ставишь бряк на:
bpx ReadFile
и отпускаешь на выполнение F9.
12) Выпал на чтении файла - смотри в стеке какой там дескриптор. Если твой - значит читается тот файл, которые тебя интересует, иначе - F9. Если файл твой - щёлкай правой кнопкой мышки в стеке на втором параметре сверху (адрес буфера) и выбираешь там "Follow in Dump" (третий пункт снизу). Теперь у тебя в окне слева-снизу показано начало памяти, куда будет прочитан файл.
13) Читаешь файл - F8. Теперь в окне памяти смотришь, что прочиталось именно то что нужно (можешь ещё на всякие SetFilePointer бряков понаставить, если файл не сначала читается, но больше лишних телодвижений будет). Ставишь на эту память бряк - щёлкаешь на первом байте левой клавишей, затем со Shift'ом щёлкаешь на каком-нибудь ещё, чтобы они выделились, затем правой клавишей на выделении и выбираешь Breakpoint - Memory, on access. Можешь выбрать на "on write", будет быстрее, но это только при условии, что буфер расшифровывается сам в себя, а не записывается куда-то ещё. К тому же "on access", позволит перехватить момент, когда прочитан первый байт, чтобы понять что дальше с ним делается.
14) Отпускаешь программу на выполнение (F9) и, теоретически, ты должен выпасть в месте, где память читают и расшифровывают.
15) Обрати внимание, что есть программы написанные наркоманами, так что там перед расшифровкой блок память могут таскать между буферами: buf1 - buf2 - buf3. Тогда бряк выпадет на копировании памяти из первого буфера во второй. А расшифровка, как ты понимаешь, будет третьего. Т.к. копирование выполняется в большинстве случаев стандартными средствами, то смотри регистр edi - это адрес памяти назначения. Переходим туда (правой клавишей мышки - Follow in Dump), и, после копирования, ставим там бряк на это место памяти. Этот бряк добавится к уже существующему, так что остальные можешь удалить, если не нужны, чтоб лишний раз не дёргало - Breakpoint - Remove memory breakpoint (после этого ставишь новый бряк, ибо эта функция удаляет все бряки).
Будут вопросы - задавай. Только с конкретными деталями что именно не получается.


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

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


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

 



Упрощённая версия Сейчас: 20th April 2024 - 14:32