拦截API(修改函数地址方法)

用户层下拦截系统api的原理与实现   写这篇文章是为了复习一些知识,最近在做毕业设计,之中大量地使用了这种技术,主要是用在拦截winsock函数,对于其他系统api,其效果也是一样的.  拦截api的技术有很多种,大体分为用户层和内核层的拦截.这里只说说用户层的拦截.而用户层也分为许多种:修改PE文件导入表,直接修改要拦截的api的内存(从开始到最后,使程序跳转到指定的地址执行).不过大部分原理都是修改程序流程,使之跳转到你要 阅读详情

#include <windows.h>
#include <stdio.h>
#include <stddef.h>
#include <atlbase.h>
#include <ImageHlp.h>
#pragma comment(lib, "ImageHlp.lib")

#define HookExceptionNo 5

BOOL Init();

BOOL SysVer = true;
HMODULE g_hModule;
DWORD dwIdOld, dwIdNew;
//###############################################################
/* begin 这是拦截API所需要的代码*/
typedef struct
{
    FARPROC funcaddr;
    BYTE    olddata[5];
    BYTE    newdata[5];
}HOOKSTRUCT;
HOOKSTRUCT MessageA_API;

void Ring0WriteMemory(void *dst, void *src, int copySize)
{
    BYTE IDTR_1[6];
    DWORD OldExceptionHook;
    __asm
    {
        JMP __Continue
   
        Ring0Proc:

        PUSHAD
       
        MOV AX,30h     // 定义一个系统级别的数据段选择子
       
        MOV BX,DS      // 保存原DS与ES
        MOV DX,ES
       
        MOV DS,AX      // 修改DS与ES
        MOV ES,AX
       
        REP MOVSB      // 插入指令
       
        MOV DS,BX      // 复原DS与ES
        MOV ES,DX

        POPAD
       
        IRETD          //返回
   
        __Continue:
       
       
        SIDT FWORD PTR IDTR_1                    // 修改中断门
        MOV EAX,DWORD PTR IDTR_1+02h
        ADD EAX,HookExceptionNo*08h+04h
        CLI
       
       
        MOV ECX,DWORD PTR [EAX]                  // 保存原异常处理例程入口
        MOV CX,WORD PTR [EAX-04h]
        MOV OldExceptionHook,ECX
       
        LEA EBX,Ring0Proc                        // 指定新入口 
        MOV WORD PTR [EAX-04h],BX
        SHR EBX,10h
        MOV WORD PTR[EAX+02h],BX
       
        PUSHAD                                   // 配置参数
        MOV EDI,dst
        MOV ESI,src
        MOV ECX,copySize
       
        INT HookExceptionNo                      // 激活Ring0代码
        POPAD
       
        MOV ECX,OldExceptionHook                 // 复原入口
        MOV WORD PTR[EAX-04h],CX
        SHR ECX,10h
        MOV WORD PTR[EAX+02h],CX
       
        STI
    }    
}

 void HookOnOne(HOOKSTRUCT *hookfunc)
{
 if(SysVer)
 {
  HANDLE hProc;
  dwIdOld = dwIdNew;
  hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwIdOld);
  VirtualProtectEx(hProc, hookfunc->funcaddr, 5, PAGE_READWRITE,&dwIdOld);
  WriteProcessMemory(hProc, hookfunc->funcaddr, hookfunc->newdata, 5, 0);
  VirtualProtectEx(hProc, hookfunc->funcaddr, 5, dwIdOld, &dwIdOld);
 }
 else
 {
  Ring0WriteMemory(hookfunc->funcaddr, hookfunc->newdata, sizeof(hookfunc->newdata));
 }
}
//---------------------------------------------------------------------------
void HookOffOne(HOOKSTRUCT *hookfunc)
{
 if(SysVer)
 {
  HANDLE hProc;
  dwIdOld = dwIdNew;
  hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwIdOld);
  VirtualProtectEx(hProc, hookfunc->funcaddr,5, PAGE_READWRITE, &dwIdOld);
  WriteProcessMemory(hProc, hookfunc->funcaddr, hookfunc->olddata, 5, 0);
  VirtualProtectEx(hProc, hookfunc->funcaddr, 5, dwIdOld, &dwIdOld);
 }
 else
 {
  Ring0WriteMemory(hookfunc->funcaddr, hookfunc->olddata, sizeof(hookfunc->olddata));
 }
}

//获取被拦截函数信息
 BOOL hookapi(char *dllname, char *procname, DWORD myfuncaddr, HOOKSTRUCT *hookfunc)
{
    g_hModule = LoadLibrary(dllname);
    hookfunc->funcaddr = GetProcAddress(g_hModule, procname);
    if(hookfunc->funcaddr == NULL)
 {
  MessageBox(NULL, "获取原函数地址失败", "error", MB_OK);
        return false;
 }
 
    memcpy(hookfunc->olddata, hookfunc->funcaddr, 5);
    hookfunc->newdata[0] = 0xe9;
    DWORD jmpaddr = myfuncaddr - (DWORD)hookfunc->funcaddr - 5;
    memcpy(&hookfunc->newdata[1], &jmpaddr, 5);
    return true;
}

int WINAPI MyMessageBoxA(HWND hWnd,
      LPCTSTR lpText,
      LPCTSTR lpCaption,
      UINT uType)
{
 int runt;
 HookOffOne(&api_MessageBoxA);
 runt = ::MessageBoxA(hWnd, "拦截成功", lpCaption, uType);
 HookOnOne(&api_MessageBoxA);

 return runt;
}

BOOL Init()                                                                                                                                                                         {
 hookapi("user32.dll", "MessageBoxA", (DWORD)MyMessageBoxA, &api_MessageBoxA);   

HookOnOne(&api_MessageBoxA);                        

}

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved)
{
 OSVERSIONINFO verinfo;
 verinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 switch (ul_reason_for_call)
    {
 case DLL_PROCESS_ATTACH:
  dwIdNew = GetCurrentProcessId();
  GetVersionEx(&verinfo);
  if(verinfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
   SysVer = TRUE;
  else
   SysVer = FALSE;

    return Init() ;
  break;
 case DLL_PROCESS_DETACH:
  if(g_hModule != NULL)
   FreeLibrary(g_hModule);
  break;
 }
    return TRUE;
}


Hook API(挂钩API)技术 Hook API,简单说,就是给API函数挂钩,将本应该调用的API函数拦截,使其转而调用我们自己的函数。这里,我主要介绍如何利用IAT挂钩来实现API拦截。 在我们启动目标程序时,操作系统负责为目标程序创建虚拟地址空间,并将这个可执行模块(就是目标程序)加载到地址空间中去,接下来,系统会将目标程序所需要的DLL文件映射到地址空间。我们将需要映射到地址空间的目标程序及所需DLL统称为模块(Mod 阅读详情

相关推荐

hook一个实现API拦截的具体例子学习钩子的实例

hook一个实现API拦截的具体例子学习钩子的实例,新手可以快速上手哦 解压密码:http://www.99616.net/

基于C++的Hook 暴力实现!拦截系统api,绝对给100分!

1、HOOK介绍(钩子,挂钩) 是一种实现Windows平台下类似于中断的机制。HOOK机制允许应用程序拦截并处理Windows消息或指定事件,当指定的消息发出后,HOOK程序就可以在消息到达目标窗口之前将其捕获,从而得到对消息的控制权,进而可以对该消息进行处理或修改,加入我们所需的功能。如果你正在学习C/C++,加群:825414254获取资料与听课权限 ...

6170

HDHook(附源码)HookAPI改变硬盘串号和MAC地址

VC++源码 一个使用detours来HookAPI的简单例子 DeviceIoControl获取硬盘串号 GetAdaptersInfo获取MAC Hook这两个API改变获取的硬盘串号和MAC地址 HDHook工程 生成dll GetHDDSN工程 载入生成的dll 获取硬盘串号和MAC地址 需要自行安装detours

windows核心编程之API拦截

这个是替换自己进程的API static void WINAPI MySleep(int i) { //((MyTest)g_sleep)(i); MessageBoxA(NULL, "1","1",MB_OK); } void MyHook() { PSTR pszKernel = "kernel32.dll"; PSTR pszSleepName = "Sleep"; PSTR

软件开发 1313

Windows系统API函数拦截技术研究

Windows系统API函数拦截技术研究

API拦截 一个完整的例子 源码

一个完整的例子全局拦截API,十分强大,

内核钩子模板

#include #include #pragma pack(1)typedef struct ServiceDescriptorEntry {    unsigned int *ServiceTableBase;    unsigned int *ServiceCounterTableBase; //Used only in checked build    unsigned int Numbe

lbird 2265

API拦截 API拦截

API拦截 API拦截API拦截API拦截API拦截API拦截

进程间的七大通信方式(概括总结)

进程间的七大通信方式 signal、file、pipe、shm、sem、msg、socket 1,signal 信号通信的目的:某某事件发生!此时需要处理什么,进程间(可以是不相关的进程)传递信号 场景:信号又被称之为中断,需要处理什么对应的是中断处理函数,此时设置断点,形参入栈,保存现场信息,然后去执行中断处理函数,当处理完成之后,恢复现场信息,程序继续往下执行 Linux下可以通过kill -l查看其所有信号(其一共64种信号) 发送信号:kill(pid, 信号) //对指定的进程发送什么信号

surplus12138的博客 1146

Win11系统下Notepad++右键菜单失效?3种修复方法实测有效(附注册表备份指南)

本文针对Windows 11系统中Notepad++右键菜单失效的常见问题,提供了三种经过实测有效的修复方法。核心解决方案包括使用官方NppShell.dll重新注册、手动修复注册表项以及系统级问题排查,并详细说明了操作前的注册表备份指南,确保修复过程安全可靠。

m2n3b4v5c6的博客 328

信贷风控分析—征信数据源

详解企业和个人征信报告,以及信贷风控之指标构造案例参考

csdnbt的博客 3624

揭示win32 api拦截细节

拦截win32 API 调用对于多数windows开发人员来说都一直是很有挑战性的课题,我承认,这也是我感兴趣的一个课题。钩子机制就是用一种底层技术控制特定代码段的执 行,它同时提供了一种直观的方法,很容易就能改变操作系统的行为,而并不需要涉及到代码。这跟一些第三方产品类似。     许多系统都通过拦截技术(spying techniques)利用现有windows应用程序。而拦截的一个重要目的

1394

基于STM32的多参数水质检测仪系统 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6主控,搭配pH、TDS、浊度、水温四大核心水质检测模块,完整实现了多参数水质检测仪的全流程开发,从多通道ADC采集、数字滤波、温度补偿、专业校准、阈值报警到人机交互,全流程无跳步保姆式拆解,配套逐行注释可直接编译的开源代码,新手跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 483

拦截win32 API 调用(下)

拦截win32 API 调用(下) 设计和实现      本部分将讨论钩子架构的关键部分以及它们之间的通讯方式。这样的架构能够拦截任何通过名称导入的api函数。      在概述拦截系统的设计之前,请留意几种注入和拦截方式。      首先,要选择一种能够把dll注入系统所有进程的方式。因此我设计了一个抽象基类,并实现两种注入技术,根据ini文件的设置和操作系统版本(例如windowsN

亮子说编程的博客 1372

【即插即用模块】卷积篇 | TCSVT 2025 | MFACB:多尺度膨胀融合,快速扩大感受野,多尺度特征精准捕捉!

本文提出了一种新型多尺度融合膨胀卷积模块MFACB,用于增强语义分割任务中的特征表达能力。该模块通过三分支串联膨胀卷积结构快速扩大感受野,采用双路径融合机制(基础信息路径+多尺度信息路径)实现高效上下文聚合。相比传统卷积块,MFACB在保持轻量化的同时显著提升了多尺度特征捕捉能力,实验表明其性能优于基础残差块。该模块支持自定义膨胀率和步长调整,可灵活嵌入不同网络阶段,适用于需要特征增强的视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 310

分布式计算Ray框架面试题及参考答案

动态任务图执行引擎是一种能够根据任务之间的依赖关系和运行时的实际情况,动态构建和执行任务图的系统。在 Ray 中,动态任务图执行引擎允许任务在运行时根据数据可用性、计算资源状态等因素,灵活地决定后续任务的执行顺序和方式。对于 AI 应用来说,其往往具有动态性的特点。例如,在深度学习模型的训练过程中,可能需要根据训练的结果动态调整下一轮训练的参数、数据增强方式或者模型结构。动态任务图执行引擎可以很好地支持这些动态需求。它能够根据 AI 应用中各个任务的实时输出和依赖关系,动态地生成和调整任务图。

大模型大数据攻城狮的专栏 1349

c语言win api函数,Win2K下的Api函数的拦截

这么多高手在这里,哎,小弟愿意向各位高手学习。Api拦截并不是一个新的技术,很多商业软件都采用这种技术。对windows的Api函数的拦截,不外乎两种方法,第一种是Mr. Jeffrey Richter 的修改exe文件的模块输入节,种方法,很安全,但很复杂,而且有些exe文件,没有Dll的输入符号的列表,有可能出现拦截不到的情况。第二种方法就是常用的JMP XXX的方法,虽然很古老,却很简单实用...

weixin_39858245的博客 250

6万字嵌入式最全八股文面试题大全及参考答案(持续更新)

进程上下文定义:进程上下文包含了进程执行时所需的所有信息,包括 CPU 寄存器的值、内核栈、任务控制块(TCB)等。作用:当进程被切换时,需要保存当前进程的上下文,并恢复下一个将要运行进程的上下文。中断上下文定义:中断上下文是指处理中断时 CPU 所处的状态,包括中断发生时的寄存器值等。作用:当中断发生时,CPU 会自动保存当前的上下文信息,并跳转到相应的中断处理程序。示例表格上下文描述进程上下文包含进程执行时的所有相关信息中断上下文处理中断时 CPU 所处的状态线程同步定义。

大模型大数据攻城狮的专栏 7919

拦截其它程序的网络数据封包

有时候我们需要对其它应用程序发送和接收的网络数据进行拦截,比如要对IE发送的HTTP头进行分析,得到请求的地址等.这次我们可以用一些例如WPE, Sniffer之类的工具来达到目的.但是工具功能有限,要想实现更强大的功能,还是我们自己动手来DIY吧.拦截网络数据封包的方法有三种,一是将网卡设为混杂模式,这次就可以监视到局域网上所有的数据包,二是HOOK目标进程的发送和接收的API函数,第三种方

代码人生 2035

100天精通Python(基础篇)——第3天:运算符全解析(算术运算符、比较运算符、逻辑运算符、赋值运算符及其优先级规则)

100天精通Python(基础篇)——第3天:运算符全解析(算术运算符、比较运算符、逻辑运算符、赋值运算符及其优先级规则)

努力让自己发光,对的人才能迎着光而来 14万+

基于Simulink环境,提供一个关于如何对EMI抑制的DC-DC变换器进行仿真建模的示例

EMI定义:电磁干扰是指任何能中断、阻碍、降低或限制电气设备有效性能的电磁能量。重要性合规性:确保产品符合国际和地方的EMC标准。可靠性:减少因外部或内部EMI导致的系统故障风险。挑战滤波设计:合理设计输入输出滤波器以抑制传导EMI。布局与接地:良好的PCB设计对于减少辐射EMI至关重要。屏蔽:使用金属屏蔽来保护敏感电路不受外界干扰。首先明确要模拟的任务内容。设计一个能够在高频操作下有效抑制EMI的DC-DC变换器。根据工作频率和谐振元件值确定合适的滤波器参数。

xiaoheshang_123的博客 144

PE文件格式与API HOOK

对于windows低层编程来说,进行API拦截始终是一件让人激动的事,用自己的代码来改变其它程序的行为,还有比这个更有趣吗?而且,在实现API拦截的过程中我们还有机会去熟悉许多在RAD编程环境中很少接触的东西,如DLL远程注入、内存管理,PE文件格式等知识。许多商业软件,如金山词霸等词典软件,各种即时汉化软件、甚至一些网络游戏的外挂中都用到了这种技术,各种调试工具中多多少少也要用到这种技术。实

wltg2001的专栏 5745

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

经典文章-API Hook Revealed

原文: Intercepting Win32 API calls has always been a challenging subject among most of the Windows developers and I have to admit, its been one of my favorite topics. The term Hooking represents

VsirSoft的专栏 3857

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

API hooking revealed

Download source files - 69 Kb Download demo project - 139 Kb Introduction Intercepting Win32 API calls has always been a challenging subject among most of the Windows developers

1169

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

下一篇: 通过CreateProcess插入DLL的方法 (DLL篇)
classfree
博客等级 码龄23年 27粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值