用HOOK来修改API函数的功能(5)-EXE和WDM驱动通信

简介:
今天我来写关于HOOK修改API函数的最后一篇文章"EXE和WDM驱动通信"。
在上面的几篇文章中,大家看到了被保护的文件名或者注册表键值名等等都是事先指定好的。
但是在实际应用中,可能遇到的是被保护的文件名、注册表的键值名需要动态来指定的情况。
这个时候就需要编写一个上层EXE程序来和WDM驱动通信。
通常EXE和WDM驱动通信有2种方法:
1:使用DeviceIOControl函数。
2:使用自定义事件。
在这里我简述一下使用DeviceIOControl函数的实现方法。
首先在WDM驱动的.C文件中加入以下的宏定义代码:
#define IOCTL_EVENT_MSG   CTL_CODE(FILE_DEVICE_UNKNOWN, 0x966, METHOD_BUFFERED , FILE_ANY_ACCESS)
在DriverEntry例程中写入:
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MydrvDispatchIoctl;
//例程MydrvDispatchIoctl的实现如下
static NTSTATUS MydrvDispatchIoctl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)

 PIO_STACK_LOCATION IrpStack; 
 NTSTATUS status,status1; 
 ULONG ControlCode; 
 ULONG InputLength,OutputLength; 
 TCHAR wInputBuffer[256]; 
 TCHAR OutMsg[] = "Mess";
 UNICODE_STRING *TempInstallDir=NULL;
 PVOID pvIOBuffer;
 char *Test;
 OutputLength=sizeof(OutMsg);
 // 得到当前IRP (IO请求包) 
 IrpStack = IoGetCurrentIrpStackLocation(Irp); 
 // 得到DeviceIoControl传来的功能调用号 
 ControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode; 
 // 得到DeviceIoControl传来的输入缓冲区长度 
 InputLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength; 
 // 得到DeviceIoControl的输出缓冲区长度 
 OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; 
 Test=(char *)Irp->AssociatedIrp.SystemBuffer;
 //使用函数DbgPrint函数将外界EXE函数传入的信息答应出来
 DbgPrint("Test=%s\n",Test);
 switch (ControlCode)
 {   
  case IOCTL_EVENT_MSG:
   //得到应用程序给的参数信息。
   RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, OutMsg, sizeof(OutMsg)); 
   Irp->IoStatus.Status = STATUS_SUCCESS;
   //设置返回的信息长度
   OutputLength = sizeof(OutMsg);
   //设置返回的信息。
   Irp->IoStatus.Information = OutputLength; 
   break;
 } 
 status = Irp->IoStatus.Status; 
 IoCompleteRequest(Irp, 0); 
 return status; 

通过以上的处理,WDM驱动就具有了接收EXE传入信息的能力。
下面我们再来看看上层EXE部分是如何编写的:
在我的项目中,我使用VC把与WDM通信的部分写成了一个DLL。
#include "stdafx.h"
#include "VCDll.h"
#include <Winsvc.h>
#include "winioctl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//注意这里必须和WDM的宏定义部分相同
#define IOCTL_EVENT_MSG   CTL_CODE(FILE_DEVICE_UNKNOWN, 0x966, METHOD_BUFFERED , FILE_ANY_ACCESS)
//参数char * SendInfo是需要传入WDM驱动的信息
int SendToDriver(char * SendInfo)
{
 hcomm=CreateFile(" \\\\.\\MyDriver",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL);
 if(hcomm!=INVALID_HANDLE_VALUE)
 {
  char m_dwOptions[255]={'\0'};
  DWORD bytesWrite;
  memset(m_dwOptions,0,sizeof(m_dwOptions));
  memcpy(m_dwOptions,SendInfo,strlen(SendInfo));
  if(DeviceIoControl(hcomm ,IOCTL_EVENT_MSG,( char * )m_dwOptions,strlen(SendInfo)+1,( char * )m_dwOptions, 5, &bytesWrite, NULL ))
  {
   CloseHandle(hcomm);
   return 1;
  }
  else
  {
   CloseHandle(hcomm);
   return 0;
  }
 }
 else
 {
  CloseHandle(hcomm);
  return -1;
 }
}
通过以上的处理,WDM就和上层的EXE具有了通信的能力。
以上的5篇文章就是我在使用DDK来编写保护文件、注册表等等功能项目时使用到的方法。
我在这里全写出来就是想让更多对这方面感兴趣的朋友参与进来,和我一起交流,大家共同进步。
以上代码通过了测试并已经长期应用到实践中。
本文转自狗窝博客51CTO博客,原文链接http://blog.51cto.com/fxh7622/34136如需转载请自行联系原作者

fxh7622
相关文章
|
1月前
|
缓存 JavaScript 算法
活用 Composition API 核心函数,打造卓越应用(下)
活用 Composition API 核心函数,打造卓越应用(下)
|
1月前
|
存储 JavaScript API
活用 Composition API 核心函数,打造卓越应用(上)
活用 Composition API 核心函数,打造卓越应用(上)
|
2月前
|
监控 应用服务中间件 API
API 网关的功能用途及实现方式
API 网关的功能用途及实现方式
|
23天前
|
人工智能 关系型数据库 Serverless
Serverless 应用引擎常见问题之API生成的函数镜像改为自定义的镜像如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
37 3
|
22天前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
88 3
|
1月前
|
自然语言处理 API 语音技术
Python加百度语音API实现文字转语音功能
Python加百度语音API实现文字转语音功能
49 0
|
1月前
|
JavaScript API
Vue3的手脚架使用和组件父子间通信-插槽(Options API)学习笔记
Vue3的手脚架使用和组件父子间通信-插槽(Options API)学习笔记
29 3
|
2月前
|
数据挖掘 API 数据处理
获取商品详情信息API接口:1688开放平台功能解析
首先,要获取商品详情信息,开发者需要向1688开放平台申请相应的权限,并遵循其调用规则。在调用商品详情信息API接口时,需要传入相应的请求参数,如商品ID、调用时间戳、密钥等。这些参数对于确保接口的正常运行至关重要。
|
2月前
|
文字识别 安全 API
阿里云文字识别OCR的发票凭证识别功能可以通过API接口的形式进行调用
【2月更文挑战第5天】阿里云文字识别OCR的发票凭证识别功能可以通过API接口的形式进行调用
73 5
|
2月前
|
缓存 应用服务中间件 Linux
如何使用OpenResty实现API网关功能
如何使用OpenResty实现API网关功能
67 0