Windows下的函数hook技术

windows - Hook技术介绍 hook 介绍 Hook技术被广泛应用于安全的多个领域,比如杀毒软件的主动防御功能,涉及到对一些敏感API的监控,就需要对这些API进行Hook;窃取密码的木马病毒,为了接收键盘的输入,需要Hook键盘消息;甚至是Windows系统及一些应用程序,在打补丁时也需要用到Hook技术。接下来,我们就来学习Hook技术的原理。 分类 1、 SetWindowsHookEx Windows下的应用程序大部分都是基于消息机制的,它们都会有一个消息过程函数,根据不同的消息完成不同的功能。Windows操作系统提供的钩 阅读详情
讨论了Windows下hook函数的几种方法。提供了一个hook TextOutA的完整例子。通过CreateRemoteThread的方法把hook dll注入到一个普通的应用程序中。Hooking Imported Functions by name调用 imported functions'时的步骤/实现在程序中调用从其它模块引入的函数的方法和普通的函数调用有所不同。对于普通的函数调用,直接使用call address来调用即可,但是对于imported functions ,在编译的时候compiler/link 并不知道实际的函数实现会被加载到那个地址,函数实现在那个地址在运行的时候才会确定。对于imported functions ,首先是call 引入表中的一个函数,在运行时再初始化引入表,使用 jmp 跳转到真实的函数实现。

引入表:

    The PE file IMAGE_IMPORT_DESCRIPTOR structure, which holds all the information about functions imported from a specific DLL, has pointers to two arrays in the executable. These arrays are called import address tables (IATs), or sometimes thunk data arrays. The first pointer references the real IAT, which the program loader fixes up when the executable is loaded. The second pointer references the original IAT, which is untouched by the loader and lists the imported functions.

实现原理

  • 找到PE文件的Image_Import_Descriptor 结构
  • 找到Original LAT和Real LAT.
  • 通过要hook 的函数的名字在Original LAT找到要hook的imported function在数组中的index.
  • 保存并修改Real LAT在相应index的function address

(refer to John Robbins, BugsLayerUtil.dll)

Hooking Imported Functions by ordinal

原理和 Hook Imported functions by name 一样,只是是通过要 hook 的函数的 ordinal 在 original LAT 中找到index.

Hooking a function in this dll

    当一个DLL 是通过LoadLibrary 载入的时候,我们无法通过hook imported function 的方法的hook它中的function 
    。有两种可能的办法处理这种情况:
    第一种方法,遍历进程空间,发现call 指定函数的地方替换为 call hookFunction. 太麻烦,而且不安全。 
    第二种方法,改写要hook的函数FuncA 
    。比较好的方法

  1. 实现HookFuncA ,最后的实现垫入n个nop.
  2. 找到要hook的函数FuncA 的绝对地址,改写前5 个字节为jmp hookFuncA( 假定前5 个字节为n 个完整的指令)
  3. 把FuncA的前5个字节拷贝到hookFuncA 的后面,在加上一条指令 jmp funcA+5.
    ----Code of HookDLL.dll, 可以通过CreateRemoteThread的方法把hook dll注入到一个普通的应用程序中。

