Windows下Hook API技术

Windows平台基于API Hook技术的WinInet网络库HttpDNS实现方案 一、项目背景 学而思网校直播课堂在线安装程序,是一个独立的应用程序,提供学生端的安装功能,为了减少安装包体积,避免引入第三方网络库,使用的是操作系统的WinInet网络库。为了更好的优化网络,提高网络连接的成功率,避免Local DNS造成的域名劫持等问题,采用HttpDNS方式实现域名解析。 二、为什么使用HttpDNS 相比于传统的DNS,HttpDNS主要有以下优势: 1. 域名防劫持: 使用Http(Https)协议进行域名解析,域名解析请求直接发送至HttpDNS服务器,绕... 阅读详情

  Org:http://hi.baidu.com/gudu13lang/blog/item/62e2cb549625fe58d0090649.html

    

  什么叫Hook API?所谓Hook就是钩子的意思,而API是指Windows开放给程序员的编程接口,使得在用户级别下可以对操作系统进行控制,也就是一般的应用程序都需要调用API来完成某些功能,Hook API的意思就是在这些应用程序调用真正的系统API前可以先被截获,从而进行一些处理再调用真正的API来完成功能。在讲Hook API之前先来看一下如何Hook消息,例如Hook全局键盘消息,从而可以知道用户按了哪些键,这种Hook消息的功能可以由以下函数来完成,该函数将一个新的Hook加入到原来的Hook链中,当某一消息到达后会依次经过它的Hook链再交给应用程序。

 
HHOOK SetWindowsHookEx(
  int idHook, //Hook类型,例如WH_KEYBOARD,WH_MOUSE
  HOOKPROC lpfn, //Hook处理过程函数的地址
  HINSTANCE hMod, //包含Hook处理过程函数的dll句柄(若在本进程可以为NULL)
  DWORD dwThreadId, //要Hook的线程ID,若为0,表示全局Hook所有
);
 
  这里需要提一下的就是如果是Hook全局的而不是某个特定的进程则需要将Hook过程编写为一个DLL,以便让任何程序都可以加载它来获取Hook过程函数。
  而对于Hook API微软并没有提供直接的接口函数,也许它并不想让我们这样做,不过有2种方法可以完成该功能。第一种,修改可执行文件的IAT表(即输入表),因为在该表中记录了所有调用API的函数地址,则只需将这些地址改为自己函数的地址即可,但是这样有一个局限,因为有的程序会加壳,这样会隐藏真实的IAT表,从而使该方法失效。第二种方法是直接跳转,改变API函数的头几个字节,使程序跳转到自己的函数,然后恢复API开头的几个字节,在调用AP完成功能后再改回来又能继续Hook了,但是这种方法也有一个问题就是同步的问题,当然这是可以克服的,并且该方法不受程序加壳的限制。
  下面将以一个Hook指定程序send函数的例子来详细描述如何Hook API,以达到监视程序发送的每个封包的目的。采用的是第二种方法,编写为一个dll。首先是一些全局声明,
 
//本dll的handle
HANDLE g_hInstance = NULL;
//修改API入口为 mov eax, 00400000;jmp eax是程序能跳转到自己的函数
BYTE g_btNewBytes[8] = { 0xB8, 0x0, 0x0, 0x40, 0x0, 0xFF, 0xE0, 0x0 };
//保存原API入口的8个字节
DWORD g_dwOldBytes[2][2] = { 0x0, 0x0, 0x0, 0x0 };
//钩子句柄
HHOOK g_hOldHook = NULL;
//API中send函数的地址
DWORD g_pSend = 0;
//事务,解决同步问题
HANDLE g_hSendEvent = NULL;
//自己的send函数地址,参数必须与API的send函数地址相同
int _stdcall hook_send( SOCKET s, const char *buf, int len, int flags );
//要Hook的进程和主线程ID号
DWORD g_dwProcessID = 0;
DWORD g_dwThreadID = 0;
 
  从声明可以看出,我们会把API函数的首8个字节改为 mov eax, 00400000;jmp eax ,使程序能够跳转,只需获取我们自己的函数地址填充掉00400000即可实现跳转。而g_dwOldBytes是用来保存API开头原始的8个字节,在真正执行API函数是需要写回。还有一点,在声明新的函数时,该例中为hook_send,除了保正参数与API的一致外,还需要声明为__stdcall类型,表示函数在退出前自己来清理堆栈,因为这里是直接跳转到新函数处,所以必须自己清理堆栈。下面看主函数,
 
