冰河暗涌防不胜防 BIOS下实现的Telnet后门pc软件 文章资讯 手机软件

您当前的位置→图文中心新闻资讯业界快讯冰河暗涌防不胜防 BIOS下实现的Telnet后门

冰河暗涌防不胜防 BIOS下实现的Telnet后门


2009/3/25  编辑:佚名 来源:本站整理  关键词:

冰河暗涌防不胜防 BIOS下实现的Telnet后门

 

51CTO.com 独家特稿】该项目只为实验性项目, 主要目的是想隐藏一个Telnet后门就在主板的BIOS内, 并让其随着电脑计算机系统system及操作系统system成功的运行起来。 运行后能反向Telnet连载到指定的电脑计算机接受控制。

项目涉及的相关知识及技术目录

1、 实验环境, 使用bochs调试必备工具。

2、 刷新BIOS技术问题。

3、 代码植入BIOS问题。

4、 源代码相关技术问题:

A、怎么才能编写BIOS模块(如:PCI、 ISA)。

B、实模式有关联于HOOK磁盘中断的问题。

C、磁盘中断中选择中再次HOOK的问题。

D、NT保护模式下布置设置物理地址映射。

E、NT保护模式下线性地址寻址问题。

BIOS模块调试实验环境采用Bochs

Bochs虚拟机可以能够调试BIOS及操作系统system, Bochs使用主要是配置它的配置文件程序, 我们我自己以实例配置文件程序不复杂讲解, Bochs实验调试等网上有很多相关文章, 这里不复杂讲解。

我的配置实例:文件程序名xp.bxrc,修改后的及有请求需要布置设置的内容如下:

######使用的系统systemBIOS模块######
romimage: file=$BXSHARE/BIOS-bochs-latest
######使用的CPU 相关参数######
cpu: count=1, ips=10000000, reset_on_triple_fault=1
######布置设置内存大小       ######
megs: 128
######添加我们我自己的BIOS模块######
optromimage1: file=test.bin, address=0xd0000
######使用的VGAROM模块######
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
######布置设置虚拟机硬盘与光盘######
ata0-master: type=disk, path="c.img", mode=flat, cylinders=4161, heads=16, spt=63
#ata0-slave: type=cdrom, path="xp.iso", status=inserted
######布置设置引导设备        ######
boot: c
#boot: cdrom, disk
 

Bochs调试加载配置文件程序方法:可以能够布置设置一个bat文件程序,如下内容:
set BXSHARE=d:\bochs
%BXSHARE%\bochsdbg.exe -q -f xp.bxrc

怎么才能刷新各种BIOS问题

各种BIOS刷新相关必备工具早已就在网上流传, 必备工具的使用这里不作介绍说明, IcLord的作者已经给出很多编程方法实现。 这里不复杂说下。

UniFlash开源项目我也详细分析过, 如果有必要我会给出UniFlash源代码的详解, 该项目指出可以能够刷写所有BIOS芯片, 但是该项目刷新BIOS存就在很多问题, 绝大多数情况是再也不能够刷新的我实验过很多次, 也尝试修改他的代码过很多次, 没去寻找到原因。

Aword BIOS已经有通用的刷写API调用, 不管就在NT下还是就在实模式下, IcLord也作了讲解。 如果有时间我会给出实模式及NT下的刷写源代码及分析。

代码植入BIOS问题

有关联于网上提及的, IcLord讲到的我就不会再做重复的分析。 这里主要讲下我们我自己的模块可以能够植入哪些地方以方便隐藏。 以前的教程讲过的方法存的问题分析。


一、 ISA模块形式植入:这种方式只适合于较早的电脑计算机, 因为就在目前的电脑计算机系统systemBIOS是将不会加载ISA模块的。 故只能做实验调试用的方法。


二、 PCI模块形式植入:该方法虽然系统systemBIOS都要加载PCI ROM, 但是系统systemBIOS只加载实际存就在的PCI卡的ROM模块。 而且通常BIOS布置设置中可以能够
关闭相应的ROM启动。


