首页
社区
课程
招聘
[原创]再和 DriverStudio 过不去之加强版:)
2007-9-18 17:38 7911

[原创]再和 DriverStudio 过不去之加强版:)

2007-9-18 17:38
7911

再和DriverStudio"过不去"之加强版

(<<抢先DriverStudio夺取机器控制权>>系列2)

(测试平台 windows 2000 sp4 + masm32v9.0)

[LEFT]上篇仅仅说到如何抢先DriverStudio,并在结尾留给大家一[/LEFT]

[LEFT]个遐想。现在我进一步拓展这个遐想,从而给大家更多的遐[/LEFT]

[LEFT]想。: )[/LEFT]

[LEFT]那么现在我要给这个驱动增加新的功能,不但抢[/LEFT]

[LEFT]DriverStudio 启动,而且给用户显示几行提示,并等待用[/LEFT]

[LEFT]户的输入,如果用户敲 B 键则发生蓝屏,如果用户按任[/LEFT]

[LEFT]意其他键则继续往下执行,So DriverStudio 可以正常执[/LEFT]

[LEFT]行下去。[/LEFT]

[LEFT]要完成这个功能必须解决两个问题:[/LEFT]

[LEFT]0 如何在系统引导时显示字符串;[/LEFT]

[LEFT]1 如何捕获用户输入并延时等待。[/LEFT]

[LEFT]那么从哪入手呢?我首先想到直接写Video Buffer和直接捕获[/LEFT]

[LEFT]键盘寄存器,但是这个方法可行吗?我们不妨先看一下[/LEFT]

[LEFT]DriverStudio的 bootcfg.sys 是如何做的。[/LEFT]

[LEFT]照例用IDA载入bootcfg.sys,按照DriverStudio初始化[/LEFT]

[LEFT]显示的字符串来到驱动的DriverEntry,如图0[/LEFT]



图0

[LEFT]通过查找字符串的引用很快就找到对应的指令调用点,全文[/LEFT]

[LEFT]有一个引用,如图1所示:[/LEFT]



图1

[LEFT]为了确认这一点,我将地址0x107dd - 0x107e6中的指令全[/LEFT]

[LEFT]部nop掉,[/LEFT]



图2

[LEFT]这时原先应该显示"Press ESC ..."这段话的地方果然没有显示,[/LEFT]

[LEFT]而是直接跳到 Config 对话框那里去了。既然找对了地方下一[/LEFT]

[LEFT]步就好办了,通过进一步反汇编bootcfg.sys的代码片断,[/LEFT]

[LEFT]更加印证了我先前的想法![/LEFT]

[LEFT]下面进一步谈谈DriverStudio是如何做的:[/LEFT]

[LEFT]a. 使用 MmMapIoSpace 完成物理地址到虚拟地址的映射,[/LEFT]

[LEFT]因为内核已经进入保护模式,并且开了分页。要想读写物[/LEFT]

[LEFT]理地址必须做这样的映射(我的[/LEFT]

[LEFT]Windows 核心编程研究系列之二:读取指定物理内存地址[/LEFT]

[LEFT]中的内容 [/LEFT]

[LEFT]一篇中有更为详细的说明)。[/LEFT]

[LEFT]该函数原形如下:[/LEFT]