BOOL APIENTRY DllMain( HANDLE hModule, 
  DWORD ul_reason_for_call, 
  LPVOID lpReserved
  )
{
  if(ul_reason_for_call == DLL_PROCESS_ATTACH)
  {
  //获取本dll句柄
  g_hInstance = hModule;
   
  //创建事务
  g_hSendEvent = CreateEvent( NULL, FALSE, TRUE, NULL );
   
  //重写API开头的8字节
  HMODULE hWsock = LoadLibrary( "wsock32.dll" );
  g_pSend = ( DWORD )GetProcAddress( hWsock, "send" );
 
  //保存原始字节
  ReadProcessMemory( INVALID_HANDLE_VALUE, ( void * )g_pSend, 
  ( void * )g_dwOldBytes[0], sizeof( DWORD )*2, NULL );
  //将00400000改写为我们函数的地址
  *( DWORD* )( g_btNewBytes + 1 ) = ( DWORD )hook_send;
  WriteProcessMemory( INVALID_HANDLE_VALUE, ( void * )g_pSend, 
  ( void * )g_btNewBytes, sizeof( DWORD )*2, NULL ); 
  }
  return TRUE;
}
 
  以上是dll的main函数,在被指定的程序加载的时候会自动运行dll的main函数来完成初始化,这里就是改写API的首地址来完成跳转。当然本程序是对于指定程序进行Hook,如果要进行全局Hook,可以在main函数中用GetModuleFileName函数来获取exe文件完整路径,判断当前进程是否是想要Hook的进程。写函数中使用INVALID_HANDLE_VALUE,表示写本进程。
 
int _stdcall hook_send( SOCKET s, const char *buf, int len, int flags )
{
  int nRet;
  WaitForSingleObject( g_hSendEvent, INFINITE );
  
  //恢复API头8个字节
  WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_pSend, 
  ( void* )g_dwOldBytes[0], sizeof( DWORD )*2, NULL );
 
  /*
  这里可以添加想要进行的处理过程
  */
 
  //真正执行API函数
  nRet = send( s, buf, len, flags );
 
  //写入跳转语句,继续Hook
  WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_pSend, 
  ( void* )g_btNewBytes, sizeof( DWORD )*2, NULL );
 
  SetEvent( g_hSendEvent );
 
  return nRet;
}
 
HOOK_API BOOL StartHook(HWND hWnd)
{
  //通过传入的窗口句柄获取线程句柄
  g_dwThreadID = GetWindowThreadProcessId( hWnd, &g_dwProcessID );
 
  //WH_CALLWNDPROC类型的Hook
  g_hOldHook = SetWindowsHookEx( WH_CALLWNDPROC, HookProc,  
  ( HINSTANCE ) g_hInstance, g_dwThreadID );

  if( g_hOldHook == NULL )
  return FALSE;

  return TRUE;
}
 
static LRESULT WINAPI HookProc( int nCode, WPARAM wParam, LPARAM lParam ) 
{

 return CallNextHookEx( g_hOldHook, nCode, wParam, lParam ); 
}
 
