抢先DriverStudio夺取机器控制权

抢先DriverStudio夺取机器控制权
2007-09-23 16:21:28
废话不谈,言归正传!
      大家都知道,装了DriverStudio软件(我使用的是v3.2版)的系统在启动时会显示其配置画面,(如图0所示)
 
 
 
                             图 0
 
这时操作系统的其他部件还没有运行。那么显示的原理是什么?能不能早于DriverStudio而先执行其他代码呢?答案是肯定的。下面先谈谈原理吧。
       原理比较简单,详细的大家可以看网文<<Inside NT boot>>
,我这里简单说说。当引导扇区被引导后,会查找NTLDR,NTLDR做
的一件非常重要的事就是将CPU从实模式转换到保护模式下。在
加载完NTDECT.COM后接下来就会将NT的核心装入内存,它们是HAL.DLL和NTOSKRNL.EXE,加载完毕后,NTLDR再加载所有引导
必须的驱动程序。接下来就是我们所关心的地方:它会将HKLM\SYSTEM\Services中值为 SERVICE_BOOT_START的DRIVER
装入,但此时不初始化。
(补充附注:
NtLdr第3步动作:扫描内存中SYSTEM注册表hive文件找到所有引
导设备驱动程序,这些Driver仔注册表中通过SERVICE-BOOT-
START启动值标记。
NtLdr第5步动作:加载引导驱动程序,在启动画面Starting
Windows下显示出不断更新的进度栏,该进度栏随每个驱动程
序的加载而变化。
Kernel第23步动作:I/O管理器初始化……所有前面加载的
Boot-Start型驱动程序被调用以完成驱动程序相关初始化,
这时才轮到System-Start型的驱动程序被加载并初始化。
更详细的信息请参考<<Windows 2000 内部揭秘>>
)
 
那么DriverStudio是不是也是使用了这个特性呢?
运行 regedit.exe ,在Services目录中找到bootcfg这个注册
项,可以看到它是一个内核驱动,并且Start类型为0。如图1
所示:
 
 
                             图1
 
为了证实这个Driver就是提供DriverStudio开机时配置功能的
驱动程序,我用一个会引起系统崩溃驱动的名字来替换它,然
后重新启动。原本该显示配置画面的地方果然发生了系统崩溃。
(如图2所示)
 
 
                            图 2
 
既然知道了原理,再来看看操作。实际上windows自身提供
了这个实现。细心的朋友可能早就知道Win32 API
CreateService的dwStartType 形参有个选项为:SERVICE_BOOT_START 。
  
SERVICE_BOOT_START  --  Specifies a device driver started by   the operating system loader. This value is valid only if the    service type is SERVICE_KERNEL_DRIVER or SERVICE_FILE_SYSTEM_DRIVER.
 
 
好像看起来和普通的诸如SERVICE_DEMAND_START  的用法没
什么不同嘛,结果手动编制尝试结果返回非法参数。
       为什么会这样呢?经过一番thinking之后,我猜测由
于使用
了SERVICE_BOOT_START 时,是在系统引导的早期发生load
Driver事件,这时可能除了少数几个OS必须的路径以外,还
无法访问其他windows目录。为了证实,我将自己的Driver拷
贝到系统目录:
%root%\system32\drivers\
下,再次运行结果成功!
      下面再引出注册表中的一个与驱动程序加载相关的KEY:
ServiceGroupOrder ,如图3所示:
 
 
                              图3
 
再看一下图1中DriverStudio引导驱动的组名,是Boot Bus Extender,它排在启动顺序的第2位。现在我新加一个
Group名:Hopy。
如图4:
 
 
                               图4
 
然后将代码改写如下:
;BTmain.asm节选
.const
namesvr    db 'TryBootSvr',0
notesvr    db 'Test Drv Start at System Boot',0
namefile db 'BTdrv.sys',0
szLOG   db 'hopy',0
szSSN   db 'TBSvr2007',0       ;ServiceStartName
szpath     db 'C:\WINNT\system32\drivers\BTdrv.sys',0
 
.code
invoke  CreateService,hSCM,addr namesvr,addr notesvr,\
      SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,\
      SERVICE_BOOT_START,SERVICE_ERROR_NORMAL,\
      addr szpath,addr szLOG,addr tagid,NULL,\
      NULL,NULL
 