[LEFT]PVOID
MmMapIoSpace(
IN PHYSICAL_ADDRESS [I]PhysicalAddress[/I],
IN ULONG [I]NumberOfBytes[/I],
IN MEMORY_CACHING_TYPE [I]CacheType[/I][/LEFT]

[LEFT]参数含义都比较明显,其中CacheType我们选择NoCache类型。[/LEFT]

[LEFT]b. 使用类似于bios字符中断显示的规则,一个字符占一[/LEFT]

[LEFT]个word(16bit),低位为字符的ascii码,高位为显示属性。[/LEFT]

[LEFT]这里要显示闪烁的红色字体,所以属性为 84h。与bios[/LEFT]

[LEFT]中断不同的是,我们直接写视频缓冲,而不是调用 int 10h。[/LEFT]

[LEFT]视频缓冲的物理地址为 0b8000h 。我写了一个显示函数,[/LEFT]

[LEFT]包含两个参数:[/LEFT]

[LEFT]第一个是字符串地址,第二个是显示的位置。[/LEFT]

[LEFT]为了美观,我将2行字符串显示在屏幕的倒数最后两行上:[/LEFT]

[LEFT]Screen_W equ 50h[/LEFT]

[LEFT]Screen_H equ 19h ;1ch[/LEFT]

[LEFT]Show_Pos_Line0 equ (Screen_W * (Screen_H - 2) + 5) * 2[/LEFT]

[LEFT]Show_Pos_Line1 equ (Screen_W * (Screen_H - 1) + 5) * 2[/LEFT]

[LEFT]函数内容如下:
;******************************************************[/LEFT]

[LEFT]_DisplayString proc _lpstr,_pos[/LEFT]

[LEFT]local pa:qword
local lpvmem:dword[/LEFT]

[LEFT]mov dword ptr [pa],Video_Addr[/LEFT]

[LEFT]mov dword ptr [pa+4],0[/LEFT]

[LEFT]push 0 ;MmNonCached[/LEFT]

[LEFT]push 8000h ;NumberOfBytes[/LEFT]

[LEFT]push dword ptr [pa+4][/LEFT]

[LEFT]push dword ptr [pa][/LEFT]

[LEFT]call MmMapIoSpace[/LEFT]

[LEFT]mov lpvmem,eax[/LEFT]

[LEFT]mov esi,_lpstr[/LEFT]

[LEFT]mov edi,lpvmem[/LEFT]

[LEFT]add edi,_pos[/LEFT]

[LEFT]mov bh,84h ;char show_attribute[/LEFT]

[LEFT].while TRUE[/LEFT]

[LEFT].if byte ptr [esi] != 0[/LEFT]

[LEFT]mov bl,byte ptr [esi][/LEFT]

[LEFT]mov word ptr [edi],bx[/LEFT]

[LEFT]inc esi[/LEFT]

[LEFT]inc edi[/LEFT]

[LEFT]inc edi[/LEFT]

[LEFT].else[/LEFT]

[LEFT].break[/LEFT]

[LEFT].endif[/LEFT]

[LEFT].endw[/LEFT]

[LEFT]invoke MmUnmapIoSpace,lpvmem,8000h[/LEFT]

[LEFT]ret[/LEFT]

[LEFT]_DisplayString endp[/LEFT]

[LEFT]最后不要忘了用MmUnmapIoSpace取消映射。[/LEFT]

c. 为了达到延时的效果需要调用ntoskrnl.exe中的api

KeDelayExecutionThread,其原形如下:

[LEFT]NTSTATUS
KeDelayExecutionThread(
IN KPROCESSOR_MODE [I]WaitMode[/I],
IN BOOLEAN [I]Alertable[/I],
IN PLARGE_INTEGER [I]Interval[/I]
);[/LEFT]

[LEFT]其中 WaitMode选择KernelMode,将可报警置为FALSE.尤为值得[/LEFT]

[LEFT]注意的是第3个参数Interval。这个参数说明如下:[/LEFT]

[I]Interval [/I]

[I]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.[/I]

我们最好使用相对时间的延时方式,这就需要写成负数的形式,而将

参数前缀位(byte)全部置1。为了达到捕获键盘输入,需要直接访问

IO端口64h和60h,这在ring0种都不成问题 。我同样写了一个子函数方

便调用,代码如下:

[LEFT];************************************************************[/LEFT]

[LEFT]_WaitForInput proc[/LEFT]

[LEFT]local al_tmp:byte
local interval:LARGE_INTEGER
local turnsNow:dword[/LEFT]

[LEFT]mov dword ptr [interval],0ffffe000h[/LEFT]

[LEFT]mov dword ptr [interval+4],0ffffffffh[/LEFT]

[LEFT]mov turnsNow,0[/LEFT]

[LEFT].while TRUE[/LEFT]

[LEFT].if turnsNow == Turns[/LEFT]

[LEFT].break[/LEFT]

[LEFT].else[/LEFT]

[LEFT]inc turnsNow[/LEFT]

[LEFT]in al,64h[/LEFT]

[LEFT]test al,1 ;is anykey is pressed ?[/LEFT]

[LEFT]jz Delay[/LEFT]

[LEFT]in al,60h[/LEFT]

[LEFT]mov al_tmp,al[/LEFT]

[LEFT]movzx eax,al_tmp[/LEFT]

[LEFT]cmp eax,1[/LEFT]

[LEFT]jz ExitWhile[/LEFT]

[LEFT]cmp eax,1eh[/LEFT]

[LEFT]jz ExitWhile[/LEFT]

[LEFT]cmp eax,0b0h[/LEFT]

[LEFT]jz ExitWhile[/LEFT]

[LEFT]cmp eax,1ch[/LEFT]

[LEFT]jnz Delay[/LEFT]

[LEFT]ExitWhile:[/LEFT]

[LEFT].break[/LEFT]

[LEFT]Delay:[/LEFT]

[LEFT]invoke KeDelayExecutionThread,0,0,addr interval[/LEFT]

[LEFT].endif[/LEFT]

[LEFT].endw[/LEFT]

[LEFT]xor eax,eax[/LEFT]

[LEFT]mov al,al_tmp[/LEFT]

[LEFT]ret[/LEFT]

[LEFT]_WaitForInput endp[/LEFT]

[LEFT];**********************************************************[/LEFT]

[LEFT]d. 剩下来做的事就是在Main中判断用户输入的键码:[/LEFT]

[LEFT]invoke _DisplayString,addr szhopysay,Show_Pos_Line0[/LEFT]

[LEFT]invoke _DisplayString,addr szchoose,Show_Pos_Line1[/LEFT]

[LEFT]invoke _WaitForInput[/LEFT]

[LEFT].if al == 01h[/LEFT]

[LEFT];do nothing[/LEFT]

[LEFT].elseif al == 0b0h[/LEFT]

[LEFT]invoke _TryBS[/LEFT]

[LEFT].else[/LEFT]

[LEFT];do nothing[/LEFT]

[LEFT].endif[/LEFT]

[LEFT]运行的效果如图3所示:[/LEFT]



图3

[LEFT]蓝屏的代码就不给出了,因为相信每个人都能写出N种来[/LEFT]

[LEFT]写续篇的原因是因为正好看到驱网(www.driverdevelop.com)的[/LEFT]

[LEFT]一篇逆向的文章,想现学现卖一番,呵呵。[/LEFT]

[LEFT]暂时到这里吧(以前预告的第3篇文章因为要将原先结合VB的[/LEFT]

[LEFT]界面变为C#而且又有了新的想法,所以还要等一段时间,呼呼),准[/LEFT]

[LEFT]备去看女足啦,哇咔咔.......(无语了,这不是我...不是我....[/LEFT]

[LEFT]不是我 ... ...)[/LEFT]

[LEFT](因为写得仓促,难免有不妥的地方,希望大家多多指出,谢谢)[/LEFT]

[LEFT](点击小图看大图)[/LEFT]

侯佩|hopy


写于2007.09.18

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (4)
雪    币: 442
活跃值: (107)
能力值: ( LV9,RANK:350 )
在线值:
发帖
回帖
粉丝
hopy 8 2007-9-18 17:49
2
0
晕格式怎么....
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
bithaha 5 2007-9-18 18:20
3
0
好帖子,学习学习
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
炉子 3 2007-9-18 18:28
4
0
蛮和谐的,偶顶顶。
雪    币: 267
活跃值: (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Rinrin 1 2007-9-18 19:01
5
0
我记得蓝屏界面的字是HalDisplayString写上去的
不知道这里能不能用
游客
登录 | 注册 方可回帖
返回