HOOK_API void StopHook(void)
{
  if(g_hOldHook != NULL)
  {
  WaitForSingleObject( g_hSendEvent, INFINITE );

  HANDLE hProcess = NULL;
  hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, g_dwProcessID);

  DWORD dwOldProc;
  DWORD dwNewProc;
 
  //改变页面属性为读写
  VirtualProtectEx( hProcess, ( void* )g_pSend, 8, PAGE_READWRITE, &dwOldProc );
 
  //恢复API的首8个字节
  WriteProcessMemory( hProcess, ( void* )g_pSend, 
  ( void* )g_dwOldBytes[0], sizeof( DWORD )*2, NULL );
 
  //恢复页面文件的属性
  VirtualProtectEx( hProcess, ( void* )g_pSend, 8, dwOldProc, &dwNewProc );
  
  CloseHandle(g_hSendEvent);
  
  UnhookWindowsHookEx( g_hOldHook );
  }
}
 
  可以看出,我们创建的Hook类型是WH_CALLWNDPROC类型,该类型的Hook在进程与系统一通信时就会被加载到进程空间,从而调用dll的main函数完成真正的Hook,而在SetWindowsHookEx函数中指定的HookProc函数将不作任何处理,只是调用CallNextHookEx将消息交给Hook链中下一个环节处理,因为这里SetWindowsHookEx的唯一作用就是让进程加载我们的dll。
  以上就是一个最简单的Hook API的例子,该种技术可以完成许多功能。例如网游外挂制作过程中截取发送的与收到的封包即可使用该方法,或者也可以在Hook到API后加入木马功能,反向连接指定的主机或者监听某一端口,还有许多加壳也是用该原理来隐藏IAT表,填入自己的函数地址。

Rust实战:通过DLL注入与IAT Hook技术拦截Windows API调用 本文详细介绍了如何使用Rust语言实现Windows平台下的DLL注入与IAT Hook技术,以拦截并修改目标进程对特定API(如MessageBoxW)的调用。通过实战代码解析,阐述了Rust在系统编程中的内存安全优势、DLL入口点编写、IAT遍历与地址替换原理,以及远程线程注入的具体步骤,为开发者提供了一套安全、高效的API拦截解决方案。 阅读详情

相关推荐

Windows进程隐藏技术:基于API Hook的用户态实现与原理剖析

在Windows系统编程中,API Hook(应用程序编程接口挂钩)是一种重要的技术手段,它允许开发者拦截和修改函数调用,从而改变程序行为或扩展系统功能。其核心原理是通过修改目标函数入口处的指令,将执行流重定向到自定义的钩子函数,在完成特定处理后再返回原函数或直接返回修改结果。这项技术在软件安全、系统监控、调试工具等领域具有重要价值,例如可用于开发行为分析工具、性能监控软件或沙箱环境。通过挂钩关键的系统API,开发者能够深入理解Windows内核与用户态的交互机制,掌握进程管理、内存操作等底层知识。本文以进

weixin_33794672的博客 363

History API(vue-router模拟前置知识)

History API 模拟vue-router的history模式的实践时,需要用到 History API 的知识。 history window.history对象是一个只读属性。 提供了操作浏览器会话历史(浏览器地址栏中访问的页面,以及当前页面中通过框架加载的页面)的接口。 history.go history.back history.forward history.pushState history.replaceState 提供了会话历史的信息 history.length 会话历史

皮蛋很白的博客 1409

深入解析Windows与Linux下的Hook技术:从API劫持到LD_PRELOAD实战

本文深入解析了Windows与Linux平台下的Hook技术原理与实战应用。在Windows中,通过API劫持与DLL注入实现函数调用拦截;在Linux下,则利用LD_PRELOAD环境变量优雅地劫持动态库函数。文章对比了两种技术的实现层级、复杂度与应用场景,为软件调试、行为监控与系统扩展提供了实用指南。

weixin_29275257的博客 426

Windows下API Hook 技术

1 前言 在Micrisoft Windows中, 每个进程都有自己的私有地址空间。当我们用指针来引用内存的时候,指针的值表示的是进程自己的自制空间的一个内存地址。进程不能创建一个指针来引用属于其他进程的内存。 独立的地址控件对开发人员和用户来说都是非常有利的。对开发人员来说,系统更有可能捕获错误的内存读\写。对用户而言, 操作系统变得更加健...

