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 ;возвращаем управление ;программе
Вот и все.
Все замечания, благодарности, ругательства приветствуются.