原文链接:抢先DriverStudio夺取机器控制权(下篇)

上篇仅仅说到如何抢先DriverStudio,并在结尾留给大家一个遐想。现在我进一步拓展这个遐想,从而给大家更多的遐想。: ) 那么现在我要给这个驱动增加新的功能,不但抢先DriverStudio启动,而且给用户显示几行提示,并等待用户的输入,如果用户输入B 键则发生蓝屏,如果用户按任意其他键则继续往下执行,SoDriverStudio可以正常执行下去。

要完成这个功能必须解决两个问题:

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 - ) + ) *
Show_Pos_Line1 equ (Screen_W * (Screen_H - ) + ) * 函数内容如下: ;*************************************************************************
_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+], push ;MmNonCached
push 8000h ;NumberOfBytes
;push dword ptr [pa+5]
;push dword ptr [pa+1]
push dword ptr [pa+]
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] !=
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中的apiKeDelayExecutionThread,其原形如下:

 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+],0ffffffffh mov turnsNow, .while TRUE
.if turnsNow == Turns
.break
.else
inc turnsNow in al,64h
test al,
jz Delay in al,60h
mov al_tmp,al
movzx eax,al_tmp
cmp eax,
jz ExitWhile cmp eax,1eh
jz ExitWhile cmp eax,0b0h
jz ExitWhile cmp eax,1ch
jnz Delay ExitWhile:
.break Delay:
invoke KeDelayExecutionThread,,,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

蓝屏的代码就不给出了,因为相信每个人都能写出不同的花样来。写续篇的原因是因为正好看到驱网(www.driverdevelop.com)的一篇逆向的文章,想现学现卖一番,呵呵。暂时到这里吧(以前预告的第3篇文章因为要结合VB的界面而且又有了新的想法,所以还要等一段时间,呼呼),准备去看女足啦,哇咔咔.......(无语了,这不是我...不是我....不是我 ... ...)

侯佩|hopy

写于2007.09.18

[原创]抢先DriverStudio夺取机器控制权(下篇)的更多相关文章

  1. [原创]抢先DriverStudio夺取机器控制权(上篇)

    原文链接:抢先DriverStudio夺取机器控制权 废话不谈,言归正传!大家都知道,装了DriverStudio软件(我使用的是v3.2版)的系统在启动时会显示其配置画面,(如图0所示) 图 0 这 ...

  2. 【百度SEO优化】如何让蜘蛛爬行你的网站

    大家都知道,现在做网站简单,但是推广就比较困难了,可能一些商家引入投资,直接烧钱做广告来推广,但是对于一些小站长,是没有那么多资金的.因此我们就要懂得一些SEO优化的知识了,简单介绍一下: 怎么让百度 ...

  3. Hacker(25)----病毒攻防之认识病毒

    Internet中,计算机病毒是威胁计算机安全的程序.对于计算机病毒,用户不仅需要掌握其基础知识,还要认识常见的病毒及简单病毒制作方法.无论病毒基础还是制作简单病毒,用户需要掌握防御病毒的有效措施和专 ...

  4. Hacker(十一)----黑客常用入侵方法

    Internet中,为了防止黑客入侵自己的电脑,就必须了解黑客入侵目标计算机的常用方法.黑客常用的入侵方法有数据驱动攻击.系统文件非法利用.伪造信息攻击.远端操纵等. 一.数据驱动攻击 数据驱动攻击是 ...

  5. 用Delphi实现Windows的鼠标钩子函数

    Delphi是基于PASCAL语言的Windows编程工具,功能十分强大.然而在Delphi的帮助文件中,对Windows API函数的说明沿袭了 VC 的格式,和VC一样,对很多API函数的用法没有 ...

  6. (转) 深度强化学习综述:从AlphaGo背后的力量到学习资源分享(附论文)

    本文转自:http://mp.weixin.qq.com/s/aAHbybdbs_GtY8OyU6h5WA 专题 | 深度强化学习综述:从AlphaGo背后的力量到学习资源分享(附论文) 原创 201 ...

  7. Linux内核分析方法谈

    本文来自 http://blog.csdn.net/ouyang_linux007/article/details/7422346 Linux的最大的好处之一就是它的源码公开.同时,公开的核心源码也吸 ...

  8. [原创]Oracle 12c 抢先安装手迹

    [前言] Oracle 12c 终于投放市场了,唉,等了很久了.据官方说这是一个为云计算平台量身定做的版本....且不管真的假的,先让我们把它装上再说. 注:笔者在安装的过程中发现12c的安装过程,较 ...

  9. [原创] zabbix学习之旅七:如何远程操作被监控机器

    虽然我们已经创建了一个报警系统,但在实际场景中,运维人员从得到报警到实际解决问题有一定的时差,若业务系统没有做高可用,那业务不得不中断,对于某些要求严格的企业级环境,这是不可容忍的,那有没有方法能让z ...

随机推荐

  1. Struts2 访问web元素

    访问web元素的四种方法(耦合,依赖注入).(耦合,非依赖注入).(非耦合,依赖注入).(非耦合,非依赖注入) 耦合:可以得到HttpServletResponse,HttpServletReques ...

  2. jquery easyui filebox 上传附件 + asp.net后台

    form必须加这个属性enctype="multipart/form-data",否则后台获取不到文件 <script> function uploadFiles() ...

  3. Oracle EBS-SQL (PO-7):检查异常-非批准的供应商设置供货比例.sql

    select distinct msr.sourcing_rule_name            名称,msi.description                          说明,msi ...

  4. 论山寨手机与Android 【15】结束语

    去年11月,与人讨论山寨版Android智能手机的前景,最初觉得这个问题很容易回答.但是三言两语之后,不仅听者茫然,而且言者自己也意识到条理紊乱,说服力不强.于是决定写几篇文章,把这个问题展开说说.所 ...

  5. WPF按钮清空自带样式,以及透明按钮时,Grid的Background属性设置引起"点击"问题.

    1.空样式按钮 <Style x:Key="EmptyButtonStyle" TargetType="Button">            &l ...

  6. memcache 安装教程

    memcached:官网http://memcached.org/ 说明:memcached本身没有Linux版本,网上的windows 版本都是个人开发的. memcached和memcache区别 ...

  7. [置顶] 【cocos2d-x入门实战】微信飞机大战之三:飞机要起飞了

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11730601 不过明眼人一看就知道起飞的不是飞机,是背景,相对运动引起的错觉. 1 ...

  8. InputStream和OutputStream

    1.在java中stream代表一种数据流(源),javaio的底层数据元,---(想像成水龙头) 2.任何有能力产生数据流(源)的javaio对象就可以看作是一个InputStream对象既然它能产 ...

  9. Windows Azure 社区新闻综述(#69 版)

    欢迎查看最新版本的每周综述,其中包含有关云计算和 WindowsAzure 的社区推动新闻.内容和对话. 以下是过去一周基于您的反馈汇集在一起的内容: 文章.视频和博客文章 ·     使用 Azur ...

  10. 【邻接表字符串Hash】【HDU1800】Flying to the Mars

    题意: 给你N个数字,带前导0,问出现最多的数字个数 思路: 读入,清楚前导0,Hash. 用邻接表字符串Hash有一下几点注意 string,不要memset,否则地址也没了,涉及到stl的东西,少 ...