Инструменты:
- HIEW 6.8x
- PE Tools
- PEiD 0.92
- UPX 1.25
- Some brains
Всё, что написано ниже, предоставлено
чисто для ознакомления. Я не несу
ответственности за противозаконное
использование материала.
Зачем это пишется? Просто так. Может вы
скажите, что умеете и так прятать любой
вирус с помощью ASProtect? Xtreme-Protector? or any protector? А
может с помощью Afx!AVSpoffer? Да, конечно, неплохо
получается, пожав вирус получаем:
File size: 17KB compressed to 102KB, Ratio: 602,9%
Как круто =) да... Об X-protector’e я уже молчу, там
ещё круче. Спуф от fij... Скока мусора
вставляется за один подход? А чтобы от веба
спрятать вам придётся жать кнопку около 12-и
раз. После этого шанс выжить у файла как–то
резко уменьшаются :). Тем более сейчас уже не
актуально его использовать, по моему мнению.
В свою базу его не добавил, наверное, самый
ленивый AV (может это не так?). Т.к. сигнатуры (далее
сигны -> последовательность байт) во все
файлы начиная с entry point вставляет одинаковые..
Например:
Если не выбирать никакие опции получается:
60 55 81 F9 ?? 00 00 00 33 C0 55 54 81 F9 ?? 00 00 00 58 59 59 81 F9
Crypt DS:seg > 60 B8 00 ?? ?? 00 33 C9
random alghr > 60 55 90 90 81 F9 ?? 00 00
Другие опции пока ещё не доступны. Хотя мне
было бы интересно посмотреть на “crypt RSRC”.
На днях посмотрел приватную спуфку...
Остался разочарован –(. Её возможности
немного преувеличены. Никакого особого
шифрования я не заметил. А это как раз
необходимо против McAfee.
Ну а на счёт крипторов, которые вроде размер
не увеличивают - можете ими пользоваться,
пока они не дойдут до суппорт-центра AV. А
ребята там очень живо работают :). Если
попалится сама прожка, то вместе с ней и все
чистяки.
Это я всё к тому, что зачем юзать какие-то
левые проги, когда самому можно руками всё
сделать. Уж тем более жать протекторами,
которые совсем не для этого предназначены.
В данной статье я хочу показать вам на
примере как спрятать вирус от любых AV.
Главное как можно меньше внести изменений в
файл, мы же не собираемся шифровать весь
файл, просто пара левых инструкций не
помешает. Главное, чтобы работоспособность
сохранилась, ведь нам не нужен дохлый файл
;). Проверять я буду этими антивирами: KAV 5.0,
Dr.WEB 4.32b, McAfee Virus Scan 8.0 #41. На остальных не имеет
смысла тестить :).
Итак, как же всё-таки можно спрятать вирус?
На самом деле всё очень просто… На первый
взгляд :). Практически все AV начинают
сканить файл с точки входа. Далее
устанавливают - упакован ли файл? Если да, то
следует унпак, нет продолжают дальше... (проверяя
валидный ли это PE файл, ведь у нас exe ) Именно
здесь где-то и есть наша сигна по которой
антивир палит вирус. Это не всё, конечно,
есть ещё уникальные сигны, дабы каждый файл
не палился -). Если знакомых сигн нету, AV
начинает эмулить пару инструкций, проверяя
не хотят ли его надуть. Самый нормальный
эвристик у веба - имеет глубину 12 уровней.
McAfee делает совершенно иначе, как мне
показалось. Похоже, что ему на EP вообще
посрать. Сигна есть где - то в .data или в .rsrc
может быть. Представляет собой некий кусок
данных. С изменением одного байта файл
больше не обнаруживался :). Здесь как раз
сложно найти эту сигну.
Дак вот... Нам надо подправить пару байт так,
чтобы наша хорошая программулька не упала и
не палилась. Естественно, вставляемый
нами код будет представлять мусор и больше
ничего. Мы не будем использовать умные фичи
типа шифрования, т.к. это здесь не нужно.
Для начала возьмем свежескомпиленный pinch.exe.
Будем прятать его. Что бы можно было на себе
тестить в настройках я выбрал: генерить всё
в passwords.txt. И ещё... Я не тыкнул пимпу “Encrypt”,
это для шифрования инфы и паковку FSG 1.33,
какой-то извратный паковщик +). Нусс.
Открываем в hiew32.exe наш вир. Ну тут всё как
обычно, идёт pe header... секции и т.д. Заползём в
третью секцию. Жмём F8 -> F6 -> .data -> [enter].
И что мы видим? упс.. наши настройки.
Естественно просто так их нельзя оставить.
Но сначала надо немного поковырять Entry Point...
Идём на EP. Жмём F8 -> F5 затем ещё [enter] нажмите,
будем вручную вбивать асм инструкции.
Быстро записываем этот адрес. У меня: 403D8A <-
OEP.
Сейчас мы немного побалуемся с точкой входа.
Листаем немного вниз, ищём кучу нулей. Раз 9
стоит нажать page down. Встаем на любое место и ..
Откуда эти нули? Это обычная оптимизация
для процессоров x86. Компилятор размещает
данные по адресам, кратным величине
выравнивания. В общем это как раз для нас ;).
Введём самое простое, что приходит на ум ( F3
-> F2 ):
pushad ; сохраняем
регистры
mov ecx, 125 ; заносим какое – то
число
sub ecx, 110 ; чего – то вычитаем
..
xchg ecx, eax
xor eax, eax ; обнуляем eax
xor ecx, ecx ; обн. ecx
pop eax
pop ecx
mov eax, 403D8A ; в eax наш OEP
mov ecx, 9
sub eax, ecx
add eax, 9
jmp eax ; прыжок на OEP
Очень примитивно. Таких переходов можно
делать сколько угодно, лишь бы места
хватило, а его, как видно, очень даже много.
Что мы вообще сделали? Сохранили регистры,
то, что идёт до [pop eax] всё мусор. и после тоже.
В eax занесли наш OEP, в ecx пихнули 9. Вычли из eax,
ecx. Прибавили к eax, 9 и получился OEP. Дальше
понятно - просто джамп. Что, очень просто? Ну
а что, этого хватит на первое время. Может в
будущем такие фичи будут сечь Антивиры. Хмм...
Было бы круто -) Такс... Всё это дело вбили,
жмём [Esc], F9 для сохранения. Получилось что –
то типа такого:
Теперь пихаем наш файл в PE Tools (я использую PE
Tools v1.5 Xmas Edition - by NEOx). Хотя EntryPoint можно менять
сразу в hiew, но я не помню как там было :)... И
флаги секций тоже... Открываем вир с помощью
пе эдитора. Жмём “Optional Header” и там смотрим
Entry Point. Вот здесь нам нужно положить новый
адрес. Я начал вбивать с адреса 404178. Поэтому
из 404178 вычитаем image base (400000 – виртуальный
адрес в памяти, начиная с которого
программа загружена в память), получается
00004178. Вписываем новый адрес и “Ok”. Запустим
наш exe... Работает? 🙂 Нет? Хмм... Читай всё с
начала.
Проверим. Значит KAV и Веб не палят, в отличии
от McAfee -). Что делать? Пакнем наверно. Я
возьму UPX 1.25, простенький и мощный паковщик.
Сначала посмотрим, что показывает PEiD…> Not a
valid PE file. %) Не очень хорошо, после паковки
упиксом такого файла он быстренько сдохнет.
В этом плане ASPack более неприхотлив. Не будем
далеко ходить, воспользуемся плугом для
пеида Rebuild PE.
Теперь что у нас…> Nothing found *. Так то лучше
..-). Теперь пакуем UPX’oм. Получилось 9 216 byte.
Просто монстр какой–то :). Сейчас задача
внести пару изменений, чтобы анализатор не
определял упикс, следовательно не смог его
распаковать. Засовываем опять вир в hiew, [enter].
Листаем немного вниз и видим такое:
Сигны UPX. Недолго думая затираем их, F3 и
вставляем какой нить мусор, F9 – сохраняем.
Потом [enter], F8 > F5 и мы на EP:
.00428AC0: 60 pushad <- OEP
.00428AC1: BE00704200 mov esi,000427000 -----? (4)
.00428AC6: 8DBE00A0FDFF lea edi,[esi][0FFFDA000]
.00428ACC: 57 push edi
.00428ACD: 83CDFF or ebp,-001 ;"?"
.00428AD0: EB10 jmps .000428AE2 -----? (5)
.00428AD2: 90 nop
.00428AD3: 90 nop
Проделаем тоже самое, что и с непакованным
вирем. Листаем вниз... и видим кучу нулей :).
Встаём на любой адрес, F3 и сначала вводим
опкоды: 74 00, затем на следующей строчке: E9, F9,
пока сохраним.
00428C21: 7400 je .000428C23 -----? (3)
00428C23: E900000000 jmp .000428C28 -----? (4)
Это просто трюк для обхода PEiD …> PE Pack 1.0 ->
ANAKiN. Дальше вводим уже знакомое (F3 > F2):
pushad
mov ecx, 428AC0 ; в ecx OEP
mov eax, 1
dec eax
mov eax, ecx
jmp eax
Вот и всё. Теперь опять вирь пихаем в PE Tools,
меняем Entry Point на новый адрес с которого вы
начали вводить 74 00 и т.д. У меня 00428C21 – image base
= 00028C21. По пути заходим в “Sections”, затираем
названия секций и меняем характеристики на
C0000080. Запускаем наш вирь… и он работает :).
Проверяем антивирами - все в дауне, включая
McAfee ;). Да, по ходу дела бекапьте пинч, а то
маловероятно, что с первого раза всё
получиться. Хотя все может быть.
Конец близок. Попробуем расунпачить файл.
А затем …
Попробуйте любыми автораспаковщиками - у
вас ничего не выйдет. Не стоит думать, что
это 100% защита, всё это дело распаковывается
руками за одну минуту.
Вот так вот просто можно обойти все
антивирусы. Если следовать этому плану,
возможно будет спрятать любой вирус. Хотя
бывает иногда ну прям палится и всё.. :). В
этом случае придётся поискать сигну,
отрезая секции например. Дальше уже по
обстоятельствам разбираться. Но не стоит
пользоваться левыми прогами для прятанья.
Чистяки получаются у всех одинаковые, прога
действует по определённому алгору, который
можно подсмотреть 😉 и никакой полиморфизм
не поможет, если тока не придумывать что–то
сложное (свой движок). А так руками каждый
делает свой уникальный чистяк (если не
будете вставлять одинаковый код,
придумайте что–нить своё).
Никто не гарантирует, что всё получится с
первого раза. Для этого нужно набивать руку.
Таким образом на один чистяк уходит порядка
5 мин. Ну максимум 10. Выбирать способ конечно
вам, настаивать я не буду… Я лишь высказал
своё мнение.
Copyright ® 2004 [PlainTeXT]