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

[原创]和DriverStudio过不去之加强版:) 和DriverStudio"过不去"之加强版 (>系列2)         上篇仅仅说到如何抢先DriverStudio,并在结尾留给大家一个遐想。现在我进一步拓展这个遐想,从而给大家更多的遐想。: )        那么现在我要给这个驱动增加新的功能,不但抢先DriverStudio启动,而且给用户显示几行提示,并等待用户的输入,如果用户输入B 键则发生蓝屏,如果用户 阅读详情
作 者: hopy
时 间: 2007-09-18,17:38
链 接: http://bbs.pediy.com/showthread.php?t=51896

 
再和DriverStudio"过不去"之加强版 
 
 
(<<抢先DriverStudio夺取机器控制权>>系列2)
 
(测试平台 windows 2000 sp4 + masm32v9.0)
 
 
 
 
上篇仅仅说到如何抢先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(16bit), 低位为字符的ascii码,高位为显示属性。
 
我 这里要显示闪烁的 红色字体,所以属性为 84h。与bios
 
中断 不同的是,我们直接 写视频缓冲,而不是调用 int 10h。
 
视频缓冲的物理地址为  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],Video_Addr
 
mov dword ptr [pa+4],0
 
push 0 ;MmNonCached
 
push 8000h ;NumberOfBytes
 
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.
 
 
我们最好使用相对时间的延时方式,这就需要写成负数的形式,而将

参数前缀 位(byte) 全部置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 ;is anykey is pressed ?
 
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
 
 
蓝屏的代码就不给出了,因为相信每个人都能写出N种来 。
 
写续篇的原因是因为正好看到驱网( www.driverdevelop.com )的
 
一篇逆向的文章,想现学现卖一番,呵呵。
 
