用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
相关文章
|
2月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
58 4
|
20天前
|
JSON 供应链 搜索推荐
某东API接口:开启电商数据交互与功能调用的新篇章
在当今的数字化时代,电商平台的开放API(Application Programming Interface,应用程序编程接口)已经成为连接开发者与电商平台之间的重要桥梁。京东作为中国领先的电商平台之一,其开放平台提供的API接口更是为开发者们带来了无限可能。本文将深入探讨京东API接口的功能、应用场景、使用流程以及其在电商领域的重要价值。
|
1月前
|
人工智能 Java API
ChatClient:探索与AI模型通信的Fluent API
【11月更文挑战第22天】随着人工智能(AI)技术的飞速发展,越来越多的应用场景开始融入AI技术以提升用户体验和系统效率。在Java开发中,与AI模型通信成为了一个重要而常见的需求。为了满足这一需求,Spring AI引入了ChatClient,一个提供流畅API(Fluent API)的客户端,用于与各种AI模型进行通信。本文将深入探讨ChatClient的底层原理、业务场景、概念、功能点,并通过Java代码示例展示如何使用Fluent API与AI模型进行通信。
47 8
|
1月前
|
API 开发工具 开发者
探究亚马逊国际获得AMAZON商品详情 API 接口功能、作用与实际应用示例
亚马逊提供的Amazon Product Advertising API或Selling Partner API,使开发者能编程访问亚马逊商品数据,包括商品标题、描述、价格等。支持跨境电商和数据分析,提供商品搜索和详情获取等功能。示例代码展示了如何使用Python和boto3库获取特定商品信息。使用时需遵守亚马逊政策并注意可能产生的费用。
|
28天前
|
人工智能 Java API
Spring AI Fluent API:与AI模型通信的流畅体验
【11月更文挑战第24天】随着人工智能(AI)技术的飞速发展,越来越多的应用场景开始融入AI技术以提升用户体验和系统效率。在Java开发中,与AI模型通信成为了一个重要而常见的需求。为了满足这一需求,Spring AI引入了ChatClient,一个提供流畅API(Fluent API)的客户端,用于与各种AI模型进行通信。本文将深入探讨ChatClient的底层原理、业务场景、概念、功能点,并通过Java代码示例展示如何使用Fluent API与AI模型进行通信。
37 0
|
2月前
|
机器学习/深度学习 算法 Java
通过 Java Vector API 利用 SIMD 的强大功能
通过 Java Vector API 利用 SIMD 的强大功能
60 10
|
3月前
|
API
本地hook API MessageBoxA的masm32源代码[07-10更新]
本地hook API MessageBoxA的masm32源代码[07-10更新]
|
3月前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
|
2月前
|
移动开发 前端开发 JavaScript
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
259 0
|
3月前
|
存储 程序员 API
【收藏】非API函数检测操作系统类型
【收藏】非API函数检测操作系统类型
下一篇
DataWorks