三、 HOOK BootBlock或者说要启动的模块:该方法当然我认为是最有效的, 但是又存就在很多技术上的难题。 检验和问题, 不同BIOS的结构问题, 过早的HOOK还存就在再次获取CPU运行机会问题等等。

本人实验过上面提及的所有方法, 我认为HOOK PCI、VGA及相关启动模块是比较可寻的办法。 为什么?一般这类的ROM模块是就一定要启动的, 而且调试发现一般它的ROM本身代码用不完自身布置设置的大小, 我们我自己可以能够借助剩余大小隐藏我们我自己的代码。 例如:集成显卡会把显卡ROM集成到系统systemBIOS模块中, 我们我自己可以能够对该模块来进行HOOK, 修改ROM头部的跳转指令, 跳到我们我自己的代码现在开始处执行, 我们我自己的代码执行完后跳转到它的代码现在开始处执行。

怎么才能编写BIOS模块


BIOS是分模块组合就在一起的。 这里对PCI及ISA模块作下不复杂分析, VGA模块跟PCI模块几乎一样。 模块主要是头部有个规范, 该规范适合所有BIOS系统system。 具体可以能够参看《PCI系统system结构》及其他书籍。

源代码实例可以能够参看国外ROMOS开源项目, 该开源项目的思想很值得学习。 该项目讲解了怎么才能就在BIOS中嵌入一个小型DOS, 如:FreeDos。 采用了把整个DOS系统system盘镜像植入BIOS中, 跟早期的PXE引导DOS机制类似, 之后HOOK磁盘中断, 模拟dos系统system盘镜像出一个盘, 源代码编译后只有900多字节。 这种思想就在早期还是很值得学习的。


实模式有关联于HOOK磁盘中断问题

很早前就有业界内人士发贴问, 为什么就在我的ROM模块中HOOK磁盘中断会失败呢?有关联于这个问题现就在就在目前网上已经有人作出过回答, 国外的开源项目就在2003年我都看到过。

由于我们我自己的ROM模块过早的运行, 有可能运行就在磁盘服务前面了, 这时如果HOOK Int 13h会因为BIOS加载磁盘服务时重写Int 13h IVT值, 故我们我自己设法HOOK其他服务, 这个服务要求较早被BIOS安装且将不会再次修改且加载操作系统system前调用, 最佳的这个服务选择中就是int 18h、int19h服务。 可以能够参看
BIOS源代码, 也可以能够参看PXE SDK说明文档略有讲过。

我们我自己的磁盘服务代码主张放就在实模式高端内存, 可以通过BIOS数据信息区域可修改, 内存40:13,即物理地址413h处的值。 降低常规内存值, 高端的内存就留给我们我自己用。 我们我自己的保护模式下运行的代码主张也放就在这段内存, 且要求放就在以页基址现在开始的内存中, 以便后面代码的页映射我们我自己的保护模式代码物理页。 页基址:内存物理页地地址现在开始的低12位为零, 参看《80386保护模式教程》。

若我们我自己的代码直接就在内存的ROM映射区内, 有可能导致就在NT下访问不到我们我自己的代码, 因为NT内核加载程序ntldr有可能将不会映射该段内存, 甚至有可能BIOS就在使用后都会关闭ROM区域这段内存, 而且ROM区域这段内存就在初始化后被系统systemBIOS布置设置成只读不能够写。 当然我们我自己可以能够采取用int 15h服务对ROM区域这段内存映射。

当然也可以能够就在NT启动过程中, 就在我们我自己的磁盘服务中对想映射的内存都映射。 由于代码大小的限制, 故有些没必要的代码。 尽量不使用了。

磁盘中断服务中再次HOOK问题

为了使我们我自己的程序再次获得CPU运行机会, 我们我自己不得不得再次设法。 调试发现NTLDR进入保护模式后就在加载NT内核文件程序时, 会切换CPU到实模式调用Int 13H服务来进行磁盘读。

