нажатие на знаменитые Ctrl + Alt + Del

Тема в разделе "WASM.DOS", создана пользователем proc3nt, 10 апр 2018.

  1. proc3nt

    proc3nt New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2017
    Сообщения:
    19
    всем привет! на просторах интернета нашел следующую программу..
    техническое условие: при нажатии на знаменитые Ctrl + Alt + Del она выдаёт сообщение "Ctr + Alt + Del Pressed, System halted" и вешает систему, поможет только Reset. Не используйте её из Windows - Windows сначала передаёт управление системному обработчику, а затем пользовательскому обработчику в режиме виртуального 86-го, так что Windows всё равно перехватит Ctr + Alt + Del

    автор данной программы выложил работающий код..
    Код (ASM):
    1. text    segment 'code'
    2.         assume cs:text,ds:text
    3.         org 100h
    4. main    proc
    5.         jmp init
    6.         old_09h dd 0
    7.         message db 'ÖÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ·'
    8.                 db 'º                              º'
    9.                 db 'º   Ctrl+Alt+Del pressed...    º'
    10.                 db 'º                              º'
    11.                 db 'º    *** System halted ***     º'
    12.                 db 'º                              º'
    13.                 db 'ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĽ'
    14.         c_flag  db 0
    15.         a_flag  db 0
    16.         d_flag  db 0
    17.         inside  db 0
    18.  
    19. fuck    proc
    20.         push 0B800h
    21.         pop es
    22.         mov di, 1320
    23.         mov si, offset message
    24.         mov cx, 7
    25. @@1:    push cx
    26.         mov cx, 32
    27.         mov ah, 1Fh
    28. @@2:    lodsb
    29.         stosw
    30.         loop @@2
    31.         add di, 96
    32.         pop cx
    33.         loop @@1
    34.         ret
    35. fuck    endp
    36. new_09h proc
    37.         push ax
    38.         push bx
    39.         push cx
    40.         push dx
    41.         push di
    42.         push si
    43.         push es
    44.         push ds
    45.         mov ax, cs
    46.         mov ds, ax
    47.         in al, 60h
    48.         cmp al, 29
    49.         jne next1
    50.         mov c_flag, 1
    51.         jmp test_f
    52. next1:  cmp al, 56
    53.         jne next2
    54.         mov a_flag, 2
    55.         jmp test_f
    56. next2:  cmp al, 83
    57.         jne next3
    58.         mov d_flag, 4
    59.         jmp test_f
    60. next3:  cmp al, 157
    61.         jne next4
    62.         mov c_flag, 0
    63.         jmp exit
    64. next4:  cmp al, 184
    65.         jne next5
    66.         mov a_flag, 0
    67.         jmp exit
    68. next5:  cmp al, 211
    69.         jne exit
    70.         mov d_flag, 0
    71.         jmp exit
    72. test_f: xor al, al
    73.         or al, c_flag
    74.         or al, a_flag
    75.         or al, d_flag
    76.         cmp al, 7
    77.         jne exit
    78.         cmp inside, 0
    79.         jnz disable
    80.         inc inside
    81.         call fuck
    82.         mov    al,   0B6h
    83.         out    43h,  al
    84.         mov    al,   0A6h
    85.         out    42h,  al
    86.         mov    al,   7
    87.         out    42h,  al
    88.         in     al,   61h
    89.         or     al,   3
    90.         out    61h,  al
    91.         mov ah, 0
    92.         int 16h
    93.         dec inside
    94. disable:in al, 61h
    95.         or al, 80h
    96.         out 61h, al
    97.         and al, 7Fh
    98.         out 61h, al
    99.         mov al, 20h
    100.         out 20h, al
    101.         pop ds
    102.         pop es
    103.         pop si
    104.         pop di
    105.         pop dx
    106.         pop cx
    107.         pop bx
    108.         pop ax
    109.         iret
    110. exit:   pop ds
    111.         pop es
    112.         pop si
    113.         pop di
    114.         pop dx
    115.         pop cx
    116.         pop bx
    117.         pop ax
    118.         jmp cs:old_09h
    119.         iret
    120. new_09h endp
    121.         end_res=$
    122. main    endp
    123. init    proc
    124.         mov ax, 3509h
    125.         int 21h
    126.         mov word ptr cs:old_09h, bx
    127.         mov word ptr cs:old_09h+2, es
    128.         mov ax, 2509h
    129.         mov dx, offset new_09h
    130.         int 21h
    131.         mov ax, 3100h
    132.         mov dx, (end_res-main+10Fh)/16
    133.         int 21h
    134. init    endp
    135. text    ends
    136. end     main
    при детальном разборе у меня появились вопросы по реализации.. например, зачем в пользовательском обработчике прерывания клавиатуры после считывания символа из порта производятся сравнения его с числами 29, 56, 83, 157, 184, 211? я просмотрел таблицу ASCII, но никакой взаимосвязи между этими числами не нашел.. что они означают? да и какую роль выполняют флаги: c_flag, a_flag, d_flag? еще интересует, почему целых два выхода из прерывания iret? по-моему, так во втором случае после безусловного перехода вызова стандартного обработчика прерывания клавиатуры уже не будет возврата в пользовательский обработчик, и второй iret не выполнится никогда? прошу разъяснить того кто в теме указанные моменты..
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Начать нужно с того, что это ntvdm. Симуляция реалмода.

    > зачем в пользовательском обработчике прерывания клавиатуры после считывания символа из порта производятся сравнения его с числами

    Да кто его знает. Что бы это выяснить нужно открыть справочник по древней как говно мамонта архитектуре.

    > второй iret не выполнится никогда?

    Если инструкция не связана в потоке выполнения то она исполнена быть не может" :)

    Любые данные это код, пространство выравнивания может быть заполнено теми вашими iret, это не исполняемое пространство.

    Дос как обучалку следует давно похоронить.
     
  3. proc3nt

    proc3nt New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2017
    Сообщения:
    19
    Indy_, я бы и сам хотел забыть дос как страшный сон, но не могу.. уже зависимость появилась.. какое лекарство предложишь вот такому пациенту!?

    зачем тогда заполнять код мусором, т.е. неисполняемым пространством? если на выравнивание это никак не должно повлиять, оставляемый объем кода и выравнивание задается одной формулой..
    Код (ASM):
    1. mov dx, (end_res-main+10Fh)/16
    p.s. все еще жду грамотных разъяснений по коду..
     
  4. proc3nt

    proc3nt New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2017
    Сообщения:
    19
    ммм.. почему молчание такое!? неужели нет никаких мыслей..
     
  5. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    ..а какие тут мысли - чистой воды говнокод,
    который криво пытается работать с устаревшей клавой(ХТ).

    порт(60h) возвращает в AL скан, а не аски-код который ты ищешь в таблице:
    для ХТ эти коды такие (пример не будет работать на новых AT-машинах):
    Код (ASM):
    1. ; нажатие
    2. 29 = 1Dh = левый [Ctrl]
    3. 56 = 38h = левый [Alt]
    4. 83 = 53h = [Delete]
    5. ;отпускание в таком-же порядке
    6. 157 = 9Dh
    7. 184 = B8h
    8. 211 = D3h
    переходы [jne next] вообще туши свет,
    т.е. если не Сtrl - проверь Alt, если не Alt - то проверь Del.
    полный пипец...
    чтобы похукать Ctrl-Alt-Del нужно не ввод тестить, а флаг клавы по-адресу [0:417h]
    здесь лежит пример: http://kipirvine.com/asm/4th/examples/No_Reset.asm
     
    proc3nt, Mikl___ и TermoSINteZ нравится это.
  6. proc3nt

    proc3nt New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2017
    Сообщения:
    19
    Коцит, благодарю. что-то меня не в ту сторону повело.. точно, при чтении из порта читается скан, а не аски..