On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru






 

Как исправлять байты в пакованных файлах: UPX

Инструменты:


IDA ;я использовал версию, любезно предоставленную мне Гарри Колтоном :)
HIEW ; можно использовать любой редактор со встроенным дизассемблером
Мозги ; не советую пользоваться пиратскими версиями, лучше купите ;-)



+++++++++++++++++++++Принцип работы+++++++++=======+++++++++++++

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

++++++++++++++++++++++++++++Начнем.....++++++++++++++++++++

Отдадим на растерзание IDA нашу программу. В W32dasm ее засовывать нельзя так как
он пытается дизассемблировать зашифрованные участки кода. Получается полный бред.
IDA дизассеблирует только инструкции распаковщика, зашифрованные участки не трогает.
Вот типичный листинг:

; --------------- S U B R O U T I N E ---------------------------------------
0040CE30 public start
0040CE30 start proc near
0040CE30 pusha ;Начало распаковки ищем POPA
0040CE31 mov esi, 40B000h ;здесь начинаются инструкции,
0040CE36 lea edi, [esi-0A000h] ;распаковывающие программу в память.
0040CE3C push edi ;Если вам интересен принцип работы - потрассируйте
0040CE3D or ebp, 0FFFFFFFFh ;на это уходит около часа.
0040CE40 jmp short loc_40CE52
;-----------пропущено около несколько десятков строк т.к они нам не нужны-------------
0040CF67 dword ptr [esi+0C118h]
0040CF6D or eax, eax
0040CF6F jz short loc_40CF78
0040CF71 mov [ebx], eax
0040CF73 add ebx, 4
0040CF76 jmp short loc_40CF59
0040CF78 ; ---------------------------------------------------------------------------
0040CF78 loc_40CF78: ; CODE XREF: start+13F.j
0040CF78 call dword ptr [esi+0C11Ch]
0040CF7E loc_40CF7E: ; CODE XREF: start+110.j
0040CF7E popa ; вот эта "попа" нам и была нужна :-)
0040CF7F jmp near ptr unk_403A68 ; JMP на начало распакованной программы !!!
0040CF7F start endp

Вот теперь мы знаем все что нам нужно.
Посмотрим на нашу программу через HIEW.
Две последнии инструкции будут выглядеть так:

0000237E: 61 popad
0000237F: E9E46AFFFF jmp 0FFFF8E68

Теперь нам надо найти пустое место , куда мы впишем наш патч.
Примерно пятью инструкциями ниже мы обнаруживаем кучу ноликов ( add [eax],al). Подойдет.
Перенаправляем JMP:

0000237F: E90F000000 jmp 000002393 ; jmp на свободное место
00002393: C6053234450075 mov b,[000453432],075 ;заменяем байт по адресу
;453432 на 75
0000239A: E9E46AFFFF jmp 0FFFF8E68 ;возвращаем управление программе

Вот и все.

P.S.
Ну и конечно все написанное предназначено ТОЛЬКО для образовательных целей.



Языки программирования: разное