Windows 驱动编程
less@more
.....
展开
-
驱动程序和应用程序之间通信
正文 Q: 请问有什么方法实现驱动程序主动和应用程序进行实时通讯,而不用应用程序采用定时查询的方法? 比如驱动有一事件发生需要立即通知应用程序,或驱动程序需要向应用程序读取一些内容. A: 有一个很容易的方式,在驱动程序和应用程序之间用一个事件。 在应用程序CreateFile的时候,驱动程序IoCreateSynchronizationEvent一个有名的事件,然后应用程序CreateEvent转载 2008-02-25 08:54:00 · 1830 阅读 · 0 评论 -
基础IRP 和I/O Stack location 的关系
对于刚学驱动的人来说,或许对IRP和IO stack location的关系还有点不清楚。这里就说说他们之间的关系。具体IRP 和IO stack location相关知识,会在以后文章中说明。下面先放上IRP和IO stack location结构的定义。可惜的是IRP是半透明的。 typedef struct _IRP { . . PMDL MdlAddres原创 2009-12-29 21:50:00 · 5367 阅读 · 0 评论 -
基础 驱动通信IO类型Buffered,Direct,Neither
在和驱动通信过程中,我们一般都会碰到应该选择何种类型的缓冲类型进行通信。本文将简要的介绍一下这3中类型的IO缓冲。 我想用的最多的就是Buffered这种IO进行的。现在来说说IO manager是如何对这3中类型的IO进行处理的。 1.IO manager接收到由上层下发来的请求,这里假设这个请求既包含有输入缓冲,又有输出缓冲。这个看看DeviceIoControl中的参数原创 2010-01-05 18:38:00 · 1491 阅读 · 0 评论 -
如何用键盘来生成系统的dump文件
Windows下,默认可以使用CTRL+SCROLL+SCROLL强制系统BSOD生成Dump文件。有时这是解决bug得非常有效的方法,比如说Windows没有响应,就可以生成dump文件来看看Windows到底在干什么了。不过有一天拿到一款上网本,系统老hang,可是键盘上没有SCROLL键。这可麻烦了,无法生成dump文件分析问题了。(接个USB键盘呗!至于为什么不能用USB键盘,看后面的ms原创 2010-04-21 10:02:00 · 1829 阅读 · 0 评论 -
使用VS2005开发64位驱动程序需要注意的一些问题
1、首先在Autoexec.bat里边设置好 Set WDKDIR=L:/DDK/Vista 64位驱动使用Vista WDK来开发。 Include: $(WDKDIR)/inc/ddk;$(WDKDIR)/inc/api Lib : $(WDKDIR)/lib/wnet/amd642、64位驱动,编译时记得设置相应标志: 删除:WIN32,_X86_=1 添加:_AMD64_;_WIN64 更改:_WIN32_原创 2011-01-05 18:32:00 · 2908 阅读 · 0 评论 -
扫描进程内存需要注意加锁
<br /> 最近在搞扫描进程内存部门,但是偶尔会出现蓝屏的问题,经过分析是进程已退出,但是还是在对这个进程扫描。其中在扫描之前,需要attach到这个进程上去的,但是为什么会出现这样的一个情况呢。首先我查看了wrk,rectos和nt4,也使用windbg分析了进程结束和读取进程内存部分的代码。发现ms在对进程结束之前会去获取一个进程锁,其中在PspExitThread一开始,会发现这个地方一开始就要检测进程是否被attach上了,如果坚持的就立马回调用bugcheck的。为了尽量的避免这样的蓝原创 2011-01-30 16:38:00 · 2128 阅读 · 0 评论 -
NT 环境下用户态直接读写端口原理浅析
<br />关于在 NT 环境下用户态直接读写端口这码子事,本应该是95-96年 NT 架构刚刚出来时讨论的东西,现在翻出来炒现饭,实在是不得已的事情。因为前几天有朋友问起 TSS 中 IOPM 表的问题,而网上这方面的可用文章大多只是泛泛而谈,空有实现方法没有原理分析,没办法直接引用。而这些文章追述其源头基本上都是从 Dale Roberts 在 96 年 5 月发表在 Dr. Dobb's Journal上的 Direct Port I/O and Windows NT 一文转述而来,可转载 2011-03-22 11:32:00 · 1224 阅读 · 0 评论 -
通杀所有游戏的鼠标键盘模拟的方法:
<br />通杀所有游戏的鼠标键盘模拟的方法:<br /><br />驱动级模拟:<br /><br />驱动级模拟:直接读写键盘的硬件端口!<br /> 有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时性控制的要求比较高,比如赛车游戏,要求以最快速度响应键盘输入。而windows消息由于是队列形式的,消息在传递时会有不少延迟,有时1秒钟也就传递十几条消息,这个速度达转载 2011-03-22 12:22:00 · 5909 阅读 · 0 评论 -
KD extension DLLs & KDCOM protocol
KD extension DLLs & KDCOM protocol<br />WinDbg debugger allows you to debug all modern versions of Windows using a built-in kernel debugger and either COM or IEEE1394 port. Let's see how is it implemented. To start windows in Kernel Debugging mode, you转载 2011-03-28 13:51:00 · 1294 阅读 · 0 评论 -
vista win7 64位在何种情况下可以加载未签名驱动
<br />vista 、win7 64位系统添加了代码完整性检查,也就是对那些没有加过签名的驱动程序,在这些系统上是无法加载起来的。如果是通过服务的方式加载驱动返回的是无法识别的错误号,如果你直接调用ntdll!zwloaddriver的话,那么这个返回值是C000428,不过如要通过这样的方式加载驱动需要有sc_loaddriver_privilege的权限。废话不说了,就说说怎么做可以让未签名驱动加载起来的。<br />1.通过F8,在系统起来时,进去,选“禁止强制驱动签名”<br />2.将系统设置原创 2011-04-13 14:50:00 · 3755 阅读 · 0 评论 -
变速齿轮分析
<br />各种变速齿轮基本上是通过hook一系列的时间函数进行的。<br />主要的hook方式有iat和inline。其中A变速器,采用的就是iat hook,其他的基本上都是使用inline hook的。<br />如果从驱动获取tickcount,可以部分inline hook方式的工具,而对于通过修改时钟的方式还不能。<br /><br /><br />使用Dos读取bios时间的方法<br />MOV AH,0 ;GET BIOS TIME <原创 2011-04-19 16:18:00 · 6174 阅读 · 0 评论 -
windows x64 vista以上系统代码完整性校验分析
<br /><br />.text:00000001400E63EE MiResolveTransitionFault mov eax, 0C0000428h<br />.text:00000001400E640D MiResolveTransitionFault mov eax, 0C0000428h<br />.text:00000001400E671C MiResolveProtoPteFault mov原创 2011-04-18 10:25:00 · 4446 阅读 · 0 评论 -
解析Windows 2000/XP进程工作集
<br /> 在《解析Windows 2000/XP物理内存管理》中我详细的介绍了页框数据库(Page Frame Database)的概念,提到在物理内存的组织与管理方面对于每个页面系统都在页框数据库中保存一个结构,用于跟踪页面状态等。但页框数据库并不能真正协调物理内存的使用。我们知道,Windows是一个多任务的操作系统,而物理内存却是一个相对贫乏的资源,为避免某个进程(或是系统)耗尽这一资源,引入了工作集(WorkingSet)的概念。WorkingSet是内存管理一个相当重要的术语,在Win转载 2011-04-20 17:43:00 · 1704 阅读 · 0 评论 -
基础驱动和设备对象关系
没事写点基础的东西,有写的不当的地方,希望能指出。 写过驱动或者正在学习驱动编程的人可能都碰到了驱动对象和设备对象。DriverObject和DeviceObject的关系。这里就做个说明吧。首先来看看这两个结构体定义,从中我们可以发现一些有意思的东西。typedef struct _DRIVER_OBJECT { CSHORT Type; CSHOR原创 2009-12-19 16:07:00 · 1199 阅读 · 0 评论 -
64位vista,win7中KeServiceDescriptorTable问题
最近在移植64位驱动,原本在32位驱动中使用到了KeServiceDescTable进行SSDT Hook等。但是在64位系统上是不允许进行SSDT HOOk的。在64位的XP系统上,使用到这个导出符号式没有问题的。但是在64位Vista和Win7下面,如果使用了这个符号,那么你在加载驱动的时候,返回的错误是找到不指定文件。在修这个bug真是有点吃力,只能一点点个跟进去,还好手边有WRK原创 2009-12-11 15:14:00 · 3202 阅读 · 1 评论 -
Windows NT 驱动程序开发人员提示 -- 应注意避免的事项
1. 一定不要在没有标注 I/O 请求数据包 (IRP) 挂起 (IoMarkIrpPending) 的情况下通过调度例程返回 STATUS_PENDING。 2. 一定不要通过中断服务例程 (ISR) 调用 KeSynchronizeExecution。 它会使系统死锁。 3. 一定不要将 DeviceObject->Flags 设置为 DO_BUFFERED_IO 和 DO_DIREC转载 2010-02-08 14:32:00 · 752 阅读 · 0 评论 -
驱动程序内存分配
何谓可分页和非分页内存 默认情况下,内核加载器会加载所有的代码部分和全局数据到非分页内存中。而且,加载器是一次加载整个驱动的可执行文件,包括相关的DLL。加载后,内核加载器关闭驱动程序文件,甚至你可以删除当前正在执行的驱动文件。但是,你可以告诉加载器你希望驱动的哪部分是可分页,所谓可分页,就是可能会被换页出内存(Page out)。可以使用下面的指令来实现:#define转载 2008-02-25 09:11:00 · 1558 阅读 · 0 评论 -
Mapping NT Status Error Codes to Win32 Error
SUMMARYWhen a kernel-mode driver is called because of an input/output (I/O) request from the Win32 subsystem, the status code returned by the kernel- mode driver will be translated to the status c转载 2008-02-26 10:45:00 · 2721 阅读 · 0 评论 -
WinDebug z在VMWare中的使用
虚拟机安装调试方法一.安装文件: VMware 安装路径:C:/Program Files/VMware/VMware Workstation Symbols(代码库) 安装路径:D:/tools/Symbols WinDbg 安装路径:C:/Program Files/Debugging Tools for Windows/windbg.exe 虚拟Xp 安装路径:E:/原创 2008-04-08 10:43:00 · 1528 阅读 · 1 评论 -
驱动程序与应用程序之间共享内存
随手写点自己碰到的问题。在写内核模式的驱动程序时,经常需要做的就是驱动程序和应用程序之间的通信。如应层程序和驱动程序之间共享事件来完成同步,事件可以有应用程序来创建然后将其句柄下发到驱动程序中,驱动程序进行引用等操作,就可以实现共享事件了。这里就不说这个了,主要说说驱动和应用程序之间的共享。 共享的方式有很多,我们在应用层编程时,也经常需要进程之间共享内存。可以用过SendMessage原创 2008-06-27 16:03:00 · 4170 阅读 · 2 评论 -
用驱动实现自己的 ZwOpenProcess ZwReadVirtualMemory ZwWriteVirtualMemory
懒得自己写了,就转一个帖子吧。用驱动实现自己的 ZwOpenProcess ZwReadVirtualMemory ZwWriteVirtualMemory/* jhxxs.C Author: Last Updated: 2006-03-23 This framework is generated by EasySYS 0.3.0 This te转载 2009-08-24 13:42:00 · 5621 阅读 · 0 评论 -
Hook SSDT
#include "ntddk.h"#define NT_DEVICE_NAME L"//Device//ProtectProcess"#define DOS_DEVICE_NAME L"//DosDevices//ProtectProcess"#define IOCTL_PROTECT_CONTROL CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFE转载 2009-08-24 14:13:00 · 881 阅读 · 0 评论 -
如何从进程名获得进程ID
#include #include "ntifs.h"HANDLE RetrivePID( char* ProcessName ){ PEPROCESS PeProcess = NULL; PLIST_ENTRY pNextEntry, pListHead; PeProcess = PsGetCurrentProcess(); if(!PeProcess)原创 2009-08-24 14:27:00 · 1816 阅读 · 0 评论 -
SystemCrashDumpStateInformation加载驱动
使用如下代码可将系统中的atapi.sys (如果你的机器磁盘PORT驱动是atapi.sys的话,如果是scsiport的话会有不同)加载到系统中。模块名为dump_atapi.sys(如果已配置了生成dump则无法生效)HMODULE hlib = LoadLibrary("ntdll.dll");PVOID p = GetProcAddress(hlib , "NtSetSystemIn转载 2009-08-24 18:51:00 · 705 阅读 · 0 评论 -
现代dump技术及保护措施[Ms-Rem](上)
鄙人拙译现代dump技术及保护措施本文目的我们都喜欢使用免费的软件,这也就意味着需要有人对它们进行破解。而破解的时候就要对付各种各样的壳和protectors。壳的工作原理和脱壳的基本方法在《Packer终结篇》(NEOx, Volodya)一文中有不错的讲解。在此文中详细的讲解了PE文件格式以及protectors对它的利用方法。无疑,脱壳过程中一个重要的部分就是取得dump。关于dump的取得转载 2009-08-24 18:53:00 · 747 阅读 · 0 评论 -
现代dump技术及保护措施[Ms-Rem](下)
Dynamic unpacking另一种对付dump的常用方法就是的dynamic packing。其思想就是,protector并不将受保护的程序完全unpack,而只是unpack一部分。首先unpack第一页,当快要进行完时protector对异常进行拦截并unpack所请求的页,这时它就可以将上一页从内存中删除。这样受保护进程的image在内存里从来都不曾完整过,因此一般的dumper是没转载 2009-08-24 18:56:00 · 835 阅读 · 0 评论 -
线程调度资料
XP下枚举两个链表并不能得到全部线程?KiWaitInListHead KiDispatcherReadyListHead PART 1: Kernel Object //每一位表示对应这个特权级的队列中是否有线程(主要在KiSwapThread用,详细代码见PART3) ULONG KiReadySummary = 0 - Referenced by K原创 2009-11-18 21:33:00 · 1126 阅读 · 0 评论 -
X64系统下的KeServiceDescriptionTable
最近在搞64位系统驱动,虽然在64位系统上不能在进行SSDT等Hook了。但是需要用到KeServiceDescriptorTable中的东西。用Windbg发现64下KeServiceDescriptionTable结构虽然是相似的,但是要获取index中的函数地址却不一样。u一样,完全不是什么函数地址。是一些很怪的数,刚开始有些怀疑是不是搞错了,于是转到32位下面按照查看服务的方式看了原创 2010-02-09 09:52:00 · 3249 阅读 · 4 评论 -
Wrk中IO部分学习总结
*********************************************io object type ******************************************************IopCreateObjectTypes /原创 2011-07-15 12:51:34 · 1023 阅读 · 0 评论