用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
相关文章
|
9月前
|
存储 缓存 API
实现电商物流API的实时追踪功能
在电商时代,实时物流追踪已成为提升用户体验的核心功能。本文详解如何通过物流API实现包裹位置追踪、ETA计算及数据优化,涵盖API集成、后端处理、前端展示与性能调优,助力构建高效可靠的追踪系统,提升用户信任与满意度。
465 0
|
7月前
|
SQL 运维 关系型数据库
【产品升级】Dataphin V5.0版本发布:助力出海业务、增全量一体集成、异步调用API等更多功能等你发现
Dataphin是瓴羊推出的智能数据建设与治理平台,基于阿里巴巴内部实践,提供一站式数据建设与治理能力。V5.0版本研发新增支持Databricks作为离线计算引擎、支持MySQL数据库一键增全量同步、支持管理Hudi、Delta Lake表等;资产运营与消费持续提效,支持批量编辑目录名称及描述、Quick BI仪表板的上架管理等功能,增加资产可用性与盘点效率。
368 8
|
7月前
|
存储 数据可视化 Java
Java Stream API 的强大功能
Java Stream API 是 Java 8 引入的重要特性,它改变了集合数据的处理方式。通过声明式语法,开发者可以更简洁地进行过滤、映射、聚合等操作。Stream API 支持惰性求值和并行处理,提升了代码效率和可读性,是现代 Java 开发不可或缺的工具。
146 0
Java Stream API 的强大功能
|
8月前
|
供应链 API 数据安全/隐私保护
电商API数据接口的核心功能
电商API数据接口是电商平台与外部系统通信的核心工具,具备订单管理、库存同步和电子面单获取三大功能。它实现订单信息实时同步、多平台整合与状态更新,提升商家运营效率;通过库存数据双向同步,避免超卖并优化库存成本;同时自动获取电子面单号,加快发货流程。电商API在提升交易效率与用户体验方面具有重要作用。
|
8月前
|
JSON 算法 API
拼多多API跨店比价功能,选品效率提升60%!
拼多多推出API跨店比价功能,助力商家与消费者高效选品。通过自动化比价与智能算法,实现选品效率提升60%。开发者可快速集成,优化采购与购物体验。智能高效,抢占市场先机。了解详情:https://o0b.cn/evan
759 0
|
8月前
|
安全 API 开发者
Docker Remote API的功能详述及其使用方法。
综上所述,Docker Remote API是管理Docker环境的强大工具,它使得开发者能够更灵活地集成和自动化Docker相关的操作。通过遵循Docker守护进程的安全配置标准和正确使用HTTP请求,可以有效地控制Docker守护进程,实现高效的容器管理和自动化部署。
256 0
|
9月前
|
Java API
深入解析Java API中Object类的功能
了解和合理运用 Object类的这些方法,对于编写可靠和高效的Java应用程序至关重要。它们构成了Java对象行为的基础,影响着对象的创建、识别、表达和并发控制。
171 0
|
9月前
|
API
Dataphin功能Tips系列(64)-API资产编目及上架
在企业数据部门中,因API命名不规范、分类不清、信息不全等问题,导致业务开发人员查找困难、重复咨询、误用接口等,影响效率。Dataphin提供API资产编目与上架功能,通过目录规划、属性管理、手动/自动上架等方式,实现API的系统化管理与精准检索,提升业务响应效率。
206 0
|
9月前
|
JSON 自然语言处理 API
根据标题利用API优化电商搜索功能:提升转化率
本文探讨如何通过API优化电商平台搜索功能,提升用户搜索到购买的转化率。传统搜索依赖简单关键词匹配,常导致结果不相关,影响用户体验与成交率。利用NLP(自然语言处理)API,可分析商品标题语义,提取关键词与向量,实现更精准的智能匹配。通过预处理标题、构建智能索引、相关性排序等步骤,能有效提升搜索转化率15%-25%。文章附实现代码与集成指南,助力电商平台升级搜索系统。
270 0