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

简介:

和DriverStudio"过不去"之加强版 

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

 

        上篇仅仅说到如何抢先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

蓝屏的代码就不给出了,因为相信每个人都能写出不同的花样来。

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

一篇逆向的文章,想现学现卖一番,呵呵。暂时到这里吧(以前预告的

第3篇文章因为要结合VB的界面而且又有了新的想法,所以还要

等一段时间,呼呼),准备去看女足啦,哇咔咔.......(无语了,这不是我...

不是我....不是我 ... ...)

                                                                                                      侯佩|hopy

                                                                                                    写于2007.09.18

文章

相关文章
|
缓存 API Android开发
Android经典实战之Kotlin Flow中的3个数据相关的操作符:debounce、buffer和conflate
本文介绍了Kotlin中`Flow`的`debounce`、`buffer`及`conflate`三个操作符。`debounce`过滤快速连续数据,仅保留指定时间内的最后一个;`buffer`引入缓存减轻背压;`conflate`仅保留最新数据。通过示例展示了如何在搜索输入和数据流处理中应用这些操作符以提高程序效率和用户体验。
171 6
|
存储 机器学习/深度学习 传感器
【发票识别】基于模板匹配实现发票识别研究附matlab代码
【发票识别】基于模板匹配实现发票识别研究附matlab代码
|
运维
《2021云上架构与运维峰会演讲合集》下载
《2021云上架构与运维峰会演讲合集》通过阿里云技术大咖分享云时代架构与研发运维趋势,任意门、大搜车、饿了么等优秀企业分享云上架构演进与运维最佳实践和圆桌论坛,资深技术从业人员共探行业发展前景等方面进行分析和探讨,将 2021 云上架构与运维峰会中的技术干货沉淀下来,以飨读者。
81 0
《2021云上架构与运维峰会演讲合集》下载
|
数据采集 缓存 JSON
python+pytest接口自动化(2)-HTTP协议基础
HTTP 即 HyperText Transfer Protocol(超文本传输协议),是互联网上应用最为广泛的一种网络协议。所有的 WWW 文件都必须遵守这个标准。 设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。HTTP 协议在 OSI 模型中属于应用层协议,应用层协议除了 HTTP 还有 FTP、SMTP、DNS、RIP、Telnet 等。
python+pytest接口自动化(2)-HTTP协议基础
|
新零售 算法 机器人
一个开发工程师,真的需要了解业务吗?
昨天,一位分析界的老前辈对我很无奈地摇摇头,“这帮程序员,不食人间烟火哪!” 我也深有感触,全世界的码农都一个鸟样。 这让我想起了,同样也是他,在多年之前,对我提了警醒——要重视业务。 从那之后,我一直狂奔在技术+业务的双修道路上。 放在以前,码农这个族群一定是稀罕动物。但在今天,这个世界最不缺的应该就是码农了,未来最廉价的也将是码农。
444 0
|
SQL 监控 关系型数据库
MySQL误操作数据恢复的简单实践(r11笔记第67天)
    前几天有个同事碰到了一个MySQL数据恢复的问题,他运行了一条update语句,结果忘记了加where条件,结果等反应过来已经晚了。我简单确认了下,是否存在备份,没有,是否开启了日志,没有。
1253 0
|
3天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1095 0
|
12天前
|
人工智能 运维 安全
|
2天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
429 9