驱动代码如下:
;BTdrv.asm节选
local status:NTSTATUS
   local pDeviceObject:PVOID
 
   mov   status, STATUS_DEVICE_CONFIGURATION_ERROR
   xor   edi,edi
   mov   [edi],eax
   jmp   $
   mov   eax,status
   ret
 
结果如我们所预料,该Driver抢在DriverStudio之前发生
蓝屏,如果将这个Driver换成带有特定功能的代码的驱动,
则可以实现超前 的目的。这个留给大家去想象吧,呵呵。
 
 
 
 
                                       hopy|侯佩
                                    2007.09.16 写于中国
                                    女足惨 败于 巴西之后
分享至
更多 0
一键收藏,随时查看,分享好友!
0人
了这篇文章
类别: 系统┆ 技术圈(0)┆阅读(529)┆评论(0) ┆  推送到技术圈返回首页


和DriverStudio"过不去"之加强版
2007-09-23 16:23:51
标签: DriverStudio  休闲  职场
上篇仅仅说到如何抢先DriverStudio,并在结尾留给大家一个遐想。
现在我进一步拓展这个遐想,从而给大家更多的遐想。: )
        那么现在我要给这个驱动增加新的功能,不但抢先DriverStudio
启动,而且给用户显示几行提示,并等待用户的输入,如果用户输入
B 键则发生蓝屏,如果用户按任意其他键则继续往下执行,So
DriverStudio可以正常执行下去。
        要完成这个功能必须解决两个问题:
        0 如何在系统引导时显示字符串;
        1 如何捕获用户输入并延时等待。
那么从哪入手呢?我首先想到直接写Video Buffer和直接捕获键盘
寄存器,但是这个方法可行吗?我们不妨看一下DriverStudio的
bootcfg.sys 是如何做的。
        照例用IDA载入bootcfg.sys,按照DriverStudio初始化显示的字符