// HookDLL.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "HookDLL.h"
#include "Log.h"
//forward declare.
LRESULT WINAPI InstallTextoutHook();
LRESULT WINAPI UninstallTextoutHook();
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
if (InstallTextoutHook())
{
WriteLog("Install hook success./n");
}else
{
WriteLog("Intall hook failed./n");
}
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
if (UninstallTextoutHook())
{
WriteLog("Uninstall hook success./n");
}else
{
WriteLog("Unintall hook failed./n");
}
break;
}
return TRUE;
}
#define DWORD_PTR DWORD*
#define __LOCAL_SIZE 40h
#define NAKED_PROLOG() /
DWORD_PTR dwRet ; /
DWORD_PTR dwESI ; /
{ /
__asm PUSH EBP /* Set up the standard frame.*//
__asm MOV EBP , ESP /
__asm SUB ESP , __LOCAL_SIZE /* Save room for the local *//
/* variables. *//
__asm MOV EAX , EBP /* EBP has the stack coming *//
/* into the fn. in it. *//
__asm ADD EAX , 4 /* Account for PUSH EBP *//
__asm MOV EAX , [EAX] /* Get return address. *//
__asm MOV [dwRet] , EAX /* Save return address. *//
__asm MOV [dwESI] , ESI /* Save ESI so chkesp in dbg *//
/* builds works. *//
}// The common epilog part that can be shared between the stdcall and
// cdecl hook functions.
#define EPILOG_COMMON() /
{ /
__asm MOV ESI , [dwESI] /* Restore ESI. *//
__asm ADD ESP , __LOCAL_SIZE /* Take away local var space *//
__asm MOV ESP, EBP /* Restore standard frame. *//
__asm POP EBP /
}
#define COPY_CODE_LENGTH 5
BYTE g_abOriCode[COPY_CODE_LENGTH];
BYTE g_abJmpCode[COPY_CODE_LENGTH];
PROC g_oriTextout;
BOOL g_blHooked = FALSE;
LRESULT WINAPI InstallTextoutHook()
{
if (g_blHooked)
return TRUE;
//Get TextOutA's address.
HMODULE hGdi32 = ::LoadLibrary(_T("Gdi32.dll"));
g_oriTextout = GetProcAddress(hGdi32, _T("TextOutA"));
if (NULL == g_oriTextout)
return FALSE;
//Get the hook'a address.
HMODULE hModule = GetModuleHandle(_T("HookDLL.dll"));
if (NULL == hModule)
return FALSE;
DWORD dwHookAddr = NULL;
__asm
{
mov esi, offset HookLabel;
mov edi, 0x10000000;//0x10000000 is the dll's base address.
sub esi, edi;
add esi, hModule;
mov [dwHookAddr], esi;
}
//Get the NOP's address.
DWORD dwNOPAddr = NULL;
__asm
{
mov esi, offset NOPLabel;
mov edi, 0x10000000;//0x10000000 is the dll's base address.
sub esi, edi;
add esi, hModule;
mov [dwNOPAddr], esi;
}
//Save the first 5 byte of TextOutA to g_abOriCode
__asm
{
mov esi, g_oriTextout;
lea edi, g_abOriCode;
cld;
movsd;
movsb;
}
//Generate the jmp Hook function.
g_abJmpCode[0] = 0xe9;
__asm
{
mov eax, dwHookAddr;
mov ebx, g_oriTextout;
add ebx, 5;
sub eax, ebx;
mov dword ptr[g_abJmpCode+1], eax;
}
//Write the jump instruction to the textoutA.
DWORD dwProcessId = GetCurrentProcessId();
HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS,
FALSE, dwProcessId);
if (NULL == hProcess)
return FALSE;
DWORD dwOldFlag;
VirtualProtectEx(hProcess, g_oriTextout, 5, PAGE_READWRITE, &dwOldFlag);
WriteProcessMemory(hProcess, g_oriTextout, g_abJmpCode, sizeof(g_abJmpCode), NULL);
VirtualProtectEx(hProcess, g_oriTextout, 5, dwOldFlag, NULL);
//Write g_abOriTextout to the end of Hook function(NOP addr), then write the jmp instruction.
VirtualProtectEx(hProcess, (LPVOID)dwNOPAddr, 10, PAGE_READWRITE, &dwOldFlag);
WriteProcessMemory(hProcess, (LPVOID)dwNOPAddr, g_abOriCode, sizeof(g_abOriCode), NULL);
//Generate the jmp TextoutA + 5
__asm
{
mov eax, g_oriTextout;
mov ebx, dwNOPAddr;
add ebx, 5;
sub eax, ebx;
mov dword ptr[g_abJmpCode+1], eax;
}
WriteProcessMemory(hProcess, (LPVOID)(dwNOPAddr+5), g_abJmpCode, sizeof(g_abJmpCode), NULL);
VirtualProtectEx(hProcess, (LPVOID)dwNOPAddr, 10, dwOldFlag, NULL);
g_blHooked = TRUE;
if(TRUE)
return TRUE;
HookLabel:
NAKED_PROLOG ( ) ;
int nx, ny;
LPCSTR lp;
lp = NULL;
_asm
{
mov esi, ebp;
add esi, 0Ch;
lea edi, nx;
movsd;
lea edi, ny;
movsd;

lea edi, lp;
movsd;
}
WriteLog_F("Try to ouput /"%s/" at (%d,%d)/n", lp, nx, ny);
// Do the common epilog.
EPILOG_COMMON ( ) ;
NOPLabel:
_asm NOP
_asm NOP
_asm NOP
_asm NOP
_asm NOP
_asm NOP
_asm NOP
_asm NOP
_asm NOP
_asm NOP
_asm NOP
}
LRESULT WINAPI UninstallTextoutHook()
{
if (!g_blHooked)
return FALSE;
//Restore the first 5 bytes code of TextOutA
DWORD dwProcessId = GetCurrentProcessId();
HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS,
FALSE, dwProcessId);
if (NULL == hProcess)
return FALSE;
DWORD dwOldFlag;
VirtualProtectEx(hProcess, g_oriTextout, 5, PAGE_READWRITE, &dwOldFlag);
WriteProcessMemory(hProcess, g_oriTextout, g_abOriCode, sizeof(g_abOriCode), NULL);
VirtualProtectEx(hProcess, g_oriTextout, 5, dwOldFlag, NULL);
g_blHooked = FALSE;
return TRUE;
}

 
Windows 如何通过 hook 来拦截截屏 这篇内容介绍了如何在Windows系统中进行屏幕捕获的权限管理,特别是拦截截屏操作。文章首先指出在传统Windows应用程序中,系统没有提供直接的权限管控,因此需要采取一些其他方式,如使用hook来进行权限管控。接着,文章演示了如何通过API Monitor来监听目标应用程序的行为,以确定其使用的截屏方式。然后,文章介绍了如何使用BitBlt接口进行hook操作,以实现拦截截屏。最后,文章提供了注入hook DLL到目标进程的方法,以实现权限管理。 阅读详情

