всем привет! на просторах интернета нашел следующую программу.. техническое условие: при нажатии на знаменитые Ctrl + Alt + Del она выдаёт сообщение "Ctr + Alt + Del Pressed, System halted" и вешает систему, поможет только Reset. Не используйте её из Windows - Windows сначала передаёт управление системному обработчику, а затем пользовательскому обработчику в режиме виртуального 86-го, так что Windows всё равно перехватит Ctr + Alt + Del автор данной программы выложил работающий код.. Код (ASM): text segment 'code' assume cs:text,ds:text org 100h main proc jmp init old_09h dd 0 message db 'ÖÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ·' db 'º º' db 'º Ctrl+Alt+Del pressed... º' db 'º º' db 'º *** System halted *** º' db 'º º' db 'ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĽ' c_flag db 0 a_flag db 0 d_flag db 0 inside db 0 fuck proc push 0B800h pop es mov di, 1320 mov si, offset message mov cx, 7 @@1: push cx mov cx, 32 mov ah, 1Fh @@2: lodsb stosw loop @@2 add di, 96 pop cx loop @@1 ret fuck endp new_09h proc push ax push bx push cx push dx push di push si push es push ds mov ax, cs mov ds, ax in al, 60h cmp al, 29 jne next1 mov c_flag, 1 jmp test_f next1: cmp al, 56 jne next2 mov a_flag, 2 jmp test_f next2: cmp al, 83 jne next3 mov d_flag, 4 jmp test_f next3: cmp al, 157 jne next4 mov c_flag, 0 jmp exit next4: cmp al, 184 jne next5 mov a_flag, 0 jmp exit next5: cmp al, 211 jne exit mov d_flag, 0 jmp exit test_f: xor al, al or al, c_flag or al, a_flag or al, d_flag cmp al, 7 jne exit cmp inside, 0 jnz disable inc inside call fuck mov al, 0B6h out 43h, al mov al, 0A6h out 42h, al mov al, 7 out 42h, al in al, 61h or al, 3 out 61h, al mov ah, 0 int 16h dec inside disable:in al, 61h or al, 80h out 61h, al and al, 7Fh out 61h, al mov al, 20h out 20h, al pop ds pop es pop si pop di pop dx pop cx pop bx pop ax iret exit: pop ds pop es pop si pop di pop dx pop cx pop bx pop ax jmp cs:old_09h iret new_09h endp end_res=$ main endp init proc mov ax, 3509h int 21h mov word ptr cs:old_09h, bx mov word ptr cs:old_09h+2, es mov ax, 2509h mov dx, offset new_09h int 21h mov ax, 3100h mov dx, (end_res-main+10Fh)/16 int 21h init endp text ends end main при детальном разборе у меня появились вопросы по реализации.. например, зачем в пользовательском обработчике прерывания клавиатуры после считывания символа из порта производятся сравнения его с числами 29, 56, 83, 157, 184, 211? я просмотрел таблицу ASCII, но никакой взаимосвязи между этими числами не нашел.. что они означают? да и какую роль выполняют флаги: c_flag, a_flag, d_flag? еще интересует, почему целых два выхода из прерывания iret? по-моему, так во втором случае после безусловного перехода вызова стандартного обработчика прерывания клавиатуры уже не будет возврата в пользовательский обработчик, и второй iret не выполнится никогда? прошу разъяснить того кто в теме указанные моменты..
Начать нужно с того, что это ntvdm. Симуляция реалмода. > зачем в пользовательском обработчике прерывания клавиатуры после считывания символа из порта производятся сравнения его с числами Да кто его знает. Что бы это выяснить нужно открыть справочник по древней как говно мамонта архитектуре. > второй iret не выполнится никогда? Если инструкция не связана в потоке выполнения то она исполнена быть не может" Любые данные это код, пространство выравнивания может быть заполнено теми вашими iret, это не исполняемое пространство. Дос как обучалку следует давно похоронить.
Indy_, я бы и сам хотел забыть дос как страшный сон, но не могу.. уже зависимость появилась.. какое лекарство предложишь вот такому пациенту!? зачем тогда заполнять код мусором, т.е. неисполняемым пространством? если на выравнивание это никак не должно повлиять, оставляемый объем кода и выравнивание задается одной формулой.. Код (ASM): mov dx, (end_res-main+10Fh)/16 p.s. все еще жду грамотных разъяснений по коду..
..а какие тут мысли - чистой воды говнокод, который криво пытается работать с устаревшей клавой(ХТ). порт(60h) возвращает в AL скан, а не аски-код который ты ищешь в таблице: для ХТ эти коды такие (пример не будет работать на новых AT-машинах): Код (ASM): ; нажатие 29 = 1Dh = левый [Ctrl] 56 = 38h = левый [Alt] 83 = 53h = [Delete] ;отпускание в таком-же порядке 157 = 9Dh 184 = B8h 211 = D3h переходы [jne next] вообще туши свет, т.е. если не Сtrl - проверь Alt, если не Alt - то проверь Del. полный пипец... чтобы похукать Ctrl-Alt-Del нужно не ввод тестить, а флаг клавы по-адресу [0:417h] здесь лежит пример: http://kipirvine.com/asm/4th/examples/No_Reset.asm
Коцит, благодарю. что-то меня не в ту сторону повело.. точно, при чтении из порта читается скан, а не аски..