weixin_30298497的博客 448

深入解读Windows API挂接与Hook技术实践

以上实例和分析展示了API Hook技术在游戏和软件开发中的广泛应用和显著效果,同时也强调了在使用时需谨慎对待,确保技术的合法合规应用,并关注其带来的潜在风险。随着技术的不断进步,我们期待API Hook技术能够在更多领域带来创新和便利。

weixin_42405592的博客 1294

multisim14.3无法访问数据库...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 4462

Windows下Hook API 技术(HOOK SEND)

Windows下HookAPI技术 什么叫HookAPI?所谓Hook就是钩子的意思,而API是指Windows开放给程序员的编程接口,使得在用户级别下可以对操作系统进行控制,也就是...

weixin_33749242的博客 684

uniapp - 如何跟内嵌 web-view 组件内的网页交互,与 web-view 内嵌网页进行双向通信(uniapp 与 webview 网页之间的 “相互“ 传值)提供详细的示例代码及解决方案

uni-app如何实现在H5环境中与web-view中的网页交互通讯uniappuni-app 与 web-view内嵌网页 双向通信 如何跟内嵌web-view交互uniappAPP与webview子页面交互uniappAPP与webview子页面交互关于uni-app 使用 web-view 页面之间互相跳转、通信等问题uniapp的web-view嵌入网页,网页与uniapp通信webview如何与uniapp写的H5页面交互嵌套webview调用uniapp各种API组件实现H5和app通讯和交互

✅ 精选推荐文章 1万+

Windows下Hook API技术小结 (转)

Windows下Hook API技术小结 (转) 发布时间:2015-4-1 10:48:05编辑:www.fx114.net 分享查询网我要评论 本篇文章主要介绍了"Windows下Hook API技术小结 (转)",主要涉及到Windows下Hook API技术小结 (转)方面的内容,对于Windows下Hook API技术小结 (转)感兴趣的同学可以参考一下。

xingzheouc的专栏 641

PCL:SAC-IA+ICP配准

【代码】SAC-IA+ICP配准。

m0_71596228的博客 1018

redhawk:avgTW maxTW minTW minWC的区别

分析dynamic ir drop报告时会遇到这几个值,avgTW maxTW minTW minWC,如下图。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 694

Windows下Hook API技术 inline hook

  什么叫Hook API?所谓Hook就是钩子的意思,而API是指 Windows开放给程序员的编程接口,使得在用户级别下可以对操作系统进行控制,也就是一般的应用程序都需要调用API来完成某些功能, Hook API的意思就是在这些应用程序调用真正的系统API前可以先被截获,从而进行一些处理再调用真正的API来完成功能。在讲Hook API之 前先来看一下如何Hook消息,例如Hook全局键盘消

zhuerhua的专栏 1249

学Simulink——基于故障诊断与容错控制的场景实例:并网逆变器在短路故障下的动态响应及恢复策略

本文详细介绍了使用Simulink进行并网逆变器短路故障模拟与保护策略设计的方法。通过构建高精度逆变器模型,模拟IGBT击穿和桥臂直通故障,分析动态响应特性。重点设计了基于Stateflow的微秒级快速保护逻辑,包括过流检测、PWM闭锁和故障报警。同时提出完整的恢复策略流程,涵盖放电、去磁、自检和软启动等关键步骤。仿真结果表明,该方法能在200μs内有效限制短路电流,保护器件安全,并实现系统可靠恢复。文章还探讨了硬件保护协同、多级保护和预测保护等高级策略,为新能源系统的安全运行提供了重要参考。

amy_mhd的博客 143

Hook技术第一讲,之Hook Windows API

一丶什么是Hook,以及Hook能干啥 首先这一个小标题主要介绍神马是Hook,如果知道的,则不用看了. 这里我偷袭啊懒,贴出Hook的意思https://blog.youkuaiyun.com/qq_34573534/article/details/103702378 Hook,英文单词中成为钩子,铁钩的意思,在我们编程中就是挂钩的意思。 我们要Hook Api,则是要把这个API进行挂钩,让其...

