
驱动编程
会基本的通信
qq_857305819
这个作者很懒,什么都没留下…
展开
-
工作线程的使用
#include<stdio.h>#include<stdlib.h>#include "ntddk.h"#define DEVICE_NAME L"\\Device\\MyDevice"PUCHAR PsGetProcessImageFileName(PEPROCESS Process);BOOLEAN ThreadRunFlags = TRUE;#define WRITE_FILE_INTERVAL -10000 * 1000 * 10typedef str原创 2021-11-19 13:25:13 · 268 阅读 · 0 评论 -
MDL解析
// 1. 包含提供内核结构相关的头文件#include <ntddk.h>PMDL mdl;// 驱动卸载的回调函数,会在卸载的时候被调用VOID DriverUnload(PDRIVER_OBJECT DriverObject){ //释放MDL IoFreeMdl(mdl); UNREFERENCED_PARAMETER(DriverObject);}// 2. 提供驱动程序的入口函数NTSTATUS DriverEntry( PDRIVER_OBJECT Dr原创 2021-04-07 18:49:14 · 428 阅读 · 0 评论 -
一个完整的WFP驱动(详细注释)
#include <ntddk.h>#pragma warning(push)#pragma warning(disable:4201) // unnamed struct/union#pragma warning(disable:4995)#include <fwpsk.h>#pragma warning(pop)#include <ndis.h>#include <fwpmk.h>#include <limits.h>原创 2020-11-14 17:15:00 · 3780 阅读 · 0 评论 -
VS编译器编译WFP驱动环境准备
在wfp开发是遇到FwpmEngineOpen0无法解析;NET_BUFFER_LIST未定义在链接器->输入 的附加依赖项中加入如下lib,自己项目需要什么就加什么$(DDK_LIB_PATH)\NTOSKrnl.lib;$(DDK_LIB_PATH)\FwpKClnt.lib;$(DDK_LIB_PATH)\NetIO.lib;$(DDK_LIB_PATH)\NDIS.lib;$(DDK_LIB_PATH)\WDMSec.lib;$(SDK_LIB_PATH)\UUID.lib;定义的N原创 2020-11-12 18:51:19 · 923 阅读 · 0 评论 -
64位下暴力搜索硬编码
ULONG64 g_kernelModuleBase=0;typedef struct _LDR_DATA_TABLE_ENTRY{ LIST_ENTRY InLoadOrderLinks; LIST_ENTRY InMemoryOrderLinks; LIST_ENTRY InInitializationOrderLinks; PVOID DllBase; PVOID EntryPoint; ULONG SizeOfImage; UNICODE_STRING FullDllName;原创 2021-01-30 23:20:43 · 304 阅读 · 0 评论 -
虚拟机WIN10 无法连接的问题
刚装好后连接成功了,但是第二次运行却发现无法连接。 搞了半天 发现在启动时关闭驱动强制签名就能连接了。原创 2020-09-29 15:59:01 · 226 阅读 · 0 评论 -
根据系统版本运行不同的代码
如果是代码调用次数少的情况下可以获得系统版本然后判断,我这里调用了上百万次就使用条件编译更好一些。//WIN7 64 主版本号6 副版本号1 RTL_OSVERSIONINFOEXW OSVersion = { 0 }; OSVersion.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW); RtlGetVersion((PRTL_OSVERSIONINFOW)&OSVersion); DbgPrint("系统主版本号:%x 系统副版本号原创 2020-09-28 10:54:56 · 399 阅读 · 1 评论 -
WFP过滤框架
WFP框架图垫片垫片是一种特殊的内核模块,被安插在系统的网络协议栈(如TCP/IP)的不同层(栈)中,主要作用是获取网络协议栈的数据。如垫片被安插在传输层,可以获取TCP/UDP等协议数据:垫片被安插在网络层,可以获取IP协议等数据。安插在不同协议层的垫片,获取到的数据不同,垫片获取到数据后,会通过内核态过滤引擎提供的分类API,把数据传递到相应的WFP分层中。垫片除了能获取网络数据传递给内核态过滤引擎外,还有更重要的一个作用是把内核态过滤引擎的过滤结果反馈给网络协议栈。比如,内核态过滤引擎原创 2020-09-18 22:51:03 · 2565 阅读 · 3 评论 -
第一个WFP驱动
转载于原文地址main.h#ifndef __MAIN_H__#define __MAIN_H__ #include <ntifs.h>#include <ip2string.h> #pragma warning(push)#pragma warning(disable: 4201)#pragma warning(disable: 4324)#include <fwpsk.h>#include <fwpmk.h>#pragma war原创 2020-09-18 01:58:46 · 694 阅读 · 0 评论 -
WDF驱动的电源管理
添加电源处理回调函数//电源回调处理函数NTSTATUS EvtDeviceD0Entry(_In_ WDFDEVICE Device, _In_ WDF_POWER_DEVICE_STATE PreviousState){ NTSTATUS status = STATUS_SUCCESS; KdPrint(("enter EvtDeviceD0Entry\n")); return status;}NTSTATUS EvtDriverDeviceAdd(_In_ WDFDRIVER Dri原创 2020-08-18 22:08:48 · 738 阅读 · 0 评论 -
即插即用IRP
即插即用子功能代码表子功能代码描述IRP_ MN_START_DEVICE配置并初始化设备IRP_ MN_QUERY_ REMOVE_DEVICE设备可以被安全地删除吗IRP_ MN_ REMOVE_DEVICE关闭并删除设备IRP_ MN_ CANCEL_REMOVE_DEVICE忽略以前的QUERY_REMOVEIRP_MN_STOP_DEVICE关闭设备IRP_MN_QUERY_STOP_DEVICE设备可以被安全地关闭吗IRP_M原创 2020-08-18 09:55:07 · 218 阅读 · 0 评论 -
NT设备扩展 在WDF中的使用方式
定义扩展结构typedef struct _DRIVER_CONTEXT{ ULONG Number; WCHAR sz[1024]; ULONG Boolean;}DRIVER_CONTEXT, *PDRIVER_CONTEXT;//********* 申明一个函数GetDriverContext,用于访问该结构 在WDF驱动中必须这样做 访问方式下面介绍 *********WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(DRIVER_CONTEXT, Ge原创 2020-08-17 17:45:47 · 274 阅读 · 0 评论 -
WDF 修改INF文件为驱动程序添加参数
INF文件添加注册表项[KMDF_PNP_Device.NT]CopyFiles=Drivers_DirAddReg=Reg_section[Reg_section]HKEY_LOCAL_MACHINE,SYSTEM\CurrentControlSet\Services\KMDF_PNP\Parameters,数字,0x00010001,15HKEY_LOCAL_MACHINE,SYSTEM\CurrentControlSet\Services\KMDF_PNP\Parameters,字符,0原创 2020-08-17 15:48:02 · 1009 阅读 · 2 评论 -
WDF驱动和3环通信
#ifndef CTL_CODE_H_89749_9961731#define CTL_CODE_H_89749_9961731#define CTL_CONVERT CTL_CODE(FILE_DEVICE_UNKNOWN,0x850,METHOD_BUFFERED,FILE_ANY_ACCESS)#endif此驱动为支持PNP的驱动#include "Queue.h"#include "IOCTL.h"//I/O内部设备控制VOID EvtIoDeviceControl( _In_原创 2020-08-16 08:20:57 · 523 阅读 · 0 评论 -
实现支持PNP的WDF驱动
Driver.h#include <ntddk.h>#include <wdf.h>NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath);Driver.c#include "Driver.h"#include"Device.h"NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNIC原创 2020-08-15 21:53:13 · 808 阅读 · 0 评论 -
vc助手自己设置的快捷输入
VA Options ->Suggestions ->Edit Va Snippets快捷键完整代码ststatus=NTSTNTSTATUS status=STATUS_SUCCESS;return status;NTSif(!NT_SUCCESS(status)){KdPrint((""));return status;}原创 2020-08-15 06:55:37 · 167 阅读 · 0 评论 -
实现WDF的I/O队列
如果应用程序有多个线程同时对设备发起访问,就可以使用队列来处理这里IRPWDF中使用队列也十分简单,提供了对应的函数.#include <ntddk.h>#include <wdf.h>VOID EvtFileCreate( _In_ WDFDEVICE Device, _In_ WDFREQUEST Request, _In_ WDFFILEOBJECT FileObject){ KdPrint(("文件创建成功\n")); WdfRequestComplet原创 2020-08-14 17:07:44 · 970 阅读 · 0 评论 -
WinDbg设置Resource File Path
打开环境变量 找到系统变量里面的这个路径 我的是VS2013 填入windbg的Resource File Path 然后.reload一下就可以开启源码调试了,原创 2020-08-14 15:12:27 · 490 阅读 · 0 评论 -
WDF驱动入门
一个简单的WDF驱动要让XP支持WDF驱动需要安装一个插件链接: https://pan.baidu.com/s/1eL-5EVfNJZeatIBkRTrvBw 提取码: kwvw 复制这段内容后打开百度网盘手机App,操作更方便哦#include <ntddk.h>#include <wdf.h>VOID EvtDriverUnload(WDFDRIVER Driver){ KdPrint(("卸载成功\n"));}NTSTATUS DriverEntry(PD原创 2020-08-14 14:16:45 · 1384 阅读 · 0 评论 -
PCI设备驱动开发
PCI总线协议PCI(外设部件互连标准)总线标准是一种将系统外部设备连接起来的总线标准,它是PC中最重要的总线。其他总线如ISA总线、USB等总线都挂在PCI总线之上。PCI ( Peripheral Component Interconnect) 总线是当前最流行的总线之一,是由Intel公司首先推出的一种局部总线。它定义了32位数据地址总线,并且可扩展为64位,其支持突发读写操作,也同时可以支持多组外围设备。PCI局部总线不能兼容在其之前出现的ISA、EISA、MCA (Micro Chan原创 2020-08-13 11:30:57 · 2427 阅读 · 0 评论 -
IO端口操作
EDX端口地址AL,AX,EAX数据端口操作代码//读端口数据UCHAR In_8(PUCHAR Port){ UCHAR Value; __asm{ mov edx,Port mov eax,0 in al,dx mov Value,al nop nop } return Value;}USHORT In_16(PUSHORT Port){ USHORT Value; __asm{ mov edx, Port mov eax, 0原创 2020-08-12 05:53:06 · 768 阅读 · 0 评论 -
让设备驱动支持弹出操作
S0:全功率工作状态S1:初级休眠S4:CPU停止.内存保存到休眠文件里面D0:设备全功率工作D1:低功耗模式,设备环境可以被保留D2:低功耗模式,设备环境无效typedef _Struct_size_bytes_(Size) struct _DEVICE_CAPABILITIES { USHORT Size; USHORT Version; // 值为1 //一下为一个ULONG 的位域 ULONG DeviceD1:1; ULONG DeviceD.原创 2020-08-11 21:07:38 · 292 阅读 · 0 评论 -
枚举设备资源
资源类型描述Port映射的端口范围Memory映射的内存范围DmaIoGetDmaAdapterInterruptIoConnectInterruptDMA(直接存储器访问)直接从RAM访问I/O接口,速度更加快,不会经过CPU原创 2020-08-11 19:05:46 · 182 阅读 · 0 评论 -
为真实硬件安装WDM驱动
为一个实际硬件安装自己的WDM驱动在我的电脑上点击右键->属性->硬件->设备管理器->点开网卡->详细信息->复制硬件信息修改INF文件 硬件信息 我们只需要前面的字符串 PCI\VEN_1022&DEV_2000[Mfg0]; PCI hardware Ids use the form; PCI\VEN aaaa&DEV bbbb&SUBSYs_ CccCeCCC&REV dd;改成你自己的ID%DeviceDesc%原创 2020-08-10 08:07:32 · 2018 阅读 · 0 评论 -
WDM驱动安装后的注册表变化
11原创 2020-08-08 22:52:37 · 293 阅读 · 0 评论 -
inf文件
INF文件的组成;sections 节的名字[Version];键名 = 键值Signature="WindowsNTWindows NTWindowsNT"常见的INF文件节区常用指令[Version];Signature 用来标记一个有效的INF文件,没有这个就是无效的Signature="$WINDOWS NT$" ;CHICAGO;设置拷贝的目标目录 CopyFiles就代表拷贝操作[DestinationDirs]DefaultDestDir=12;原创 2020-08-08 04:25:47 · 1324 阅读 · 1 评论 -
驱动开发的兼容性
开发环境的兼容性集成环境WDK版本开发驱动系统版本VS2013WDK8.1xp server2003 win7VS2015WDK10. 14399xpVS2013WDK10.06**原创 2020-08-07 21:33:31 · 341 阅读 · 0 评论 -
同步和异步
应用层对设备的同步操作#include "stdafx.h"#include <windows.h>#include <stdio.h>int main(){ HANDLE hFile=CreateFile( TEXT("test.txt"), GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, //如果文件不存在就创建 FILE_ATTRIBUTE_NORMA原创 2020-08-06 02:12:23 · 251 阅读 · 0 评论 -
内核信号量的使用
/*测试代码*/ KSEMAPHORE Semaphore; LONG Count; HANDLE hThread; //初始化信号量 最大值是2 可用的数量是2 也就是能被KeWaitForSingleObject 等待 KeInitializeSemaphore(&Semaphore,2,2); //获取可等待的信号量总数 Count = KeReadStateSemaphore(&Semaphore); KdPrint(("信号量的可等待总数是:%x\n"..原创 2020-08-04 21:56:22 · 487 阅读 · 1 评论 -
驱动开发中断言的使用
在驱动开发中,调试模式下可以使用ASSERT断言来对条件进行判断,这个条件一定要返回的是TRUE,在xp中如果断言的条件是FALSE的话,会直接蓝屏. 在win7中 不会蓝屏.会打印一句出错的位置. 在Release模式下 不会生成代码.ASSERT(判断条件);...原创 2020-08-03 23:08:14 · 311 阅读 · 0 评论 -
驱动中使用结构化异常处理
异常的写法跟三环没有设么区别一样的使用__try __exceptNTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING reg_path){ PULONG buffer = 0; try { *buffer = 0; } //EXCEPTION_CONTINUE_SEARCH 这个值代表异常 我们已经处理了 except(EXCEPTION_EXECUTE_HANDLER) { KdPrint(("访问异常原创 2020-08-03 22:41:15 · 240 阅读 · 0 评论 -
Cannot open include file: ‘specstrings.h‘
在编译驱动程序出现这个错误的处理办法:把 C:\WINDDK\3790.1830\inc\wxp\ specstrings.h 这个头文件 复制到路径 C:\WINDDK\3790.1830\inc\wxp 文件夹里面就可以编译了.注意:C:\WINDDK\ 是自己安装ddk的路径原创 2020-07-31 03:15:06 · 789 阅读 · 0 评论 -
高并发下的hook写法
HOOK原理在并发的情况下要HOOK函数需要使用CMPXCHG8B 指令,该指令可以原子操作一次性的替换掉8字节的内存。CMPXCHG8B 指令该指令判断指定内存中的8字节内容和EDX:EAX (edx高32位,eax,低32位)中的64字节内容是否相同,如果相同,就把ECX:EBX(ecx高32位,ebx,低32位)中的内容替换到指定内存。如果不相同,就把指定内存中的值替换到ECX:EBX中。#include"ntddk.h"ULONG addr = 0x80546a98; //这是Sw原创 2020-06-03 13:17:19 · 614 阅读 · 0 评论 -
WriteCopy
在自己的进程进程中hookMessagebox 为什么对别的进程没有影响呢:因为自己进程的meaagebox和其他进程的其实是在一个物理页中的。这个内存在pte中是只读的。当运行hook代码时,(这时需要把hook的代码写到messagebox的指定地方,用到了写这个权限,而pte是只读的)会触发异常,cpu就会去检查进程的vad (位于进程结构体的+11c处,是一个二叉树),如果属性是w...原创 2020-06-02 21:05:51 · 724 阅读 · 1 评论 -
SSDT HOOK实现进程保护
SSDT HOOK是一个垃圾技术了,代码看看就好没什么值得研究的。#include<ntddk.h>#include<ntstatus.h>typedef struct ServiceDescriptorEntry { PULONG ServiceTableBase; //函数表的基址 PULONG ServiceCounterTableBase; UL...原创 2020-04-25 06:56:35 · 248 阅读 · 0 评论 -
驱动断链 修改模块信息实现隐藏
#include "ntddk.h"HANDLE hThread;VOID DriverUnload(PDRIVER_OBJECT pDriverObject){ DbgPrint("驱动卸载成功\n");}VOID ThreadRun( PVOID StartContext){ LARGE_INTEGER times; PDRIVER_OBJECT pDriverObje...原创 2020-04-19 14:54:16 · 712 阅读 · 2 评论 -
遍历内核模块
typedef struct _DRIVER_OBJECT { CSHORT Type; CSHORT Size; PDEVICE_OBJECT DeviceObject; ULONG Flags; PVOID DriverStart; ...原创 2020-04-19 12:51:59 · 793 阅读 · 0 评论 -
内核中的字符串常用函数
初始化字符串NTSYSAPI VOID RtlInitUnicodeString( PUNICODE_STRING DestinationString, __drv_aliasesMem PCWSTR SourceString);参数1:指向UNICODE_STRING的指针参数2:被转换的字符串常量例如: UNICODE_STRING Symbol; ...原创 2020-04-17 20:31:17 · 663 阅读 · 0 评论 -
内核常用内存操作函数
申请内存PVOID ExAllocatePoolWithTag( __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType, SIZE_T NumberOfBytes, ULONG ...原创 2020-04-17 17:47:12 · 313 阅读 · 0 评论 -
xp自己加载的驱动在注册表的位置
HKEY_LOVAL_MACHINE->SYSTEM->Services->驱动名原创 2020-04-16 22:42:49 · 278 阅读 · 0 评论