div.main {margin-left: 20pt; margin-right: 20pt} Документ взят с сервера http://www.uinc.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. Ну и конечно все написанное
предназначено ТОЛЬКО для образовательных целей.
Все замечания,
благодарности, ругательства
приветствуются. Удачи, Corbio corbio@mail.ru Genocide Crew
member uinC Member [c]uinC
|