暂时到这里吧(以前预告的 第3篇文章因为要将原先结合VB的
 
界面变为C# 而且又有了新的想法,所以还要 等一段时间,呼呼),准
 
备去看女足 啦,哇咔咔.......(无语了,这不是 我... 不是我....
 
不是我 ...  ...) 
斯坦福大学CS224d基础1:线性代数知识 本文为斯坦福CS229的内容,也是CS224d课程的背景数学知识。概括了在机器学习和深度学习中用到的大部分线性代数知识。为了便于大家查漏补缺,这里根据英文版本整理了一个中文版本。 阅读详情

相关推荐

STM32接入CH340芯片的升级电路及初始化进入升级模式(死机)问题处理

MCU-REST 在 MCU-BOOT0 处于低电平状态下,进行下拉操作,在MCU-REST 与 MCU-BOOT0 恢复正常电平时,将导致MCU死机,MCU-REST 先于 MCU-BOOT0 下拉可解决该问题;MCU-REST 在 上升沿结束时将判断 MCU-BOOT0 的状态,MCU-BOOT0 处于高电平,MCU死机,MCU-BOOT0 处于低电平 MCU 正常;

LuDvei的博客 2493

MmMapIoSpace函数

MmMapIoSpace函数 是用来把wince中的物理地址转换成虚拟地址的一个函数。这个函数在ceddk.h和ceddk.lib中有详细的定义。 PVOID MmMapIoSpace( PHYSICAL_ADDRESS PhysicalAddress, ULONG NumberOfBytes, BOOLEAN CacheEnable ); xDBO#w "}  如果参数Phys

zacklin的专栏 4892

OpenWebUI联网搜索实战:如何用SearXNG让本地大模型获取实时信息(附百度/360配置)

本文详细介绍了如何通过部署开源元搜索引擎SearXNG,为本地运行的OpenWebUI大语言模型(如Qwen、Llama)配置联网搜索功能,解决其知识库过时的问题。文章重点讲解了SearXNG的Docker部署、集成国内搜索引擎(如百度、360)的配置方法,以及如何与OpenWebUI无缝对接,从而实现本地大模型获取实时、准确的中文信息,提升其实用性。

weixin_28835583的博客 1887

程序访问物理地址之MmMapIoSpace 与 OALPAtoVA

(1)MmMapIoSpace 用法     在程序中使用的都是虚拟地址,如果要对物理地址进行操作,需要用到MmMapIoSpace把物理地址映射到虚拟地址,如:pBaseAddress = (PUCHAR)MmMapIoSpace(ioPhysicalBase, Size, FALSE);访问pBaseAddress的指向地址,就是访问被映射后ioPhysicalBase定义的物理地址。

zhandoushi的专栏 9375

模拟量传输4-20ma电流

大家可能会非常熟悉RS232,RS485,CAN等工业上常用的总线,他们都是传输数字信号的方式。那么,我们用什么方式来传输模拟信号呢?工业上普遍需要测量各类非电物理量,例如温度、压力、速度、角度等,这些都需要转换成模拟量电信号才能传输到几百米外的控制室或显示设备上。工业上最广泛采用的是用4~20mA电流来传输模拟量。 采用电流信号的原因是不容易受干扰,因为工业现场的噪声电压的幅度可能达到数V,但是噪声的功率很弱,所以噪声电流通常小于nA级别,因此给4-20mA传输带来的误差非常小;电流源内阻趋于无穷.

tangdongming的博客 1万+

Python 包安装报错:ERROR: No matching distribution found for xxx 的全面排查指南

本文全面解析Python包安装时常见的`ERROR: No matching distribution found for xxx`报错。从检查包名拼写、网络与镜像源配置,到深入分析Python版本、操作系统等环境兼容性问题,提供了从简到繁的排查步骤。文章还介绍了使用`pip debug`、`-v`参数等高级诊断工具,并给出了更换包管理器、使用Docker等终极解决方案,帮助开发者高效解决依赖安装难题。

p8q9r0的博客 898

MmMapIoSpace函数详解

MmMapIoSpace函数 是用来把wince中的物理地址转换成虚拟地址的一个函数。这个函数在ceddk.h和ceddk.lib中有详细的定义。我 记录这段话的原因,是怕我以后把这个函数给忘了,嘻嘻,现在记下了,以后不用到处找了。其实,关于这个函数如何用,在pb的帮助中说的很清楚。大家可以搜搜看。

suncilang的专栏 3793

高等数学第五章---定积分(§5.3定积分的计算方法)

这篇博客详细讲解定积分的计算方法,包括直接法、凑微分法、变量代换法和分部积分法。通过典型例题演示如何运用这些技巧计算定积分,特别强调换元必换限的原则和奇偶函数的简化处理。内容涵盖代数变形、三角代换、分段函数积分等常见题型,并附有详细的解题步骤和常见错误分析。适合微积分学习者系统掌握定积分计算技巧,提升解题效率。文中还包含积分等式证明和变限积分函数求导等进阶内容,帮助读者深入理解定积分的应用。

2302_77045867的博客 4350

应用程序访问物理地址之MmMapIoSpace

应用程序访问物理地址之MmMapIoSpace来自http://hi.baidu.com/relayon/blog/item/4039bf0af040de36b0351d3d.html2009-04-10 15:05应用程序访问物理地址之MmMapIoSpace应用环境:WinCE500在应用程序中使用的都是虚拟地址,如果要对物理地址进行操作需要用到MmMapIoSpa

gooogleman#foxmail.com 3万+

ADS(Arm Developer Suite)安装的坑!

实验课老师让我们区安装ADS,作为嵌入式开发的工具,原本以为这只是一个简单的软件,但是当我安装的时候,我才发现这软件太难了!安装了我大半天,看了其他的博客之后,最终才安装成功???????? 安装过程的一个巨坑就是:安装路径!以及安装许可注册文件 如果没有注意路径,最后安装成功以后打开软件就是蜜汁报错???? 报错了怎么办?删掉已安装的东西,重新安装吧,而且要删干净 再次安装的时候,打开安装包是这个提示...

weixin_42795819的博客 8221

英飞凌TC3xx之一起认识GTM系列(六)如何实现GTM与VADC关联的配置

本文给出了GTM与EVADC之间关联的细节,并通过两个实例分别说明了如何对寄存器进行配置。

无所适从的我的博客 2933

和DriverStudio"过不去"之加强版

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

weixin_34217711的博客 92

骑砍Ⅱ霸主MOD开发(16)-FaceKey&BannerKey

摘要:本文介绍了FaceKey人物模型和BannerKey旗帜模型的生成流程。FaceKey通过序列化参数生成人物模型,包括头部(脸部、嘴、睫毛、眼睛)、眉毛、头发、身体和躯干等组件,每个部分通过特定标签和骨骼绑定实现。BannerKey则通过解析参数生成旗帜模型,包括模型、贴图和颜色等元素。两种模型都采用参数化设计和XML配置文件实现模型生成与定制。

骑砍战团&霸主MOD开发 2289

了解MmMapIoSpace以及MmUnmapIoSpace函数的实现原理以及实现方法

了解MmMapIoSpace以及MmUnmapIoSpace函数的实现原理以及实现方法 CodeCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->  1 源码路径  2 H:/WINCE600/PUBLIC/COMMON/OAK/DRIVERS/

gooogleman#foxmail.com 8060

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

物理地址转换成虚拟地址MmMapIoSpace

PVOID MmMapIoSpace( PHYSICAL_ADDRESS PhysicalAddress, ULONG NumberOfBytes, BOOLEAN CacheEnable ); 如果参数PhysicalAddress用的是OEMAddressTable的Physical Address,则要把这个地址右移8位. 如果参数PhysicalAddress用的是OEMAddressTa

基岩的专栏 2187

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MmMapIoSpace函数在EVC中应该注意的问题

作者:wogoyixikexie@gliet----------------------------------------------------------------------------------------------------------------------在http://www.tech-archive.net/Archive/WindowsCE/microsoft

gooogleman#foxmail.com 2519

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

wdk中如何将内核全局变量映射给用户态

在 WDK 中,可以使用 MmMapIoSpace 函数来将内核全局变量映射到用户态。使用时,需要提供内核全局变量的地址和要映射的内存的大小,函数会返回一个指向映射后的内存的指针。例如: PVOID pMappedMemory =MmMapIoSpace(pGlobalVar, sizeof(GLOBAL_VAR), MmNonCached); 注意:使用 MmMapIoSpace 函数映射内存...

weixin_35751194的博客 221

MmMapIoSpace和MmUnMapIoSpace

应用程序访问物理地址之MmMapIoSpace 应用环境:WinCE500 在应用程序中使用的都是虚拟地址,如果要对物理地址进行操作 需要用到MmMapIoSpace把物理地址映射到虚拟地址如: 如:pBaseAddress = (PUCHAR)MmMapIoSpace(ioPhysicalBase, Size, FALSE); 同上,访问pBaseAddress的指向地址,就为访问被映射后ioPhysicalBase定义的物理地址。 PVOID MmMapIoSpace(

stevekk的专栏 684

MmMapIoSpace以及MmUnmapIoSpace,VirtualAlloc和VirtualCopy 函数的实现原理以及实现方法

首先说明: LPVOID VirtualAlloc(LPVOID lpAddress, DWORD dwSize, DWORD flAllocationType, DWORD flProtect );VirtualAlloc 只是在虚拟地址申请一个空间,lpAddress 大多数为0指由系统来自动分配虚拟地址BOOL VirtualCopy( LPVOID lpvDest, LPV

lgb571的专栏 1057

VirtualAlloc,VirtualCopy和MmMapIoSpace

VirtualAlloc,VirtualCopy和MmMapIoSpace 在WinCE的驱动程序里经常要去访问硬件设备,对硬件设备寄存器进行操作,如CPU的IOPORT,中断寄存器等,这就要使用VirtualAlloc,VirtualCopyMmMap

aristolto的专栏 1397

驱动开发

<br />一:寄存器的使用:<br />1、wince内部对物理地址的访问:<br />可以有3个途径。<br />1:直接使用g_oalAddressTable(oemaddrtab_cfg.inc)的已经定义好的,物理地址对应的虚拟地址。<br />如:<br />DCD     0x80000000, 0x30000000, 128     ;<br />访问虚拟地址0x80000000实际就是访问物理地址0x30000000。<br /> <br />2:在OAL层,使用OALPAtoVA函数。<

huazigg的专栏 2627

第一篇 windows驱动之WinRing0.sys的开发及使用(电脑温度监控软件开发)

从鲁大师的温度监控谈起,现代的CPU、GPU等芯片一般都具有温度监控的功能,比如我们可能会遇到的电脑散热不好导致系统直接关机黑屏,就是cpu检测到当前温度高于额定温度执行的操作。鲁大师的温度监控模块就相当于把这些信息从底层硬件读取,然后通过上层UI显示给用户。其核心就是与硬件的通信驱动。现在win10的驱动都可以通过系统更新直接完成,不再需要安装流氓软件“驱动精灵”、“驱动人生”等。我一般只用到温度检测模块,其他功能于我都是鸡肋,为了一个很小的功能,我需要安装一个庞大的鲁大师程序,甚是不划算。

qq_25231249的博客 9259

DriverStudio开发PCI设备DMA数据传输

DriverWizard向导可以创建基本的wDM驱动程序框架,包括总线类型,地址空间,中断源,DMA资源,以及IOCTL(i/o控制代码)的定义等等。详细情况可参看DriverStudio的帮助文档,以下主要介绍如何用DriverWorks编写DMA方式的驱动程序。       DriverWorks关于DMA操作。封装了三个类:KDmaAdapter, KDmaTransfer和KCommo

shejiannan的专栏 1820
上一篇: 淘来的几个SMC代码
下一篇: 了解 Windows Vista 内核
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值