информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetSpanning Tree Protocol: недокументированное применениеПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[ASM] Chingachguku 18.10.01 11:29  Число просмотров: 1095
Автор: Chingachguk <Chingachguk> Статус: Member
<"чистая" ссылка>
> Попытался сделать по твоему совету. Прописал его в
> автоэкзеке. Но комп
> зависает при загрузке виндов.А с 09h загружается, но только
> в DN и NC работает. Если есть приведи исходник,пожалуйста.

Ты немного ошибся вот в чем: прерывание Int 16h возвращает в качестве ответа - была ли нажата клавиша - установленный или сброшенный флаг ZF ! Ниже я указал, где именно !
>
;...
> main_ proc far
> jmp init
>
> old_16h dd 0
> counter_ dw 0
>
> new_16h:
> cli
> pushf
> call cs:old_16h
; Флаг ZF установлен ! Его надо вернуть !!!
; А ты его сбрасываешь командой iret (у тебя она в конце)
> push ax
; Тут ты что-то делаешь ....
> pop ax
> sti
> iret
; А вот iret вернет вызывающей прогамме те флаги, которые были у нее до вызова !!! - Надо использовать команду retf 2 - Она не испортит тебе флаги.
Ниже я послал тебе свою программку - как пример такого рода перехватов. Тока я там int 13h ловлю. Сделай по аналогии что-нибудь.
Да, и еще ! Зря ты тягаешь из буффера клавы клавиши - они же возвращаются самой int 16h. Так вроде проще ? ;)))

; Программа для выдачи серийного номера жесткого диска.
; Выдает серийный номер жесткого диска в указнный буфер из 256 слов.
; Необходимо указать в autoexec.bat ее инсталляцию.
; Будучи загружена перед Windows 95/98, попадает в 0-кольцо защиты OS
; И потому способна корректно работать с портами ввода-вывода ЖД.
; Под DOS работает так же, как обычная программа, читающая порты ЖД.
; Поддерживает 2 функции (регистр AL):
; AL = 00h - INSTALLATION CHECK
; Если инсталлировна, то AL = FBh(Номер резерв. ф-ции), CF флаг сброшен
; AL = 01h - READ SERIAL DISK NUMBER
; В случае успешного чтения возвращает:
; - AL = FBh (Номер резерв. ф-ции), CF флаг сброшен;
; - В переданный буфер ES:DI читает серийный номер диска, буфер
; должен быть длиной 256 слов;
; Если чтение не удалось, то AL = FF и флаг CF установлен
; На другие значения в AL возвращает FF + установленный флаг CF
.286 ; Команды процессора 286+ незащищенного режима
HookedVector equ 13h ; Перехватываем вектор 13h - работа с диском BIOS
OurFunction equ 0fbh ; Резервируем ф-цию 0fbh прерывания 13h для себя
Drive equ 00h ; Видимо, номер жесткого диска (0,1,..)
FuncNumber equ 2 ; Число поддерживаемых функций
InstallCheck equ 0 ; Запрос на инсталляцию
ReadSerial equ 1 ; Запрос на чтение серийного номера
ErrorFunc equ 0ffh ; Ответ на ошибочный запрос
cseg segment byte 'code'
assume cs:cseg
org 100h ; Обычный PSP com - программы
begin: jmp Iniz ; Обойдем резидентный код
messagekey proc near
pushf ; Сохраним флаги вызывающей программы
cmp ah,OurFunction
jnz @NotOurFunction
popf ; Парная команда к pushf в начале кода
call Dispatcher ; Отработать возможные функции
retf 2 ; Вернуться с установленными внутри флагами
@NotOurFunction:
popf ; Восстановим флаги вызывающей программы
db 0eah ; код команды jmp far
Old_13H dd ? ; На предидущий обработчик int 13h
messagekey endp
Dispatcher proc near
push si
xor si,si
@FindFunc:
cmp al,cs:Functions[si]
jz @FuncFound
inc si
cmp si,FuncNumber
jb @FindFunc
pop si
mov al,ErrorFunc
stc
retn
@FuncFound:
shl si,1
call word ptr cs:FuncOfs[si]
pop si
retn
Dispatcher endp
Functions db InstallCheck,ReadSerial
FuncOfs dw offset Install, offset ReadInfo
Install proc near
mov al,OurFunction
clc
retn
Install endp
ReadInfo proc near
pusha
mov word ptr cs:Counter,0
@TryAgain:
mov dx,03f6h
mov al,0ah
out dx,al ; outportb(0x3F6,0x0A)
call Waiter
@Wait1: mov dx,01f7h
in al,dx
call TimeOut
test al,80h ; while(inportb(0x1F7)&0x80);
jnz @Wait1
call Waiter
mov dx,01f6h
mov al,Drive
shl al,4
add al,0a0h
out dx,al ; outportb(0x1F6,0xA0+(drive<<4));
call Waiter
@Wait2: mov dx,01f7h
in al,dx
call TimeOut
test al,40h ; while(!(inportb(0x1F7)&0x40));
jz @Wait2
call Waiter
mov dx,01f7h
mov al,0ech
out dx,al ; outportb(0x1F7,0xEC);
call Waiter
@Wait3: mov dx,01f7h
in al,dx
call TimeOut
test al,08h ; while(!(inportb(0x1F7)&0x08));
jz @Wait3
call Waiter
; for(i=0; i<256; i++) infoArray[i] = swap(inportw(0x1F0)) (to es:[di])
mov cx,256
@FillBuf:
call Waiter
mov dx,01f0h
in ax,dx
xchg al,ah
mov es:[di],ax ; es:[di] = ax, di:=di+2
inc di
inc di
loop @FillBuf
mov dx,01f7h
in al,dx
call TimeOut
test al,80h ; if(inportb(0x1F7)&0x80) continue;
jz @ReadOK
jmp @TryAgain
@ReadOK:popa
clc
mov al,OurFunction
retn
TimeOut proc near
inc word ptr cs:Counter
jnz @TimeDone
pop ax
popa
mov al,ErrorFunc
stc
@TimeDone:
retn
Counter dw 0
TimeOut endp
ReadInfo endp
Waiter proc near
push cx
xor cx,cx
@Wait: loop @Wait
pop cx
retn
Waiter endp
Iniz proc
assume ds:cseg
push ds
mov ax,(35H shl 8) + HookedVector
int 21h ; Get old HookedVector to es:bx
mov word ptr Old_13h,bx
mov word ptr Old_13h+2,es
mov dx,offset MessageKey
mov ah,25h
int 21H ; Set new Vector
mov dx,offset Iniz
int 27H ; Terminate and Stay Rezident
Iniz endp
cseg ends
end Begin
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach