摘要:Hook分发函数前一篇文章讲述了进行键盘过滤,截取用户输入的方法。本篇文章开始更加深入地讨论键盘的过滤与反过滤对抗。无论是过滤还是饭过滤,原理都是过滤,取胜的关键在于谁第一个得到信息。一种方发是Hook分发函数,即将键盘驱动的分发函数替换成自己的函数用来达到过滤的目的。1.获得类驱动对象首先要获得键盘类驱动对象,才能去替换下面的分发函数。这个操作较为简单,因为这个驱动的名字是“\\Device\\Kbdclass”,所以可以直接用函数ObReferenceObjectByName来获取。代码如下:view plaincopy to clipboardprint?//驱动的名字 #define
阅读全文
摘要:键盘过滤之内核级Hook(二)如果不想让键盘过滤驱动程序或回调函数首先获得按键,则必须比端口驱动更加底层一些。早期版本的QQ反盗号驱动的原理是这样的:用户要输入密码时(比如把输入焦点移动到了密码框里),就注册一个中断服务来接管键盘中断,比如0x93中断,之后按键就不关键驱动的事了。首先就来介绍一下Hook键盘中断。1.中断:IRQ和INT学过计算机体系结构的人都知道硬件往往是通过中断来通知CPU某个事件的发生。比如按键按下了。但是中断并不一定要有任何硬件的通知,一条指令就能使CPU“发生中断”。比如,在一个.c文件写上:_asm int 3这样的代码常常来人工设置一个断点,执行到这里程序会中断
阅读全文
摘要:这篇文章来介绍一下WDK中提供的一个案例源码--Ramdisk虚拟磁盘。这个例子实现了一个非分页内存做的磁盘储存空间,并将其以一个独立磁盘的形式暴露给用户,用户可以将它格式化成一个Windows能够使用卷,并且像操作一般的磁盘卷一样对它进行操作。由于使用了内存作为虚拟的存储介质,使这个磁盘具有一个显著的特点,性能的提高。这个例子所使用的微软WDF驱动框架。入口函数1.入口函数的定义任何一个驱动程序,不论它是一个标准的WDM驱动程序,还是使用WDF驱动程序框架,都会有一个叫做DriverEntry的入口函数,就好像普通控制台程序中的main函数一样。这个函数是这样声明的:NTSTATUSDriv
阅读全文
摘要:磁盘过滤驱动的概念1.设备过滤和类过滤在之前的文章里,我们已经介绍过滤的概念,所谓过滤技术就是在本来已有的设备栈中加入自己的一个设备。由于Windows向任何一个设备发送IRP请求都会首先发送给这个设备所在设备栈的最上层设备,然后再依次传递下去,这就使得加入的设备在目标设备之前获取Irp请求称为可能,这时候就可以加入自己的处理流程。在这里把插入设备栈的用户设备叫做过滤设备,建立这个设备并使其具有特殊功能的驱动叫做过滤驱动。在前面已经展示了如何去建立一个过滤设备并将其绑定在一个有名字的设备上,这叫做设备过滤,这是对某个特定设备加以过滤的方法。但是在实际应用中,这种方法还存在一些问题,例如,Win
阅读全文
摘要:最近换了机器,需要重新安装双机调试环境。但弄了近两个小时死活不行。最后经过一上午的折腾,终于弄好了。并总结出以下几点:1.启动WinDbg的时候总是提示kerneldebuggerfailedinitialization。说是Failedtoopen\\.\pipe\com_1.系统找不到指定文件。没开虚拟机就是这种情况,说明windbg和vmware连不上。2.虚拟机串口配置如图:可能有人不是这样的配置也可以调试,但最重要的在虚拟机运行起来时串口选项里devicestatus的Connected选项应经被打钩(老版本的可能是Connecting),说明虚拟机和guestOS的串口通信成功。如
阅读全文
摘要:一 MDL是什么在MSDN中有这样的定义内存描述符列表 (MDL) 是一个系统定义的结构,通过一系列物理地址描述缓冲区。执行直接 I/O 的驱动程序从 I/O 管理器接收一个 MDL 的指针,并通过 MDL 读写数据。一些驱动程序在执行直接 I/O 来满足设备 I/O 控制请求时也使用 MDL。http://msdn.microsoft.com/zh-cn/windows/hardware/gg463193.aspx这里有完整的内容,但该文章是机器人翻译过来的,所以看起来有点头疼.因此通俗的解释一下,MDL仅仅运用于内核中,在应用层并不会涉及这个结构,由于内核中的驱动有跟应用层程序通信的需要,
阅读全文
摘要:一、由于ObReferenceObjectByName没有文档化,故在使用前先做声明:#ifdef __cplusplusextern "C"{#endif#include <NTDDK.h>NTKERNELAPINTSTATUSObReferenceObjectByName( IN PUNICODE_STRING ObjectName, IN ULONG Attributes, IN PACCESS_STATE PassedAccessState OPTIONAL, IN ACCESS_MASK DesiredAccess OPTIONAL, IN POBJE
阅读全文
摘要:文章目录: 01. 博文简介:02. 环境及工具准备:03. 分析 TP 所做的保护:04. 干掉 NtOpenProcess 中的 Deep InLine Hook:05. 干掉 NtOpenThread 中的 Deep InLine Hook:06. 干掉 NtReadVirtualMemory 中的 InLine Hook:07. 干掉 NtWriteVirtualMemory 中的 InLine Hook:08. 干掉 KiAttachProcess 的 InLine Hook:09. 干掉 NtGetContextThread 中的 InLine Hook:10. 干掉 NtSetC
阅读全文
摘要:根据wdk代码做的IoStartPacket、IoStartNextPacket、IoCancelIrp简化版:VOID IoStartPacket( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PULONG Key OPTIONAL, IN PDRIVER_CANCEL CancelFunction OPTIONAL ) /*++ Routine Description: This routine attempts to start the specified packet request (IRP) on the speci...
阅读全文
摘要:1.安装好VC6和DWK,先后顺序无关。从开始菜单找到WDK的程序目录,进入“WindowsXPCheckedBuildEnvironment”,输入命令"build",此时WDK将会把自己进行编译,大约需要1分钟。2.VC6设置Include/Lib/Executable目录。设置为自己需要编译的平台的各个目录即可,Include要确保找到ntddk.h等,Lib与Include对应,Executable要确保能找到cl.exe例如XP平台下设置为:include包含部分:C:\WinDDK\7600.16385.1\inc\ddkC:\WinDDK\7600.16385
阅读全文
摘要:大槪就是看这个句柄是当前进程的句柄还是当前线程的句柄,最后再看看这AccessMode是内核还是用户态下,内核的话,句柄表就用ObpKernelHandleTable,用户态的话就用当前进程的句柄表NTSTATUSObReferenceObjectByHandle ( __in HANDLE Handle, __in ACCESS_MASK DesiredAccess, __in_opt POBJECT_TYPE ObjectType, __in KPROCESSOR_MODE AccessMode, __out PVOID *Object, __out_opt POBJECT_HANDLE_
阅读全文
摘要:DebugPrint格式说明符符号 格式说明符 类型%c, %lc ANSI字符 char%C, %wc 宽字符 wchar_t%d, %i 十进制有符号整数 int%D 十进制_int64 _int64%L 十六进制的LARGE_INTEGER LARGE_INTEGER%s, %ls NULL终止的ANSI字符串 char*%S, %ws NULL终止的宽字符串 wchar_t*%Z ANSI_STRING字符串%wZ UNICODE_STRING字符串%u 十进制的ULONG ULONG%x 小写字符十六进制的ULONG ULONG%X 大写字符十六进制的ULONG ULONG%p...
阅读全文
摘要:一、源码//HelloDDK.h#pragma once#ifdef __cplusplusextern "C"{#endif#include <ntddk.h>#ifdef __cplusplus}#endif#define PAGEDCODEcode_seg("PAGE")#define LOCKEDCODEcode_seg()#define INITCODEcode_seg("INIT")#define PAGEDDATAdata_seg("PAGE")#define LOCKEDDATAdata
阅读全文
摘要:一、代码部分//HelloWDM.h#pragma once#ifdef __cplusplusextern "C"{#endif#include <wdm.h>#ifdef __cplusplus}#endif#define INITCODEcode_seg("INIT")#define LOCKEDCODEcode_seg()#define PAGEDCODEcode_seg("PAGE")#define INITDATAdata_seg("INIT")#define LOCKEDDATAdata_
阅读全文
摘要:通常设备对象都把自己的名字放到\Device目录中。在Windows 2000中,设备的名称有两个用途。第一个用途,设备命名后,其它内核模式部件可以通过调用IoGetDeviceObjectPointer函数找到该设备,找到设备对象后,就可以向该设备的驱动程序发送IRP。另一个用途,允许应用程序打开命名设备的句柄,这样它们就可以向驱动程序发送IRP。应用程序可以使用标准的CreateFile API打开命名设备句柄,然后用ReadFile、WriteFile,和DeviceIoControl向驱动程序发出请求。应用程序打开设备句柄时使用\\.\路径前缀而不是标准的UNC(统一命名约定)名称,如
阅读全文
摘要:一、设备对象(DEVICE_OBJECT)kd> dt _device_objectntdll!_DEVICE_OBJECT +0x000 Type : Int2B +0x002 Size : Uint2B +0x004 ReferenceCount : Int4B +0x008 DriverObject : Ptr32 _DRIVER_OBJECT ;该设备所属的驱动对象 +0x00c NextDevice : Ptr32 _DEVICE_OBJECT ;指向下一个设备,该设备与下一个设备同属于一个驱动对象 +0x010 AttachedDevice : Ptr32 _DEVICE_O
阅读全文