相关推荐

Windows Dll注入与API HOOK

DLL注入: 1.      使用注册表注入dll HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_DLLs AppInit_Dlls中设置待注入的dll绝对路径 LoadAppInit_Dlls值设为1 2.      使用Windows挂钩注入dll 需要使用SetWind

小黑话不多 3173

Windows中的Hook机制

windows中的Hook技术被广泛应用于安全的多个领域,比如杀毒软件的主动防御功能,涉及到对一些敏感API的监控,就需要对这些API进行Hook;窃取密码的木马病毒,为了接收键盘的输入,需要Hook键盘消息;甚至是Windows系统及一些应用程序,在打补丁时也需要用到Hook技术。接下来,我们就来学习Hook技术的原理。...

Albert_weiku的博客 5068

Windows程序Hook技术入门:从DLL注入到函数拦截实战指南

Hook(钩子)技术是程序行为分析与扩展的核心手段,通过在程序执行流程中插入自定义代码,实现对函数调用或事件处理的拦截、修改与增强。其原理主要基于内存地址替换或代码跳转,在Windows平台上常通过DLL注入或内存补丁实现。这项技术的工程价值在于为软件自动化、行为监控、安全审计及功能扩展提供了底层支持,广泛应用于自动化测试、辅助工具开发及安全研究等场景。例如,结合MinHook等轻量级库,开发者可以相对便捷地实现API拦截,而通过CreateRemoteThread进行DLL注入则是经典且基础的实践路径。本