qq_34573534的博客 936

AI Agent的知识蒸馏链:多阶段LLM模型优化

随着大语言模型(LLM)规模的不断扩大,如何在保持模型性能的同时提高其部署效率成为关键挑战。本文旨在探讨通过知识蒸馏技术构建多阶段优化链,实现LLM模型的高效压缩和性能优化。研究范围涵盖从基础理论到实际应用的完整知识蒸馏流程,特别关注AI Agent场景下的特殊需求和解决方案。本文首先介绍知识蒸馏的基本概念和背景,然后详细阐述多阶段蒸馏链的核心原理。接着,我们将深入探讨算法实现细节和数学模型,提供完整的代码示例。最后讨论实际应用、工具资源和未来发展方向。

AI大模型应用之禅 352

AI应用架构师进阶:智能控制系统架构的多Agent设计

本文将从“AI应用架构师”的视角,系统讲解智能控制系统中多Agent架构的设计方法。理解多Agent系统的核心特性与在智能控制场景中的优势;掌握多Agent架构的设计流程:从需求分析到角色划分、通信设计、决策实现;通过实战案例(智能家居控制场景),手把手带你落地一个多Agent智能控制系统;探讨进阶话题:动态Agent组织、安全性设计、与大语言模型(LLM)的融合等。在多Agent系统中,Agent(智能体)是具备自主决策能力的最小执行单元。

小程序开发 1086

Windows下Hook API技术(hook send)

什么叫Hook API?所谓Hook就是钩子的意思,而API是指Windows开放给程序员的编程接口,使得在用户级别下可以对操作系统进行控制,也就是一般的应用程序都需要调用API来完成某些功能,Hook API的意思就是在这些应用程序调用真正的系统API前可以先被截获,从而进行一些处理再调用真正的API来完成功能。在讲Hook API之前先来看一下如何Hook消息,例如Hook全局键盘消息,从而可

zbc_vc的专栏 3611

通过Python实现物联网金橙子自动打标

对于自家公司使用金橙子打标卡时,为了与生产线或者PLC联动等,往往需要对金橙子打标卡进行二次开发,而在二次开发中不得不涉及到MarkEzd.dll这个文件,而这个dll文件网上版本多不说,一般都没法直接使用,最后还不得不花大价钱购买专用库。而本文针对这个问题,涉法通过python来绕过MarkEzd.dll文件,直接进行自动化控制EzCad来实现联动,可应用于实际生产。文章最后拓展一下以物联网的形式,实现手机平台等登录网页,输入想要的印字内容后,远程打印的案例。

lylelo的博客 3365

有关Windows平台下Hook一些系统API技术方案的考虑

生病并调养近半年了,也好久没有写博文了,真是有些抱歉,总有心有余力不足的感觉。最近,遇到一种使用情形,需要覆盖Windows系统API的默认行为,而且可能不光涉及到Win32 x86,x64,可能还要涉及到wince平台。本文只是一个简要的技术介绍,有兴趣的朋友可以一步步摸索下去。首先是Win32 x86/x64下边,比如,我要覆盖'MessageBoxA'的调用(e.g.只是举例,实际可能更复杂

iihero@优快云 3280

IEM模型,地表粗糙度模拟

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

逆向实用干货分享,Hook技术第一讲,之Hook Windows API

             逆向实用干货分享,Hook技术第一讲,之Hook Windows API 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶什么是Hook,以及Hook能干啥 首先这一个小标题主要介绍神马是Hook,如果知道的,则不用看了. 这里我偷袭啊懒,贴出Hook的意思https://ba...

weixin_30247781的博客 279

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

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

上一篇: 详谈HOOK API的技术
下一篇: 什么是“跨进程 API Hook”?
killcpp
博客等级 码龄20年 13粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值