我们我自己挂接磁盘服务就是为了截取NTLDR的读操作, 这里我们我自己可以能够HOOK 或者修改NTLDR另一部分OsLoader的代码, 跳转到我们我自己的代码执行。 当然也可以能够直接HOOK ntosknrl导出的服务, 参看我就在2008.4.1发布出来的“程序从dos/BIOS驻留内存到WINNT下监视内存数据信息”。

提醒一定要注意, HOOK OsLoader的代码时选择中HOOK指令问题, 由于NTLDR切换到实模式读取数据信息, 读完后会就在保护模式下搬移数据信息到规划详细位置, 来进行内核的安装。 故HOOK时选择中HOOK指令就选择中FFh/15h:使用CALL NEAR [OFS32]指令来进行, 该指令寻址采用绝对地址, 类似指令也可以能够。

当然我们我自己的代码再次运行就一定会运行就在OsLoader代码被我们我自己HOOK处, 调用我我们我自己的代码执行, 这时我们我自己的代码运行环境:DS = ES = 10h保护模式段, 内存模式: FLAT。 就在这里我们我自己可以能够可以通过扫描_BlLoaderData数据信息结构, 获取NTOSKRNL镜像基址。

可以能够可以通过PE搜索NTOSKRNL导出的API, 可以能够参看网上相关教程。 现就在再次HOOK NTOSKRNL导出函数KeAddSystemServiceTable, HOOK该函数
可以能够截获win32k.sys添加它我自己的服务, 以便我们我自己再再次HOOk win32.sys导出函数NtUserRegisterClassExWOW。 HOOK该函数可以能够截取所有应用层程序注册窗口类, 以便我们我自己再再再次HOOK窗口类过程。 这时我们我自己的代码就运行就在NT的应用层模式下。


NT保护模式下布置设置物理地址映射

先看一个WinDbg实例有关联于就在我们我自己的磁盘服务中获取CR3值修改页映射的分析, 以前我的分析内容:

NT内核被加载高端的2GB内存(80000000h~0ffffffffh)。 参看NT内存安排..
a、win2k adv ser:   WINDBG 看到 NT Kernel base = 0x80400000 也就是NTOSKRNL.exe加载详细位置
         kd> r @cr3      ;断点详细位置就在NTOSKRNL.exe里现就在还没有应用程序故低端内存还未使用
              cr3=00030000 ;->页目录表所就在物理页(物理地址30000h)
          kd> d 80030000 80030800  ;看页目录发现现就在低端2GB(0~80000000h)还未分配配置
              80030000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
              80030010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
              80030020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
                 
          kd> d 80030800           ;看高端现在开始分配配置情况页表(80000000h现在开始的分配配置情况)
              80030800  63 21 03 00 63 41 03 00-63 51 03 00 63 31 03 00  c!..cA..cQ..c1..
              80030810  63 11 7c 00 63 21 7c 00-63 31 7c 00 63 41 7c 00  c.|.c!|.c1|.cA|.
              80030820  63 51 7c 00 63 61 7c 00-63 71 7c 00 63 81 7c 00  cQ|.ca|.cq|.c.|.
          ;实例1:看80400000h(NT Kernel base),这个线性地址到物理地址映射情况.
              ;线性地址最高10位页目录项(每项占4Byte):80400000h最高10位=201h.
              ;就在页目表详细位置:201h*4=804h 就在内存地址=[cr3]+804h..具体看保护模式教程
              kd> d 80030000+804 ;看就在页目录表详细位置的值
                80030804  63 41 03 00 63 51 03 00-63 31 03 00 63 11 7c 00  cA..cQ..c1..c.|.

              ;二级页表所就在物理页地址:63 41 03 00转换下34163h,物理页地址:34000h,163h是页属性.
              kd> d 80034000     ;看就在页表的值
                80034000  63 01 40 00 63 11 40 00-63 21 40 00 63 31 40 00  c.@.c.@.c!@.c1@.

              ;物理地址基址:63 01 40 00转换下400163h,#物理地址基址#:400000h,163h是页属性
              ;最后发现物理地址基址(页地址)就在400000h..观察物理地址400000h是NTOSKRNL.exe映像.

              kd> d 80400000 ;观察物理地址400000h
                80400000  4d 5a 90 00 03 00 00 00-04 00 00 00 ff ff 00 00  MZ..............
                80400010  b8 00 00 00 00 00 00 00-40 00 00 00 00 00 00 00  ........@.......

         ;实例2:看我们我自己代码映射情况我们我自己代码就在物理地址:9e000h从线性地址8009e000h分析映射情况
              ;8009e000h就在页目录详细位置最高10位=200h*4,就在内存地址=[CR3]+200h*4...
              kd> d 80030000+200*4
                80030800  63 21 03 00 63 41 03 00-63 51 03 00 63 31 03 00  c!..cA..cQ..c1..

               ;二级页表对应物理地址:63 21 03 00转换下物理页基址=32000h ,163是页属性
               ;8009e000h所就在二级页表详细位置:32000h+9eh*4(8009e000h线性地址12~22的位)...
                kd> d 80032000 + 9e *4
                  80032278  23 e1 09 00 03 f1 09 00-03 01 0a 00 03 11 0a 00  #...............

               ;物理地址基址(页基址):23 e1 09 00转换下09e000h,123是页属性..

          ;#实例3:Windows运行起后用的页目录表线性地址:0c0000000h映射到物理地址情况.
               kd> d 80030000 + c00 ;计算略.页目录表详细位置,观察发现指向我自己的...
                 80030c00  67 00 03 00 63 00 f0 17-00 00 00 00 63 31 a9 02  g...c.......c1..

b、winXP:  WINDBG 看到 Kernel base = 0x804d8000 PsLoadedModuleList = 0x8055b420
          kd> r @cr3   ;断点详细位置就在NTOSKRNL.exe里现就在还没有应用程序故低端内存还未使用
               cr3=00039000 ;->页目录表所就在物理页(页目录物理地址30000h)
                  
               kd> d 80039000 80039800  ;看页目录发现现就在低端2GB(0~80000000h)还未分配配置
                 80039000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
 
               kd> d 80039800           ;看高端现在开始分配配置情况页表(80000000h现在开始的分配配置情况)
                 80039800  e9 b9 00 f6 06 a1 08 10-75 1b f6 06 a3 08 10 75  ........u......u

          ;实例1:看我们我自己代码映射情况我们我自己代码就在物理地址:9e000h从线性地址8009e000h分析映射情况
                 ;8009e000h就在页目录详细位置最高10位=200h*4,就在内存地址=[CR3]+200h*4...
                 kd> d 80039000+200*4
                   80039800  63 b1 03 00 e3 01 40 00-63 e1 03 00 e3 01 00 01  c.....@.c.......

                 ;二级页表对应物理地址:63 b1 03 00转换下物理页基址=3b000h ,163是页属性
                 ;8009e000h所就在二级页表详细位置:3b000h+9eh*4(8009e000h线性地址12~22的位)...
                 kd> d 8003b000 + 9e *4
                   8003b278  03 e1 09 00 03 f1 09 00-03 01 0a 00 03 11 0a 00  ................

                ;物理地址基址(页基址):03 e1 09 00转换下09e000h,103是页属性..
