   Вот может интересно будет - как-то сделал пару программок:

   selfmak1.asm - создает исходник, состоящий из обычных "обкладок",
                  между которыми записывает свой код, переведенный в
                  вид db 0??h, 0??h, ...
   selfmak2.asm - создает идентичную копию своего исходника
                  (даже с комментариями ;)

   В принципе этому можно найти применение для создание вируса, мутирующего
   на уровне исходника. Как может работать этот вирус:
   Размножаться  обычным  способом  (Search или TSR), и при этом еще искать
   файлы  tasm.exe  и  tlink.exe (по PATH, при смене директории, при запусе
   файла,  ...)  Если  найден,  то  вирус  создает  свой исходник, но уже в
   измененном   варианте.  Самое  примитивное,  что  можно  сделать  -  это
   вставлять  между  строчками nop'ы. Но это очень уж просто. Детектировать
   такое труда не составит.
   Другой  вариант,  чуть  более  сложный  -  это вставлять между строчками
   исходника блоки такого вида:
   jmp shit001
   ...          ; тут все что угодно либо в виде db 0??h, 0??h, ...
                ; либо в виде комманд типа mov ax,???? sub dx,????, ....
   shit001:

   jmp может меняться на пару jc/jnc, jz/jnz, ...

   но эти куски легко определить, т.к. код между ними не выполняется.

   Как же сделать так, чтобы вставляемые куски мусора были бы неотличимы от
   тела вируса? Нужно чтобы этот мусор также выполнялся.  Но если вставлять
   абсолютно случайные комманды, то возможны такие "нехорошие" варианты:

   ...
   int 21h
   ; нельзы вставить cls,stc,add,sub,...
   jc er

   cmp ax,1234
   ; нельзы вставить cls,stc,add,sub,...
   jb label1

   и т.д.

   Т.е. между каждыми двумя строчками  можно вставлять  только определенный
   набор команд, специфичный для каждой пары. Если немного пофантазировать,
   то легко придумать, как это сделать. Я придумал такой (дубовый) вариант:
   Допустим есть такой кусок кода вируса (закомо? ;)
   -------------
   mov ah,40h
   mov bx,handle
   lea dx,buf
   mov cx,virlen
   int 21h
   -------------
   Добавляем между строками кода строки комментария:
   --------------
   mov ah,40h
   ;mov bx,0????h
   ;mov cx,0????h
   ;mov dx,0????h
   mov bx,handle
   ;mov cx,0????h
   ;mov dx,0????h
   lea dx,buf
   ;mov cx,0????h
   mov cx,virlen
   ;clc
   ;stc
   int 21h
   --------------

   Можно понаписать еще кучу комманд, правда размер будет о-го-го какой, но
   об этом дальше.

   Итак, для создания мусора мужду коммандами нужно просто при создании ис-
   ходника и записи в него случайным образом убирать первый символ ( только
   если это символ ';' ). При компиляции получится файл, в котором вирусный
   код будет полностью размазан.
   Примечание: закоменченые команды (типа mov ax,0????h) - нужно обработать
               перед записью в создаваемый исходник - все символы '?' заме-
               нить на случайные числа от 0 до F.

   Для уменьшения размера исходника (ведь его придется таскать с собой) еще
   можно сделать так:
   -------------------------------------------
   mov ax,1234h
   ;%1 %2,0????h ;&1=mov,add,sub. &2=bx,cx,dx.
   mov bx,5678h
   -------------------------------------------
   при записи в исходник эти строки обрабатываются, и
   %1 заменяется на mov,add или sub (соотв-но списку после 2го символа ';')
   %2 заменяется на bx,cx или dx (соотв-но списку после 2го символа ';')
   т.е.  можно между каждыми двумя строками можно вставлять уже не по 10-20
   строк, а по 2-3 такого вида.

   Но есть у этого метода слабое место ( помимо того, что для мутаций нужны
   tasm.exe и tlink.exe, и что вирус будет иметь немаленький размер ) - это
   исходник, который придется таскать с собой. Он будет являться сигнатурой
   да еще какой.
   Как этого избежать - зашифровать эту часть, но еще лучше упаковать любым
   методом типа Haffman или lempel-ziv

