用HOOK来修改API函数的功能(4)-环境搭建

简介:
上面的3篇文章已经大概的讲述了HOOK API的编写方法,可是如何让它们真正的运行起来呢?
这就需要搭建环境,而这个环境你必须使用DDK。我在这里假设你已经安装了DDK,并且会使用DDK来编译一个
WDM驱动程序。这里我要说的是如何在代码中将我上面的3篇文章中讲到的功能串在一起,以及编写WDM驱动程序所需要的Sources文件。
我的Sources文件是这样写的:
TARGETNAME=TestDriver
TARGETTYPE=DRIVER
TARGETPATH=obj
BROWSER_INFO=1
C_DEFINES=-DDRIVER
INCLUDES=c:\ntddk\inc;
USER_C_FLAGS=/FAcs
SOURCES=My.c
其中TARGETNAME=TestDriver指明编译出来的文件名称叫做TestDriver。
TARGETTYPE=DRIVER指明生成的文件类型是*.sys。
SOURCES=My.c指明需要编译的源代码文件。
下面来看看My.c文件内容。
作为一个WDM驱动,首先运行的应该是DriverEntry例程。该例程类似于C语言中的Main函数。
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) 

 UNICODE_STRING nameString, linkString; 
 UNICODE_STRING *InstallDir=NULL;
 PDEVICE_OBJECT deviceObject; 
 NTSTATUS status; 
 WCHAR wBuffer[200]; 
 nameString.Buffer = wBuffer; 
 nameString.MaximumLength = 200; 
 
 //DriverUnload例程用来处理驱动卸载时所做的恢复工作.
 DriverObject->DriverUnload = DriverUnload; 
 RtlInitUnicodeString(&nameString, L" \\Device\\MyDriver"); 
 status = IoCreateDevice(DriverObject, 0,&nameString, FILE_DEVICE_UNKNOWN, 0, TRUE, &deviceObject ); 
 if (!NT_SUCCESS( status )) 
 {
  return status; 
 }
 deviceObject->Flags |= DO_BUFFERED_IO;
 RtlInitUnicodeString(&linkString, L" \\??\\MyDriver");
 status = IoCreateSymbolicLink (&linkString, &nameString); 
 if (!NT_SUCCESS( status )) 
 { 
  IoDeleteDevice (DriverObject->DeviceObject); 
  return status; 
 } 
 
 //MydrvDispatch例程是一个IRP的分发例程(在我的代码中没有怎么用到它)
 DriverObject->MajorFunction[IRP_MJ_CREATE] = MydrvDispatch; 
 DriverObject->MajorFunction[IRP_MJ_CLOSE] = MydrvDispatch;
 DriverObject->MajorFunction[IRP_MJ_CLEANUP] = MydrvDispatch;
 
 //MydrvDispatchIoctl例程比较重要,该例程可以接受来自外界EXE程序发送给它的参数。例如在我的项目中,由一个外界exe程序
 //发送过来需要保护的文件名称、注册表键值等数据,都是使用这个例程来接收的。
 
 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MydrvDispatchIoctl;
 __asm{
  mov eax, cr0 
  mov CR0VALUE, eax 
  and eax, 0fffeffffh 
  mov cr0, eax 
  }
 看过我文章的朋友一定不会对下面的代码陌生。
 
  //文件删除
  RealZwSetInformationFile=(ZWSETINFORMATIONFILE)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwSetInformationFile")]);
  (ZWSETINFORMATIONFILE)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwSetInformationFile")])=HookZwSetInformationFile;
  //注册表删除
  RealZwDeleteKey=(REALZWDELETEKEY)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwDeleteKey")]);
  (REALZWDELETEKEY)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwDeleteKey")])=HookZwDeleteKey;
  //删除注册表内容
  RealZwDeleteValueKey=(REALZWDELETEVALUEKEY)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwDeleteValueKey")]);
  (REALZWDELETEVALUEKEY)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwDeleteValueKey")])=HookZwDeleteValueKey;
  //设置注册表键值
  RealZwSetValueKey=(REALZWSETVALUEKEY)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwSetValueKey")]);
  (REALZWSETVALUEKEY)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwSetValueKey")])=HookZwSetValueKey;
  //创建文件
  RealZwCreateFile=(REALZWCREATEFILE)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwCreateFile")]);
  (REALZWCREATEFILE)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwCreateFile")])=HookZwCreateFile;
  
 __asm{
  mov eax, CR0VALUE 
  mov cr0, eax 
  }
 return STATUS_SUCCESS; 
}

在卸载驱动的时候使用的DriverUnload例程代码如下:
VOID DriverUnload (IN PDRIVER_OBJECT pDriverObject) 

 UNICODE_STRING nameString; 
 RtlInitUnicodeString(&nameString, L" \\??\\MyDriver"); 
 IoDeleteSymbolicLink(&nameString);
 IoDeleteDevice(pDriverObject->DeviceObject);
 //卸载设置文件属性
 (ZWSETINFORMATIONFILE)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwSetInformationFile")])=RealZwSetInformationFile;
 //删除注册表键值
 (REALZWDELETEKEY)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwDeleteKey")])=RealZwDeleteKey;
 //删除注册表内容
 (REALZWDELETEVALUEKEY)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwDeleteValueKey")])=RealZwDeleteValueKey;
 //设置注册表键值
 (REALZWSETVALUEKEY)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwSetValueKey")])=RealZwSetValueKey;
 //创建文件
 (REALZWCREATEFILE)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwCreateFile")])=RealZwCreateFile;
 return; 
}
这样就搭建出了一个完整的WDM驱动框架。编译后可以生成一个具有一定功能的驱动程序。
下次我将会写如何将我们编写好的驱动进行安装,并通过外界的EXE程序和这个驱动程序进行通信。
本文转自狗窝博客51CTO博客,原文链接http://blog.51cto.com/fxh7622/33142如需转载请自行联系原作者

fxh7622
相关文章
|
3月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
62 4
|
1天前
|
人工智能 数据可视化 API
自学记录鸿蒙API 13:Calendar Kit日历功能从学习到实践
本文介绍了使用HarmonyOS的Calendar Kit开发日程管理应用的过程。通过API 13版本,不仅实现了创建、查询、更新和删除日程等基础功能,还深入探索了权限请求、日历配置、事件添加及查询筛选等功能。实战项目中,开发了一个智能日程管理工具,具备可视化管理、模糊查询和智能提醒等特性。最终,作者总结了模块化开发的优势,并展望了未来加入语音助手和AI推荐功能的计划。
105 1
|
30天前
|
JSON 供应链 搜索推荐
某东API接口:开启电商数据交互与功能调用的新篇章
在当今的数字化时代,电商平台的开放API(Application Programming Interface,应用程序编程接口)已经成为连接开发者与电商平台之间的重要桥梁。京东作为中国领先的电商平台之一,其开放平台提供的API接口更是为开发者们带来了无限可能。本文将深入探讨京东API接口的功能、应用场景、使用流程以及其在电商领域的重要价值。
|
2月前
|
API 开发工具 开发者
探究亚马逊国际获得AMAZON商品详情 API 接口功能、作用与实际应用示例
亚马逊提供的Amazon Product Advertising API或Selling Partner API,使开发者能编程访问亚马逊商品数据,包括商品标题、描述、价格等。支持跨境电商和数据分析,提供商品搜索和详情获取等功能。示例代码展示了如何使用Python和boto3库获取特定商品信息。使用时需遵守亚马逊政策并注意可能产生的费用。
|
3月前
|
机器学习/深度学习 算法 Java
通过 Java Vector API 利用 SIMD 的强大功能
通过 Java Vector API 利用 SIMD 的强大功能
80 10
|
4月前
|
API
本地hook API MessageBoxA的masm32源代码[07-10更新]
本地hook API MessageBoxA的masm32源代码[07-10更新]
|
4月前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
|
3月前
|
移动开发 前端开发 JavaScript
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
329 0
|
4月前
|
存储 程序员 API
【收藏】非API函数检测操作系统类型
【收藏】非API函数检测操作系统类型
|
19天前
|
人工智能 自然语言处理 API
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
谷歌推出的Multimodal Live API是一个支持多模态交互、低延迟实时互动的AI接口,能够处理文本、音频和视频输入,提供自然流畅的对话体验,适用于多种应用场景。
67 3
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动