--------->  ;*#实例2:手工修改分页让物理地址映射到线性地址,WINXP.80000000h BIOS/dos向量区没映射.#*
                 kd> d 80000000  ;可看到现就在没映射的情况,再也不能够可以通过线性地址访问.
                   80000000  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
                   80000010  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

                 ;80000000h的最高10位确定就在页目录表详细位置=200h*4=800h.就在页目录物理地址:[cr3]+800h
                   kd> d 80039000+200*4;可发现二级页表已映射(63b10300)页属性163.物理地址(页)3b000h
                     80039800  63 b1 03 00 e3 01 40 00-63 e1 03 00 e3 01 00 01  c.....@.c.......
                    
                     ;80000000h的12~22位次高10位确定就在二级页表详细位置:物理地址3b000h+0*4
                   kd> d 8003b000;观察发现确实没映射.全0.提醒一定要注意:一个页项占4字节...
                     8003b000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

                   ;修改成让它对应物理地址:000就可以能够,只修改允许访问就可以能够.也就是byte ptr [8003b000]=63
                     kd> e 8003b000 63
                     kd> d 8003b000  ;修改成功
                       8003b000  63 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  c...............

                   ;观察修改后的情况.;提醒一定要注意:要想布置设置生效.让WINDBG执行下G.让0C0000000等cr3被改等..
                     kd> g        ;让系统system全自动刷新TLB等寄存器....
                     kd> d 80000000
                       80000000  53 ff 00 f0 53 ff 00 f0-c3 e2 00 f0 53 ff 00 f0  S...S.......S...

          ;#实例3:Windows运行起后用的页目录表线性地址:0c0000000h映射到物理地址情况.
                kd> d 80039000 + c00 ;计算略.页目录表详细位置,观察发现指向我自己的...
                  80039c00  67 90 03 00 63 00 f0 0f-00 00 00 00 63 31 e2 01  g...c.......c1..

c、分析上面总结:发现最现在开始获取的cr3值会一直不断就在用。
故我们我自己修改页项的效果会就在windows运行后也生效可以通过上面的实例分析可以能够看出NT系统system的页映射情况。
进入保护模式之后这个CR3的值也就是页目录表详细位置被映射到了虚拟地址0c0000000h。 上面调试的实例页目录表地址就可以能够直接使用这个虚地址。
 


例如:就在我们我自己的代码中把我们我自己的代码拷贝到SharedUserData空间未使用处去, 就使用了页映射代码, 直接修改第一个页指向的物理页, 就是我们我自己代码所就在的物理页。

NT保护模式下线性地址寻址问题

有关联于我们我自己的代码进入保护模式以后, 所有指令的寻址问题, 这里作一下分析。 当我们我自己代码第一个就在保护模式下执行的指令, 是前面提到的磁盘服务中对OsLoader的代码进入HOOK, 也提到了采用什么样的HOOK指令以便寻址。

接哪之后, 我们我自己的代码就现在开始运行就在保护模式未分页情况下, 我们我自己采取的方法是把我们我自己的代码拷贝到SharedUserData空间未使用处, 涉及到拷贝的指令也就一定要运行就在保护模式分页下, 因为SharedUserData空间是一个虚地址。

就在这里我们我自己采用了把我们我自己的拷贝代码指令搬移到NTOSKRNL镜像的MZ与PE之间的区域, 布置设置HOOK NTOSKRNL导出函数KeAddSystemServiceTable最先是跳转到拷贝指令执行, HOOK NTOSKRNL导出函数KeAddSystemServiceTable采用相对跳转指令它们就在同一个个空间。

当我们我自己的拷贝指令把我们我自己的代码拷贝到SharedUserData空间未使用处之后, 我们我自己的代码就有一个固定的虚地址, 所有后续指令都可以能够采用这个虚地址来进行寻址。

相关文章
  • 全球暖化到底多可怕?气候学家释出惊人冰河消失前后对比图
  • 新的研究可能找到了地球每十万年会发生一次冰河时期的原因了
  • 科学家预测地球将于3年内进入冰河时期! NASA所拍的照片就是铁证!
  • 冰河暗涌防不胜防 BIOS下实现的Telnet后门
  • 发表评论
    阅读排行
    相关热门
    网站帮助 - 广告合作 - 下载声明 - 网站地图