Advertisement
Guest User

Untitled

a guest
Feb 24th, 2019
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. code_seg segment
  2. ASSUME  CS:CODE_SEG,DS:code_seg,ES:code_seg
  3. org 100h
  4. .286
  5.  
  6. start:
  7. jmp begin
  8.  
  9. ;========================MACRO=========================
  10.  
  11. print_mes macro string
  12.   local message, nxt
  13.   push ax
  14.   push dx
  15.   mov ah, 09h
  16.   mov dx, offset message
  17.   int 21h
  18.   pop dx
  19.   pop ax
  20.   jmp nxt
  21.   message DB string, '$'
  22.   nxt:  
  23. endm
  24. ;========================DATA=========================
  25.  
  26. int_2Fh_vector  DD  ?
  27. old_09h         DD  ?
  28. key         DB  '/off'
  29. flag_off    DB  0
  30. msg         DB  'already '
  31. msg1        DB  'installed',13,10,'$'
  32. msg4        DB  'just '
  33. msg3        DB  'not '
  34. msg2        DB  'uninstalled',13,10,'$'
  35. msg_password DB 'Please enter the password:$', 13, 10
  36. correct DB 13, 10, 'Password entered correctly$', 13,10
  37. line db 2                       ;Строка
  38. coloumn db 10                   ;Столбец
  39. pass_check db  6,0,6 dup (0)
  40. password db '123qwe'
  41. cur_position dw 0
  42. pass_length dw 5
  43. flag db 0
  44.  
  45. ;========================CODE=========================
  46.  
  47. new_09h proc far
  48.     pusha
  49.     pushf
  50.     in    AL, 60h                  ; Введем scan-code
  51.     cmp   flag, 1
  52.     je    get_character
  53.     cmp   AL, 19h                  ; Это скен-код <P>?
  54.     je    gogo                     ; Да
  55. exit:                              ; Нет
  56.     popf
  57.     popa
  58.     jmp  dword ptr CS:[old_09h] ; В системный обработчик без возврата
  59. gogo:
  60.     push  ES
  61.     mov   AX, 40h ; Настроим ES на начало данных BIOS  
  62.     mov   ES, AX
  63.     mov   AL, ES: [17h]  ; Получим слово флагов клавиатуры
  64.     pop   ES
  65.     cmp   AL, 0Ch ; (Ctrl+Alt) уже нажата?
  66.     je    hotkey ; Да  
  67.     jmp   exit  ; Нет, в системный обработчик
  68. hotkey:
  69.     sti
  70.     in    AL, 61h ; Введем содержимое порта В  
  71.     or    AL, 80h ; Установим старший бит
  72.     out   61h, AL ; И вернем в порт В  
  73.     and   AL, 7Fh ; Снова разрешим работу клавиатуры  
  74.     out   61h, AL ; Сбросив старший бит в порту
  75. password_input:      
  76.     push  cs
  77.     pop   ds
  78.     mov   AH, 06h          ; очистка экрана
  79.     mov   AL, 0            ;Режим создания окна (прокрутка)
  80.     mov   BH, 07h          ;Атрибут всех символов в окне:ч/б
  81.     mov   CX, 0
  82.     mov   DH,24             ;Нижняя Х-координата
  83.     mov   DL,79             ;Правая Х-координата
  84.     int   10h               ;Прерывание BIOS
  85.     mov   AH, 02h
  86.     mov   BH,0               ;Видеостраница
  87.     mov   DH, line           ;Строка
  88.     mov   DL, coloumn        ;Столбец
  89.     int   10h                ;Прерывание BIOS
  90.     mov   AH, 9h
  91.     mov   DX, offset msg_password
  92.     int   21h
  93.     ;Пошлем приказ EOI  
  94.     cli
  95.     mov   AL, 20h  
  96.     out   20h, AL  
  97.     popf
  98.     popa
  99.     mov   flag, 1
  100.     jmp   dword ptr CS:[old_09h] ; В системный обработчик без возврата
  101.  
  102. get_character:
  103.     cmp al, 1Ch
  104.     je  check
  105.     mov si, offset pass_check
  106.     mov bx, cur_position
  107.     mov pass_check[bx], al
  108.     cmp bx, pass_length
  109.     je  check
  110.     inc cur_position
  111.     sti
  112.     in    AL, 61h ; Введем содержимое порта В  
  113.     or    AL, 80h ; Установим старший бит
  114.     out   61h, AL ; И вернем в порт В  
  115.     and   AL, 7Fh ; Снова разрешим работу клавиатуры  
  116.     out   61h, AL ; Сбросив старший бит в порту
  117.     ;Пошлем приказ EOI  
  118.     cli
  119.     mov   AL, 20h  
  120.     out   20h, AL  
  121.     popf
  122.     popa
  123.     jmp dword ptr CS:[old_09h] ; В системный обработчик без возврата
  124. check:
  125.     sti
  126.     in    AL, 61h ; Введем содержимое порта В  
  127.     or    AL, 80h ; Установим старший бит
  128.     out   61h, AL ; И вернем в порт В  
  129.     and   AL, 7Fh ; Снова разрешим работу клавиатуры  
  130.     out   61h, AL ; Сбросив старший бит в порту
  131.  
  132.     lea si, password  
  133.     lea di, pass_check
  134.     mov CX, 6       ; ожидаемая длина команды
  135. repe cmpsb
  136.     jne not_equal
  137. equal:
  138.     mov AH, 9h
  139.     mov DX, offset correct
  140.     int 21h
  141.     jmp finish
  142. not_equal:
  143.     mov cur_position, 0
  144.     jmp password_input
  145.     ;Пошлем приказ EOI  
  146.     cli
  147.     mov   AL, 20h  
  148.     out   20h, AL  
  149.     popf
  150.     popa
  151.     jmp  dword ptr CS:[old_09h] ; В системный обработчик без возврата
  152. finish:
  153.     int 19h
  154. new_09h     endp
  155.  
  156. ;-----------------------------------------------------------------------------
  157. int_2Fh proc far
  158.     cmp     AH,0C7h         ; Наш номер?
  159.     jne     Pass_2Fh        ; Нет, на выход
  160.     cmp     AL,00h          ; Подфункция проверки на повторную установку?
  161.     je      inst            ; Программа уже установлена
  162.     cmp     AL,01h          ; Подфункция выгрузки?
  163.     je      unins           ; Да, на выгрузку
  164.     jmp     short Pass_2Fh  ; Неизвестная подфункция - на выход
  165. inst:
  166.     mov     AL,0FFh         ; Сообщим о невозможности повторной установки
  167.     iret
  168. Pass_2Fh:
  169.     jmp dword PTR CS:[int_2Fh_vector]
  170. ;
  171. ; -------------- Проверка - возможна ли выгрузка программы из памяти ? ------
  172. unins:
  173.     push    BX
  174.     push    CX
  175.     push    DX
  176.     push    ES
  177. ;
  178.     mov     CX,CS   ; Пригодится для сравнения, т.к. с CS сравнивать нельзя
  179.     mov     AX,3509h    ; Проверить вектор 09h
  180.     int     21h ; Функция 35h в AL - номер прерывания. Возврат-вектор в ES:BX
  181. ;
  182.     mov     DX,ES
  183.     cmp     CX,DX
  184.     jne     Not_remove
  185. ;
  186.     cmp     BX, offset CS:new_09h
  187.     jne     Not_remove
  188. ;
  189.     mov     AX,352Fh    ; Проверить вектор 2Fh
  190.     int     21h ; Функция 35h в AL - номер прерывания. Возврат-вектор в ES:BX
  191. ;
  192.     mov     DX,ES
  193.     cmp     CX,DX
  194.     jne     Not_remove
  195. ;
  196.     cmp     BX, offset CS:int_2Fh
  197.     jne     Not_remove
  198. ; ---------------------- Выгрузка программы из памяти ---------------------
  199. ;
  200.     push    DS
  201. ;
  202.     lds     DX, CS:old_09h
  203.     mov     AX,2509h        ; Заполнение вектора старым содержимым
  204.     int     21h
  205. ;
  206.     lds     DX, CS:int_2Fh_vector
  207.     mov     AX,252Fh
  208.     int     21h
  209. ;
  210.     pop     DS
  211. ;
  212.     mov     ES,CS:2Ch       ; ES -> окружение
  213.     mov     AH, 49h         ; Функция освобождения блока памяти
  214.     int     21h
  215. ;
  216.     mov     AX, CS
  217.     mov     ES, AX          ; ES -> PSP выгрузим саму программу
  218.     mov     AH, 49h         ; Функция освобождения блока памяти
  219.     int     21h
  220. ;
  221.     mov     AL,0Fh          ; Признак успешной выгрузки
  222.     jmp     short pop_ret
  223. Not_remove:
  224.     mov     AL,0F0h          ; Признак - выгружать нельзя
  225. pop_ret:
  226.     pop     ES
  227.     pop     DX
  228.     pop     CX
  229.     pop     BX
  230. ;
  231.     iret
  232. int_2Fh endp
  233.  
  234. ;============================================================================
  235. already_ins:
  236.         cmp flag_off,1      ; Запрос на выгрузку установлен?
  237.         je  uninstall       ; Да, на выгрузку
  238.         lea DX,msg          ; Вывод на экран сообщения: already installed!
  239.         call    print
  240.         int 20h
  241. ; -------------------------------- Выгрузка---------------------------------
  242. uninstall:
  243.         mov AX,0C701h  ; AH=0C7h номер процесса C7h, подфункция 01h-выгрузка
  244.         int 2Fh             ; мультиплексное прерывание
  245.         cmp AL,0F0h
  246.         je  not_sucsess
  247.         cmp AL,0Fh
  248.         jne not_sucsess
  249.         mov DX,offset msg2  ; Сообщение о выгрузке
  250.         call    print
  251.         int 20h
  252. not_sucsess:
  253.         mov DX,offset msg3  ; Сообщение, что выгрузка невозможна
  254.         call    print
  255.         int 20h
  256. xm_stranno:
  257.         mov DX,offset msg4  ; Сообщение, программы нет, а пользователь
  258.         call    print       ; дает команду выгрузки
  259.         int 20h
  260. ;============================================================================
  261. begin:
  262.         mov CL,ES:80h       ; Длина хвоста в PSP
  263.         cmp CL,0            ; Длина хвоста=0?
  264.         je  check_install   ; Да, программа запущена без параметров, попробуем установить
  265.         xor CH,CH       ; CX=CL= длина хвоста
  266.         cld             ; DF=0 - флаг направления вперед
  267.         mov DI, 81h     ; ES:DI-> начало хвоста в PSP
  268.         mov SI,offset key   ; DS:SI-> поле key
  269.         mov AL,' '          ; Уберем пробелы из начала хвоста
  270. repe    scasb   ; Сканируем хвост пока пробелы
  271.                 ; AL - (ES:DI) -> флаги процессора
  272.                 ; повторять пока элементы равны
  273.         dec DI          ; DI-> на первый символ после пробелов
  274.         mov CX, 4       ; ожидаемая длина команды
  275. repe    cmpsb   ; Сравниваем введенный хвост с ожидаемым
  276.                 ; (DS:SI)-(ES:DI) -> флаги процессора
  277.         jne check_install ; Неизвестная команда - попробуем установить
  278.         inc flag_off
  279. ;--------------------Не установлена ли уже эта программа?--------------------
  280. check_install:
  281.         mov AX,0C700h   ; AH=0C7h номер процесса C7h
  282.                         ; AL=00h -дать статус установки процесса
  283.         int 2Fh         ; мультиплексное прерывание
  284.         cmp AL,0FFh
  285.         je  already_ins ; возвращает AL=0FFh если установлена
  286. ;----------------------------------------------------------------------------
  287. cmp flag_off,1
  288. je  xm_stranno
  289. ;----------------------------------------------------------------------------
  290.   mov ax, 352Fh
  291.   int 21h                        
  292.   mov word ptr int_2Fh_vector, BX    ;   ES:BX - вектор
  293.   mov word ptr int_2Fh_vector+2, ES
  294.   mov DX, offset int_2Fh
  295.   mov AX, 252Fh
  296.   int 21h
  297. ;============================================================================
  298.   mov ax, 3509h
  299.   int 21h                        
  300.   mov word ptr old_09h, BX    ;   ES:BX - вектор
  301.   mov word ptr old_09h+2, ES
  302.   mov DX, offset new_09h
  303.   mov AX, 2509h
  304.   int 21h
  305. ;----------------------------------------------------------------------------
  306. mov DX,offset msg1  ; Сообщение об установке
  307. call    print
  308. ;----------------------------------------------------------------------------
  309. mov DX,offset   begin           ;   оставить программу ...
  310. int 27h                         ;   ... резидентной и выйти
  311. ;============================================================================
  312. PRINT       PROC NEAR
  313.     MOV AH,09H
  314.     INT 21H
  315.     RET
  316. PRINT       ENDP
  317. ;;============================================================================
  318.  
  319. code_seg ends
  320. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement