用HOOK来修改API函数的功能(1)-注册表

简介:
我们知道编程实际上是使用各种API函数来达到我们想要的目的。换句话说就是API函数是我们通常编程时使用到的最底层函数。很多人也觉得除了API函数微软没有在提供其它的编程接口。其实微软出了提供API函数意外还提供了另外的一套函数,不过这些函数会随着操作系统的不同有细微的改变。由于这些函数是如此的“不稳定”,所以微软并没有将它们文档化。我们称之为“未文档化函数”。我们通常使用的API函数其实都是使用这些函数来实现的。所以如果我们使用HOOK来修改这些函数的某些执行特征,那么我们就可以实现一些特殊的功能,例如注册表的禁止修改,禁止删除等等。
从今天开始我会连续的写出如何使用HOOK的方法来修改API函数的一些特性。
首先我来说说如何做到注册表的禁止修改。
在“未文档化函数”中有这样一个函数ZWSETVALUEKEY它的定义是这样的:
ZWSETVALUEKEY)(
 IN HANDLE  KeyHandle,
 IN PUNICODE_STRING  ValueName,
 IN ULONG  TitleIndex  OPTIONAL,
 IN ULONG  Type,
 IN PVOID  Data,
 IN ULONG  DataSize
 );
ZWSETVALUEKEY ZwSetValueKey;
这个函数就是用来使用对注册表内容的修改的,也就是说如果我们打开注册表以后对任何的一个键值的修改,系统都会调用这个函数来实现。如果我们将这个函数修改成“如果用户想修改制定的键值的时候,我们不予执行”,那么我们就实现了对这个注册表键值的保护。那如何来实现呢?下面是我实现的代码和讲解,希望对大家有所帮助。
#include "ntddk.h"
#include "bugcodes.h"
#include "ntstatus.h"
#include <ntddkbd.h>
#include <stdio.h>
#include "stdarg.h"
#include "ntiologc.h"
#define MAXPATHLEN 1024
#define MaxBuf 1024
#define MIN(x,y) ((x) < (y) ? (x) : (y))
.....

//(1).声明原有函数
typedef NTSTATUS (*REALZWSETVALUEKEY)(
 IN HANDLE  KeyHandle,
 IN PUNICODE_STRING  ValueName,
 IN ULONG  TitleIndex  OPTIONAL,
 IN ULONG  Type,
 IN PVOID  Data,
 IN ULONG  DataSize
 );
REALZWSETVALUEKEY RealZwSetValueKey;
//(2).定义HOOK注册表设置内容的函数
NTSTATUS HookZwSetValueKey(
 IN HANDLE  KeyHandle,
 IN PUNICODE_STRING  ValueName,
 IN ULONG  TitleIndex  OPTIONAL,
 IN ULONG  Type,
 IN PVOID  Data,
 IN ULONG  DataSize
 );
...
//驱动的入口函数
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) 
{
......
RealZwSetValueKey=(REALZWSETVALUEKEY)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwSetValueKey")]);
  (REALZWSETVALUEKEY)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwSetValueKey")])=HookZwSetValueKey;
// 上面的2行代码就是我们将函数ZwSetValueKey替换成我们自己定义的函数HookZwSetValueKey,这个时候如果有系统要调用函数ZwSetValueKey的时候就会调用我们定义的函数HookZwSetValueKey。而在这个函数中所做的就是我们对修改键值的判断。
}
PVOID GetPointer( HANDLE handle )
{
  PVOID         pKey;
  if(!handle) return NULL;
  //取得指针.
  if( ObReferenceObjectByHandle( handle, 0, NULL, KernelMode, &pKey, NULL ) != STATUS_SUCCESS ) 
  {
      pKey = NULL;
  } 
  return pKey;
}
//HOOK设置注册表键值的函数
NTSTATUS HookZwSetValueKey(
  IN HANDLE  KeyHandle,
  IN PUNICODE_STRING  ValueName,
  IN ULONG  TitleIndex  OPTIONAL,
  IN ULONG  Type,
  IN PVOID  Data,
  IN ULONG  DataSize)
{
 NTSTATUS rc;
 UNICODE_STRING *pUniName;  //定义得到修改注册表的UNI路径
 ULONG actualLen;
 ANSI_STRING keyname,
    akeyname,
    m_keyname,
    m_akeyname;       //定义得到修改注册表的UNI路径
 PVOID pKey;
 RtlUnicodeStringToAnsiString( &akeyname, ValueName, TRUE);
 RtlUnicodeStringToAnsiString( &m_akeyname, ValueName, TRUE);
 RtlUpperString(&akeyname,&m_akeyname);
 RtlFreeAnsiString(&m_akeyname);
 if( pKey = GetPointer( KeyHandle))
 {
  pUniName = ExAllocatePool( NonPagedPool, 512*2+2*sizeof(ULONG));
  pUniName->MaximumLength = 512*2;
  if( NT_SUCCESS( ObQueryNameString( pKey, pUniName, MAXPATHLEN, &actualLen)))
  {
   RtlUnicodeStringToAnsiString( &keyname, pUniName, TRUE);
   keyname.Buffer=_strupr(keyname.Buffer);
   akeyname.Buffer=_strupr(akeyname.Buffer);
   RtlUnicodeStringToAnsiString( &m_keyname, pUniName, TRUE);
   RtlUpperString(&keyname,&m_keyname);
   RtlFreeAnsiString(&m_keyname);
   if (strcmp(keyname.Buffer,\\REGISTRY\\MACHINE\\SOFTWARE\\TEST) == 0)
   {
    if(strcmp(akeyname.Buffer,"TEST") ==0)
    {
     RtlFreeAnsiString(&akeyname); 
     RtlFreeAnsiString(&keyname); 
     return 0;
    }
   }
   else if (strcmp(keyname.Buffer," \\REGISTRY\\MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN") == 0)
   {
    if(strcmp(akeyname.Buffer,"TEST2") ==0)
    {
     RtlFreeAnsiString(&akeyname); 
     RtlFreeAnsiString(&keyname); 
     return 0;
    }
   }
   RtlFreeAnsiString(&keyname); 
  }
 }
 RtlFreeAnsiString(&akeyname); 
 rc=RealZwSetValueKey(KeyHandle,ValueName,TitleIndex,Type,Data,DataSize);
 return (rc);
}
上面的代码就是实现了对注册表中TEST下的Test键值和对RUN下的TEST2键值进行保护。
以上的代码是我自己开发的一个软件中实际使用的代码,是经过测试的!
本文转自狗窝博客51CTO博客,原文链接http://blog.51cto.com/fxh7622/30324如需转载请自行联系原作者

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