串来到驱动的DriverEntry,如图0
图0
通过查找字符串的引用很快就找到对应的指令点,全文只有一个
引用,如图1所示:
图1
为了确认这一点,我将地址0x107dd - 0x107e6中的指令全部nop掉,
图2
这时的确原先应该显示"Press ESC ..."这段话的地方没有显示,而是
直接跳到Config 对话框那里去了。既然找对了地方下一步就好办了,
通过进一步反汇编bootcfg.sys的代码片断,印证了我先前的想法!
下面简单说说DriverStudio是如何做的:
        a. 使用 MmMapIoSpace 完成物理地址到虚拟地址的映射,因为
        内核已经进入保护模式,并且开了分页。要想读写物理地址必须做
        这样的映射(我的
Windows 核心编程研究系列之二:读取指定物理内存地址中的内容 
        一篇中有更为详细的说明)。
      该函数原形如下:
       PVOID 
    MmMapIoSpace(
    IN PHYSICAL_ADDRESS
  PhysicalAddress,
    IN ULONG
  NumberOfBytes,
    IN MEMORY_CACHING_TYPE 
 CacheType
             参数含义都比较明显,其中CacheType选择NoCache类型。
        b. 使用类似于bios中断字符显示的规则,一个字符占一个word,
            低位为字符的ascii码,高位为显示属性。我这里显示闪烁的
            红色字体所以属性为 84h。与bios中断不同的是,我们是直接
           写视频缓冲,其物理地址为 0b8000h 。我写了一个显示
          函数,包含两个参数:第一个是字符串地址,第二个是显示的
          位置。为了美观,我将2行字符串显示在屏幕的倒数最后两行
           上:
Screen_W equ 50h
Screen_H equ 19h ;1ch
Show_Pos_Line0 equ (Screen_W * (Screen_H - 2) + 5) * 2
Show_Pos_Line1 equ (Screen_W * (Screen_H - 1) + 5) * 2
           函数内容如下:
           ;*************************************************************************
_DisplayString proc _lpstr,_pos
 local pa:qword
 local lpvmem:dword
 ;mov dword ptr [pa+1],Video_Addr
 ;mov dword ptr [pa+5],0
 mov dword ptr [pa],Video_Addr
 mov dword ptr [pa+4],0
 push 0 ;MmNonCached
 push 8000h ;NumberOfBytes
 ;push dword ptr [pa+5]
 ;push dword ptr [pa+1]
 push dword ptr [pa+4]
 push dword ptr [pa]
 call MmMapIoSpace
 mov lpvmem,eax
 mov esi,_lpstr
 mov edi,lpvmem
 add edi,_pos
 mov bh,84h  ;char show_attribute
 .while TRUE
  .if byte ptr [esi] != 0
   mov bl,byte ptr [esi]
   mov word ptr [edi],bx
   inc esi
   inc edi
   inc edi
  .else
   .break
  .endif
 .endw
 invoke MmUnmapIoSpace,lpvmem,8000h
 ret
_DisplayString endp
            最后不要忘了用MmUnmapIoSpace取消映射。
 
        c. 为了达到延时的效果调用ntoskrnl.exe中的api
             KeDelayExecutionThread,其原形如下:
NTSTATUS 
  KeDelayExecutionThread(
    IN KPROCESSOR_MODE
   WaitMode ,
    IN BOOLEAN
   Alertable ,
    IN PLARGE_INTEGER
   Interval
    );
            其中 WaitMode选择 KernelMode,将可报警置为FALSE.值得注意的
        是第3个参数Interval,这个参数说明如下:
Interval
Specifies the absolute or relative time, in units of 100 nanoseconds, for which the wait is to occur. A negative value indicates relative time. Absolute expiration times track any changes in system time; relative expiration times are not affected by system time changes.
 
  我们最好是用相对时间的延时方式,这就需要写成负数的形式将前导位
 
  全部置1。为了达到捕获键盘输入,需要直接访问IO端口64h和60h,
  这在ring0种都不成问题 。我同样写了一个子函数方便使用,代码如下:
 
;*************************************************************************
_WaitForInput proc
 local al_tmp:byte
 local interval:LARGE_INTEGER
 local turnsNow:dword
 mov dword ptr [interval],0ffffe000h
 mov dword ptr [interval+4],0ffffffffh
 mov turnsNow,0
 .while TRUE
  .if turnsNow == Turns
   .break
  .else
   inc turnsNow
   
   in al,64h
   test al,1
   jz Delay
   in al,60h
   mov al_tmp,al
   movzx eax,al_tmp
   cmp eax,1
   jz ExitWhile
   cmp eax,1eh
   jz ExitWhile
   cmp eax,0b0h
   jz ExitWhile
   cmp eax,1ch
   jnz Delay
   
  ExitWhile:
   .break
 
  Delay:
   invoke KeDelayExecutionThread,0,0,addr interval
  .endif
 .endw
 xor eax,eax
 mov al,al_tmp
 ret
_WaitForInput endp
;*************************************************************************
        d. 剩下来做的事就是在Main中判断用户输入的键码:
 invoke _DisplayString,addr szhopysay,Show_Pos_Line0
 invoke _DisplayString,addr szchoose,Show_Pos_Line1
 invoke _WaitForInput

  .if al == 01h
  ;do nothing
 .elseif al == 0b0h
  invoke _TryBS
 .else
  ;do nothing
 .endif
        运行的效果如图3所示:
图3
蓝屏的代码就不给出了,因为相信每个人都能写出不同的花样来。
写续篇的原因是因为正好看到驱网( [url]www.driverdevelop.com[/url] )的
一篇逆向的文章,想现学现卖一番,呵呵。暂时到这里吧(以前预告的
第3篇文章因为要结合VB的界面而且又有了新的想法,所以还要
等一段时间,呼呼),准备去看女足啦,哇咔咔.......(无语了,这不是我...
不是我....不是我 ... ...)
                                                                                                      侯佩|hopy
                                                                                                    写于2007.09.18
分享至
更多 0
一键收藏,随时查看,分享好友!
0人
了这篇文章
类别: 系统┆ 技术圈(0)┆阅读(354)┆评论(0) ┆  推送到技术圈返回首页


IDA Pro Advanced是目前最棒的一个静态反编译软件,是破解者不可缺少的利器!巨酷的反编译软件,破解高手们几乎都喜欢用这个软件。
IDA55 反编译很厉害,只是,IDA 的调试功能差了点儿。不如OD 和ICE ,应该说跨ARM 是其特点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值