weixin_30780649的博客 521

Windows Hook案例分析与技术探索

Hook是Windows中提供的一种用以替换DOS下“中断“的系统机制,中文译为“挂钩”或“钩子”。在对 特定的系统事件进行Hook后,一旦发生已Hook事件,对该事件进行Hook的程序就会收到系统的通知, 这时程序就能在第一时间对该事件做出响应。 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有 到达目的程序前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理 (改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。..

John_ToStr的博客 7131

Windows hook技术

hook即钩子技术,它钩取某个特定的事件,然后在默认的事件处理之外,进行一些自定义的处理,感觉这种行为有点类似插桩。。 消息hook 微软为Windows提供了几个消息hook的API,主要是以下三个: SetWindowsHookEx UnhookWindowsHookEx CallNextHookEx 这种hook技术是对Windows消息进行钩取。众所周知,...

40KO的博客 576

深入理解Win7 x64下的SwapContext函数Hook技术

在现代操作系统中,Hook技术是内核开发和安全研究的一个重要方面。它允许开发者或研究人员在系统执行关键操作之前,截获并改变其行为。Ring0层,也就是内核层,是操作系统最为核心的部分,这里运行的代码拥有最高的权限,因此Ring0层Hook技术能够实现对系统行为的深度干预。在64位系统中,由于地址空间的增加,系统调用的实现方式和数据传输机制也发生了显著变化。系统调用的次数和复杂度随着系统功能的增强而增加。

weixin_35761094的博客 845

深度解析:Windows时间函数Hook技术实现游戏加速

OpenSpeedy是一款基于Windows系统时间函数Hook技术的开源游戏加速工具,通过用户态级别的API拦截技术,实现对游戏运行速度的精确控制。该项目采用C/C++开发,基于GPL v3许可证开源,为技术研究者和游戏开发者提供了一个深入理解Windows API Hook机制的绝佳案例。 ## 技术架构与核心机制 OpenSpeedy的技术核心在于对Windows系统时间相关API的智能

gitblog_00827的博客 179

【知识图谱】一文看懂知识图谱的搭建实践与科普教程(5万字完结篇)

所有可能的实体对:(“Mate40”,“华为”), (“Mate40”,“手机”), (“华为”,“手机”)。送入关系模型分类,预期输出 (“Mate40”,“华为”): 品牌, (“Mate40”,“手机”): 属于类别, (“华为”,“手机”): 无关系。,定义了图谱中概念和关系的类型层次结构,相当于知识图谱的“纲领”和“schema”。训练完成后,当模型看到新的句子,比如“苹果的MacBook笔记本性能强大”,识别出实体“苹果”(品牌)和“MacBook”(产品)后,就能正确输出关系“品牌”。

weixin_41645791的博客 2616

OpenSpeedy技术解析:Windows游戏进程时间函数Hook实现原理与应用实践

在游戏开发与逆向工程领域,时间控制一直是核心技术难题之一。传统游戏变速工具往往依赖系统级修改或内核驱动,存在兼容性差、安全性低等问题。OpenSpeedy作为一款开源的游戏变速工具,通过创新的Ring3层Hook技术,为Windows平台游戏进程提供了安全可控的时间加速解决方案。本文将从技术实现、架构设计、应用场景三个维度深入分析这一工具的设计哲学与实现原理。 ## 架构设计思路:用户态Hook

gitblog_01051的博客 178

清华开源GPGPU“承影Ventus”初体验:用RISC-V RVV指令集跑通第一个OpenCL程序

本文详细介绍了清华大学开源GPGPU“承影Ventus”的开发实践,展示了如何基于RISC-V RVV指令集运行首个OpenCL程序。从环境配置、内核开发到性能优化,全面解析了这一创新架构的开发流程,为开发者提供了在RISC-V生态中进行通用GPU计算的实用指南。

weixin_30415113的博客 490

时序基础模型Timer-S1:十亿参数如何革新时间序列预测

时间序列预测是数据分析与机器学习中的核心任务,旨在基于历史数据预测未来趋势。其原理在于捕捉数据中的趋势、周期性和季节性等时序依赖关系。这项技术的价值在于赋能业务决策,广泛应用于金融风控、能源管理、物联网监控和供应链优化等关键场景。传统方法依赖针对特定任务的专用模型,面临泛化能力弱和开发成本高的挑战。本文聚焦的时序基础模型,通过在海量跨领域数据上进行预训练,学习时序通用模式,并结合十亿级参数带来的强大容量,实现了性能的显著突破。这种范式转变,使得模型能够像“全科医生”一样,通过少量数据微调即可快速适应新任务,

weixin_29164843的博客 269

Windows游戏时间函数Hook技术深度评测:OpenSpeedy开源变速器技术解析与性能对比

OpenSpeedy是一款基于Windows时间函数Hook技术的开源游戏变速器,通过拦截和修改系统时间函数实现游戏速度的精确控制。该工具针对单机游戏和老旧游戏的性能优化需求,提供了非侵入式的Ring3级别Hook方案,帮助开发者和技术爱好者突破游戏帧率限制,实现更流畅的游戏体验。本文将深入分析其技术实现原理、架构设计、性能表现及适用场景,为技术用户提供全面的评测参考。 ## 技术架构与实现原理

gitblog_00460的博客 243

从网格划分到结果解读:一次完整的子弹侵彻LS-DYNA仿真避坑指南

本文详细解析了子弹侵彻LS-DYNA仿真中的关键技术与避坑指南,涵盖网格优化、对称边界条件设置、沙漏控制参数调整及结果可信度验证。通过HyperMesh网格划分和LS-DYNA高级参数配置,帮助工程师提升仿真精度与效率,确保计算结果物理可信。

weixin_29816689的博客 406

基于Windows内核驱动派遣函数HOOK的硬件指纹伪装技术实现方案

EASY-HWID-SPOOFER是一款基于Windows内核模式驱动技术的硬件信息伪装解决方案,通过深度修改驱动程序派遣函数和直接操作物理内存的技术架构,实现对硬盘序列号、BIOS信息、网卡MAC地址和显卡设备信息的临时性修改。该方案采用创新的双模块设计架构,将底层硬件操作与用户界面完全分离,为技术研究者和隐私保护需求者提供了深入了解Windows内核驱动开发和硬件信息管理的技术实现平台。 #

gitblog_01102的博客 241

[密码学实战]密评考试训练系统v1.0程序及密评参考题库(获取路径在文末)(二十四)

本系统将密码学理论与软件工程实践相结合,为密评备考提供了高效解决方案。随着《密码法》的深入实施,掌握密评知识将成为信息安全从业者的核心竞争力。立即开始您的密码安全专家之旅!(注:实际应用请以最新发布版本为准)

曼岛_的博客 800

Qt for WebAssembly环境搭建

一、前言 二、Ubuntu 1、在线安装Qt15 在线安装下载器:https://download.qt.io/official_releases/online_installers/ 安装时记得勾选WebAssembly,如下: 2、安装依赖 # Install Python sudo apt-get install python2.7 # Install CMake (optional, only needed for tests and building Binaryen) sudo apt

贝勒里恩的博客 3670

揭秘OpenSpeedy核心技术:Hook Windows系统时间函数实现原理

你是否遇到过这些情况:游戏任务需要漫长等待、剧情动画无法跳过、重复刷怪效率低下?OpenSpeedy通过巧妙修改Windows系统时间函数,让游戏"快进"成为可能。这种技术不是简单的帧率提升,而是从时间维度重构游戏进程的运行节奏。 OpenSpeedy的核心原理是通过API Hook(应用程序编程接口钩子)技术,拦截并修改游戏调用的系统时间函数返回值。当游戏请求当前时间或等待特定时长时,我们可以...

gitblog_00527的博客 793

激光雷达与相机外参标定(附open3d python代码)

现在的激光雷达与相机的标定程序基本都是Ubuntu框架下面的,并且都是C++代码,需要安装的依赖也比较复杂,于是自己写了一个python版本的标定程序,依赖非常简单,Windows系统也可以运行。我这里用的大疆的雷达,点比较密集,更容易用我这种方法标定,旋转的16,32线的雷达也可以用这种方法标定,只是标定点会相对难选取一些。2 手动在点云上选取N个标定点(每个点都对应图像上的点,顺序也要一致)3 通过PNP方法计算出二者的旋转投影矩阵,也就是外参矩阵。1 手动在图像上面选取N个标定点。

三维点云技术探索 3412

OpenSpeedy:Windows游戏时间函数Hook技术深度解析与应用实践

OpenSpeedy是一款基于Ring3级别Hook技术的开源游戏加速工具,通过智能拦截和修改Windows系统时间函数,实现游戏帧率突破和运行速度调节。该项目采用C++/Qt技术栈构建,结合MinHook库实现安全的API拦截,为游戏开发者和技术爱好者提供了研究Windows时间管理机制的绝佳案例。 ## 技术架构设计与实现原理 ### 核心Hook机制架构 OpenSpeedy的技术核心

gitblog_01016的博客 160

【音视频 ffmpeg 学习】 RTMP推流 mp4文件

3.当RTMP协议在互联网中传输数据的时候,消息会被拆分成更小的单元,称为消息块(Chunk)。1.RTMP(实时消息传输协议)是Adobe 公司开发的一个基于TCP的应用层协议。2.RTMP协议中基本的数据单元称为消息(Message)。下载地址:http://nginx.org/download。下载 rtmp模块 到nginx 模块下。安装nginx 和 rtmp模块。(1). linux 环境准备。下载nginx安装包。使用 vcl 播放流。

weixin_45397344的博客 2277

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

开源游戏加速工具深度解析:Windows时间函数Hook技术实战指南

你是否曾经遇到过这样的情况?在玩一款经典的单机RPG游戏时,想要跳过繁琐的重复刷怪过程;或者在策略游戏中,希望加速漫长的建筑建造时间;又或者在动作游戏中,想要体验超高速的战斗节奏。这些场景都指向一个共同的需求:**游戏时间控制**。今天,我们将深入探讨OpenSpeedy这款开源游戏加速工具的技术内幕,了解它如何通过创新的Windows时间函数Hook技术,为玩家提供灵活的游戏体验控制能力。 O

gitblog_00616的博客 156

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Streambert 下载队列完全指南:中断、失败重试与日常维护一次讲透

Streambert 是一款跨平台 Electron 桌面应用:可以在线播放电影、剧集和动漫,也能把它们下载到本地,全程零广告零追踪。本文覆盖 Streambert 下载队列的完整管理流程——任务怎么发起、中途怎么停、失败怎么救、重启后怎么维护,全部以操作步骤和界面描述为主,不需要看代码。先给三个反直觉的结论:**没有暂停按钮**,但中断操作足够干净;网络抖动时下载器会**自动重试最多 3 次**

gitblog_00933的博客 136

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

DELPHI HOOK随手笔记

在 DOS 系统中编程,经常会采取截取中断向量的技术:我们可以设置新的中断服务程序,当系统其他的程序调用这个中断时,就让它先调用我们自己设置的新的中断服务程序,然后再调用原来的中断服务程序,这样就能够获得非凡的控制权。许多优秀的软件和大多数 DOS 病毒程序都采用了这个方法。 在 Windows 中,我们也可以采取类似技术。当系统调用某个 API 函数时,就会先进入我们自己的函数,然后再调用原...

kinvsn的博客 1360
上一篇: Reverse-Engineering Malware
下一篇: 关于Windows下ShellCode编写的一点思考
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值