中转inline hook,不需要恢复首字节的hook

Windows内核驱动开发实战:环境搭建、API体系与安全防御 Windows内核驱动开发是系统底层编程的高阶领域,驱动运行在CPU最高特权级,直接控制硬件、内存与关键系统对象。内核驱动的构建依赖WDK与Visual Studio的版本对齐,并通过测试签名模式完成加载验证。驱动安装并非简单的文件复制,而是经服务控制管理器(SCM)与INF文件协同注册,理解DriverEntry、IRP派遣函数与DriverUnload的生命周期时序,是设备通信的基石。内核API体系涵盖内存管理、进程线程上下文、对象管理与回调注册等类别,ExAllocatePool2的使用规范与PsLo 阅读详情

中转inline hook,不需要恢复首字节的hook

分类: HOOK   446人阅读  评论(1)  收藏  举报

注:我实验的环境:win7 x64

经验证XP会有稍微区别,主要是我本次实验HOOK的API, 从XP到WIN7微软有了些许改变。

----------------------------------------------------------------------------------------------------------------------------------------

最近在看驱动教程时,从前人的HOOK得到启发,才有了本篇文章,在此甚是感激。

文章估计有些长,当是我的学习笔记了,适合有一定HOOK基础的盆友,

我写这篇文章的目的就是为了提高HOOK的效率。

本次我以HOOK GetProcAddress为例。

例子VS2010工程HookGetProcAddressTest.rar下载地址:

http://download.youkuaiyun.com/detail/friendan/8454859

--------------------------------------------------------------------------------------------------------------------------------

问题的提出:

以前我们HOOK时,第一步就是定义我们自己假的API了,如:

  1. FARPROC WINAPI MyGetProcAddress(  
  2.     __in HMODULE hModule,  
  3.     __in LPCSTR lpProcName  
  4.     );  

在我们假的API中,一般做法如下:

  1. FARPROC WINAPI MyGetProcAddress(__in HMODULE hModule, __in LPCSTR lpProcName)  
  2. {  
  3.     // 1.记录参数  
  4.     // 2.修改参数  
  5.     // 3.修改返回值  
  6.     // 4.恢复HOOK,调用原函数,然后再HOOK  
  7.     // ...  
  8. }  

问题就出在第4步了,如果是多线程的环境,在恢复HOOK时,我们可能会漏HOOK

-----------------------------------------------------------------------------------------------------------------------------------------------------

问题的解决:

       为了不恢复HOOK,也能调用原API,我加了一个中转函数,该函数没有参数,也没有返回值,

没有参数和没有返回值是为了保持堆栈的平衡,该函数声明如下:

  1. void GetProcAddressProxy(void);  

实现如下:

  1. __declspec(naked) void GetProcAddressProxy(void)  
  2. {  
  3.     // 先执行原来的代码,再跳到原地址+5处执行  
  4.     __asm  
  5.     {  
  6.         // 原函数入口代码  
  7.         mov edi,edi  
  8.         push ebp  
  9.         mov ebp,esp  
  10.   
  11.         // 调用我们的过滤函数  
  12.         push [ebp+0xC]  // 参数lpProcName  
  13.         push [ebp+0x8]  // 参数hModule  
  14.         call MyGetProcAddress  
  15.           
  16.         // 跳到原函数首地址+5处执行,因为其前面的5字节已经被我们修改了  
  17.         mov eax, g_iOldGetProcAddress  
  18.         add eax, 5  
  19.         jmp eax  
  20.     }  
  21. }  

可以看出在中转函数中调用了我们的过滤函数即假API了,本次实验,我的假API主要功能为替换参数和替换返回值,

主要代码如下:

  1. FARPROC WINAPI MyGetProcAddress(__in HMODULE hModule, __in LPCSTR lpProcName)  
  2. {  
  3.     printf("MyGetProcAddress: hModule=0x%X, lpProcName=%s \n", hModule, lpProcName);  
  4.   
  5.     // 如果是Sleep,我们将其替换成不存在的一个函数  
  6.     if (strcmp(lpProcName, "Sleep") == 0)  
  7.     {  
  8.         DisabeMemoryProtect((int)lpProcName, strlen(lpProcName));  
  9.         strcpy((char*)lpProcName, "Slee8"); // 函数名不能比原来的长哈  
  10.         EnableMemoryProtect((int)lpProcName, strlen(lpProcName));  
  11.     }  
  12.   
  13.     // 如果是要过滤的函数  
  14.     if (strcmp(lpProcName, "LoadLibraryW") == 0)  
  15.     {  
  16.         // 获取KernelBa.GetProcAddress入口地址  
  17.         // 7564122F  - FF25 280B6475   jmp dword ptr ds:[<&API-MS-Win-Core-LibraryLoader-L1-1-0.GetProcAd>; KernelBa.GetProcAddress  
  18.         // win7 64  
  19.         if (*(byte*)(g_iOldGetProcAddress+6) == 0xEB)  
  20.         {  
  21.             g_iGetProcAddressHookAddr = g_iOldGetProcAddress + 15;  
  22.             g_iGetProcAddressHookAddr = *(int*)g_iGetProcAddressHookAddr;  
  23.             g_iGetProcAddressHookAddr = *(int*)g_iGetProcAddressHookAddr;  
  24.         }  
  25.         // xp  
  26.         if (*(byte*)(g_iOldGetProcAddress+6) == 0x51)  
  27.         {  
  28.              g_iGetProcAddressHookAddr = g_iOldGetProcAddress;  
  29.         }  
  30.   
  31.         // 从函数入口寻找特征码,找到要替换的起始地址  
  32.        /*76121E83   8B45 0C         mov eax,dword ptr ss:[ebp+0xC]  ;获取到的函数地址  
  33.         76121E86    5F              pop edi 
  34.         76121E87    5B              pop ebx 
  35.         76121E88    C9              leave 
  36.         76121E89 >  C2 0800         retn 0x8 ; 返回用户层 
  37.         76121E8C    CC              int3 
  38.         76121E8D    CC              int3 
  39.         76121E8E    CC              int3 
  40.         76121E8F    CC              int3 
  41.         76121E90    CC              int3*/  
  42.         byte bSpecialCode[9] = {0x8B, 0x45, 0x0C, 0x5F, 0x5B, 0xC9, 0xC2, 0x08, 0x00};  
  43.         g_iGetProcAddressHookAddr = FindSpecialCode(g_iGetProcAddressHookAddr, bSpecialCode, sizeof(bSpecialCode));  
  44.         if (g_iGetProcAddressHookAddr <= 0)  
  45.         {  
  46.             return 0;  
  47.         }  
  48.         //ShowMemoryData(g_iGetProcAddressHookAddr, 14);  
  49.   
  50.         // 旧函数的尾部代码  
  51.         byte bOldCode[14] = {0x8B, 0x45, 0x0C, 0x5F, 0x5B, 0xC9, 0xC2, 0x08, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC};  
  52.   
  53.         // 替换原来的0x8B, 0x45, 0x0C,即替换mov eax,dword ptr ss:[ebp+0xC]  
  54.         // 76071242    B8 78563412     mov eax,0x12345678  
  55.         byte bNewCode[11] = {0xB8, 0x90, 0x90, 0x90, 0x90, 0x5F, 0x5B, 0xC9, 0xC2, 0x08, 0x00};   
  56.   
  57.         DisabeMemoryProtect(g_iGetProcAddressHookAddr, sizeof(bNewCode));  
  58.         memcpy((void*)g_iGetProcAddressHookAddr, bNewCode, sizeof(bNewCode));  
  59.         *(int*)(g_iGetProcAddressHookAddr + 1) = (int)LoadLibraryI;     // 将4个0x90替换成我们的函数地址  
  60.         g_bIsModifyGetProcAddressHookAddr = true;  
  61.         EnableMemoryProtect(g_iGetProcAddressHookAddr, sizeof(bNewCode));  
  62.        // ShowMemoryData(g_iGetProcAddressHookAddr, 14);  
  63.     }  
  64.     else  
  65.     {  
  66.         // 恢复被我们修改过的指令  
  67.         // 旧函数的尾部代码  
  68.         byte bOldCode[14] = {0x8B, 0x45, 0x0C, 0x5F, 0x5B, 0xC9, 0xC2, 0x08, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC};  
  69.         if (g_bIsModifyGetProcAddressHookAddr)  
  70.         {  
  71.             DisabeMemoryProtect(g_iGetProcAddressHookAddr, sizeof(bOldCode));  
  72.             memcpy((void*)(g_iGetProcAddressHookAddr), bOldCode, sizeof(bOldCode));  
  73.             g_bIsModifyGetProcAddressHookAddr = false;  
  74.             EnableMemoryProtect(g_iGetProcAddressHookAddr, sizeof(bOldCode));  
  75.         }  
  76.     }  
  77.       
  78.     return 0;  
  79. }  

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

在HOOK时,我们让原API跳到我们的中转函数即可,我HOOK的实现代码如下:

  1. void HookGetProcAddress(bool bIsHook)  
  2. {  
  3.     // 为方便OD调试,加入的特征码  
  4.     __asm  
  5.     {  
  6.         mov eax, eax  
  7.         mov ebx, ebx  
  8.         mov ecx, ecx  
  9.     }  
  10.   
  11.     // HOOK GetProcAddress  
  12.     if (bIsHook)  
  13.     {  
  14.         // 取GetProcAddress地址  
  15.         g_iOldGetProcAddress = (int)GetProcAddress(LoadLibrary(_T("Kernel32.dll")), "GetProcAddress");  
  16.         if (g_iOldGetProcAddress <= 0)  
  17.         {  
  18.             return;  
  19.         }  
  20.   
  21.         // 修改函数前5个字节,使其跳到我们的函数GetProcAddressProxy  
  22.         DisabeMemoryProtect(g_iOldGetProcAddress, 5);  
  23.         int iJmpAddr = (int)GetProcAddressProxy - g_iOldGetProcAddress - 5;  
  24.         *(byte *)g_iOldGetProcAddress = 0xE9; // jmp  
  25.         *(int *)(g_iOldGetProcAddress + 1) = iJmpAddr;   
  26.         EnableMemoryProtect(g_iOldGetProcAddress, 5);  
  27.     }  
  28.   
  29.     // UNHOOK GetProcAddress  
  30.     if (!bIsHook && g_iOldGetProcAddress > 0)  
  31.     {  
  32.         // 恢复函数前5个字节  
  33.         // 8B FF 55 8B EC  
  34.         byte bBeginCode[5] = {0x8B,0xFF, 0x55, 0x8B, 0xEC};  
  35.         DisabeMemoryProtect(g_iOldGetProcAddress, sizeof(bBeginCode));  
  36.         memcpy((void*)g_iOldGetProcAddress, bBeginCode, sizeof(bBeginCode));  
  37.         EnableMemoryProtect(g_iOldGetProcAddress, sizeof(bBeginCode));  
  38.   
  39.         // 恢复被我们修改过的指令  
  40.         // 旧函数的尾部代码  
  41.         byte bOldCode[14] = {0x8B, 0x45, 0x0C, 0x5F, 0x5B, 0xC9, 0xC2, 0x08, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC};  
  42.         if (g_bIsModifyGetProcAddressHookAddr)  
  43.         {  
  44.             DisabeMemoryProtect(g_iGetProcAddressHookAddr, sizeof(bOldCode));  
  45.             memcpy((void*)(g_iGetProcAddressHookAddr), bOldCode, sizeof(bOldCode));  
  46.             g_bIsModifyGetProcAddressHookAddr = false;  
  47.             EnableMemoryProtect(g_iGetProcAddressHookAddr, sizeof(bOldCode));  
  48.         }  
  49.     }  
  50. }  

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------


效果截图如下:


-------------------------------------------------------------------------------------------------------------------------------------------------

帖下我在WIN7 X64使用OD得出GetProcAddress的反汇编代码:

// bp Kernel32.GetProcAddress
75641222 >  8BFF            mov edi,edi     ; GetProcAddresss入口
75641224    55              push ebp
75641225    8BEC            mov ebp,esp
75641227    5D              pop ebp
75641228    EB 05           jmp X<jmp.&API-MS-Win-Core-LibraryLoader-L1-1-0.GetProcAddress>
7564122A    90              nop
7564122B    90              nop
7564122C    90              nop
7564122D    90              nop
7564122E    90              nop
7564122F  - FF25 280B6475   jmp dword ptr ds:[<&API-MS-Win-Core-LibraryLoader-L1-1-0.GetProcAd>; KernelBa.GetProcAddress
75641235    90              nop
75641236    90              nop

76121E15 >  8BFF            mov edi,edi ; KernelBa.GetProcAddress入口地址
76121E17    55              push ebp
76121E18    8BEC            mov ebp,esp
76121E1A    51              push ecx
76121E1B    51              push ecx
76121E1C    53              push ebx
76121E1D    57              push edi
76121E1E    8B7D 0C         mov edi,dword ptr ss:[ebp+0xC]
76121E21    BB FFFF0000     mov ebx,0xFFFF
76121E26    3BFB            cmp edi,ebx
76121E28    76 17           jbe XKernelBa.76121E41
76121E2A    57              push edi
76121E2B    8D45 F8         lea eax,dword ptr ss:[ebp-0x8]
76121E2E    50              push eax
76121E2F    FF15 AC121176   call dword ptr ds:[<&ntdll.RtlInitString>]                         ; ntdll_1a.RtlInitString
76121E35    8D45 0C         lea eax,dword ptr ss:[ebp+0xC]
76121E38    50              push eax
76121E39    6A 00           push 0x0
76121E3B    8D45 F8         lea eax,dword ptr ss:[ebp-0x8]
76121E3E    50              push eax
76121E3F    EB 07           jmp XKernelBa.76121E48
76121E41    8D45 0C         lea eax,dword ptr ss:[ebp+0xC]
76121E44    50              push eax
76121E45    57              push edi
76121E46    6A 00           push 0x0
76121E48    6A 00           push 0x0
76121E4A    FF75 08         push dword ptr ss:[ebp+0x8]
76121E4D    E8 C05E0200     call KernelBa.76147D12
76121E52    50              push eax
76121E53    FF15 A8121176   call dword ptr ds:[<&ntdll.LdrGetProcedureAddress>]                ; ntdll_1a.LdrGetProcedureAddress
76121E59    85C0            test eax,eax
76121E5B    7D 0A           jge XKernelBa.76121E67
76121E5D    50              push eax
76121E5E    E8 1F590200     call KernelBa.76147782
76121E63    33C0            xor eax,eax
76121E65    EB 1F           jmp XKernelBa.76121E86
76121E67    6A 00           push 0x0
76121E69    FF75 08         push dword ptr ss:[ebp+0x8]
76121E6C    E8 A15E0200     call KernelBa.76147D12
76121E71    3945 0C         cmp dword ptr ss:[ebp+0xC],eax
76121E74    75 0D           jnz XKernelBa.76121E83
76121E76    3BDF            cmp ebx,edi
76121E78    1BC0            sbb eax,eax
76121E7A    F7D8            neg eax
76121E7C    05 380100C0     add eax,0xC0000138
76121E81  ^ EB DA           jmp XKernelBa.76121E5D
76121E83    8B45 0C         mov eax,dword ptr ss:[ebp+0xC];获取到的函数地址
76121E86    5F              pop edi
76121E87    5B              pop ebx
76121E88    C9              leave
76121E89 >  C2 0800         retn 0x8 ; 返回用户层
76121E8C    CC              int3
76121E8D    CC              int3
76121E8E    CC              int3
76121E8F    CC              int3
76121E90    CC              int3
---------------------------------------------------------------------------------------------------------------------------------------------

帖下我在XP使用OD得出GetProcAddress的反汇编代码:
7C80AE40 >  8BFF            MOV     EDI, EDI                         ; kernel32.7C800000
7C80AE42    55              PUSH    EBP
7C80AE43    8BEC            MOV     EBP, ESP
7C80AE45    51              PUSH    ECX
7C80AE46    51              PUSH    ECX
7C80AE47    53              PUSH    EBX
7C80AE48    57              PUSH    EDI
7C80AE49    8B7D 0C         MOV     EDI, DWORD PTR SS:[EBP+0xC]
7C80AE4C    BB FFFF0000     MOV     EBX, 0xFFFF
7C80AE51    3BFB            CMP     EDI, EBX
7C80AE53  ^ 0F86 D1F2FFFF   JBE     kernel32.7C80A12A
7C80AE59    57              PUSH    EDI
7C80AE5A    8D45 F8         LEA     EAX, DWORD PTR SS:[EBP-0x8]
7C80AE5D    50              PUSH    EAX
7C80AE5E    FF15 9412807C   CALL    NEAR DWORD PTR DS:[<&ntdll.RtlIn>; ntdll.RtlInitString
7C80AE64    8D45 0C         LEA     EAX, DWORD PTR SS:[EBP+0xC]
7C80AE67    50              PUSH    EAX
7C80AE68    6A 00           PUSH    0x0
7C80AE6A    8D45 F8         LEA     EAX, DWORD PTR SS:[EBP-0x8]
7C80AE6D    50              PUSH    EAX
7C80AE6E    6A 00           PUSH    0x0
7C80AE70    FF75 08         PUSH    DWORD PTR SS:[EBP+0x8]
7C80AE73    E8 1CEBFFFF     CALL    kernel32.7C809994
7C80AE78    50              PUSH    EAX
7C80AE79    E8 B7FFFFFF     CALL    <JMP.&ntdll.LdrGetProcedureAddre>
7C80AE7E    85C0            TEST    EAX, EAX
7C80AE80    0F8C F6840000   JL      kernel32.7C81337C
7C80AE86    6A 00           PUSH    0x0
7C80AE88    FF75 08         PUSH    DWORD PTR SS:[EBP+0x8]
7C80AE8B    E8 04EBFFFF     CALL    kernel32.7C809994
7C80AE90    3945 0C         CMP     DWORD PTR SS:[EBP+0xC], EAX
7C80AE93    0F84 B65F0300   JE      kernel32.7C840E4F
7C80AE99    8B45 0C         MOV     EAX, DWORD PTR SS:[EBP+0xC]
7C80AE9C    5F              POP     EDI
7C80AE9D    5B              POP     EBX
7C80AE9E    C9              LEAVE
7C80AE9F    C2 0800         RETN    0x8 ; 函数之后的数据和WIN7不一样
7C80AEA2    837D 10 00      CMP     DWORD PTR SS:[EBP+0x10], 0x0
7C80AEA6  ^ 0F85 07E5FFFF   JNZ     kernel32.7C8093B3
7C80AEAC    33FF            XOR     EDI, EDI
7C80AEAE  ^ E9 07E5FFFF     JMP     kernel32.7C8093BA

简单linux 下 x64任意地址的inlinehook 相对主流工具frida,更加快速的inlinehook,代码简单,可以针对性进行修改 阅读详情

相关推荐

利用SEH和INT3实现API HOOK.rar

利用SEH和INT3实现API HOOK.rar

Window Hook 技术详解

Hook简介 微软的MSDN中,对Hook的解释为: A hook is a point in the system message-handling mechanism where an application can install a subroutine to monitor the message traffic in the system and process certain

cx1990820的专栏 8691

基于物联网技术智慧园林绿化养护管理信息平台

近几年来,随着经济不断的发展,城市面积不断的扩大,城市管理中的园林绿化工作也在这种趋势下不断的发生着深刻改变。管养企业是否按制定的管养计划严格执行?绿化事件整改是否及时到位?绿地面积是否在稳步增长?管养的效果如何?如何客观评价管养企业的管养工作?这些都是我们各级管理者需要面对的问题。   智慧园林绿化养护管理信息平台的开发思路以“考核”为核心,整个信息平台体现出“新、快、高、全、享”五个特点。   智慧园林绿化养护管理信息平台的整个开发理念为:依托五大技术手段(全球卫星定位系统技术、地理信...

Cesium的博客QQ2252224326 2459

利用HOOK API做进程保护器

其实就很简单,只是对TerminateProcess的HOOK,因为要阻止的不是本进程的,所以要用到全局钩子,也就是把他做成dll形式的! 首先,对前面的HOOK API进行封装CAPIHook:   [cpp] view plain copy /////////////////////////////////////////////////////////   // APIHook...

bruce135lee的专栏 2026

STM32硬件SPI调试ADS1256的3个致命坑,CubeMX配置避坑指南

本文深入解析STM32硬件SPI调试ADS1256高精度ADC芯片时常见的3大配置陷阱,包括SPI时钟频率、时钟极性与相位、数据字节序等关键问题。通过CubeMX实战配置指南和实测数据对比,提供稳定可靠的解决方案,帮助开发者避免常见错误,提升采样精度和系统稳定性。

weixin_42550597的博客 346

二元交叉熵:分类模型概率校准的数学根基

二元交叉熵(BCE)是二分类任务中实现概率校准的核心损失函数,其本质源于最大似然估计与KL散度,确保模型输出具备真实可解释的概率意义。相比均方误差(MSE)或Hinge Loss,BCE强制优化预测分布与真实伯努利分布之间的信息差异,使p=0.8真正对应约80%的正例发生率,支撑风控、医疗、推荐等高信度场景的阈值决策。它不只影响训练收敛,更决定部署后概率的业务可信度——这正是Focal Loss等变体无法替代其基础地位的根本原因。理解BCE,就是理解分类模型如何从‘打分器’进化为‘概率契约签署者’。

congli3478的博客 1333

Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API

  最近在研究Windows Ring3上的API Hook,对HOOK导入表这种方法进行了研究。HOOK导入表所用的C++类大同小异,不同的就是如何实现HOOK一个延迟加载的模块中的函数,以及FreeLibaray某个函数之后再次LoadLibaray加载这个模块所导致的模块基地址不同的时候,这时该如何HOOK住这个模块中的API。  显然地,挂钩LoadLibarayA/W、LoadLibar...

weixin_30641465的博客 246

74.9008深度刷机原理|高通QPST/Firehose底层刷写协议详解

移动设备刷机与底层维修技术指南 本文为移动设备维修人员和高级玩家提供全面的刷机与底层维修技术指南,涵盖高通、联发科和苹果A系列芯片的主要操作。 主要内容 核心操作:Bootloader解锁、Fastboot刷写、EDL深度修复、iTunes DFU模式恢复和分区表重建 适用场景:系统故障修复、底层损坏恢复、安全限制解除、系统降级和深度硬件维修 关键技术:详细解析刷机协议栈层级、关键分区作用和刷机安全机制 操作步骤: 环境搭建与驱动安装 Bootloader解锁(以小米为例) 高通机型系统刷写 苹果设备DFU

2601_95651806的博客 205

DLL注入的几种姿势(一):Windows Hooks

DLL注入的目的是将代码放进另一个进程的地址空间中,所以要怎样才能实现DLL注入呢? 其实在Windows中有好几种方法可以实现,这里我们首先尝试通过“SetWindowsHookEx”创建钩子(hooks)来实现。另外如果你对这方面很感兴趣,可以参考文章最底下的相关文献,这些文献包含大量的代码以及其他有用的信息。 WindowsHooks 首先我们需要理解Windows的hook机制和API函数SetWindowsHookEx。Hook机制允许应用程序截获处理窗口消息或特定事件。而钩子又可以分为..

翻肚鱼儿的博客 2078

逆向分析顶象5代各类验证码类型的图片还原方法(附源码)

6.刷新滑块验证码图片,会进入之前的for循环断点,分析此处的代码会发现,该循环循环了处理了n字符串的值,取出n字符中的值并使用charCodeAt生成Unicode 编码,然后又调用了a函数,如果a函数返回true就会把之前生成的Unicode编码+1,a函数参数分别是c数组和Unicode取余32后的值,然后再把Unicode取余32后的值push进c数组,这里的n值为滑块碎片背景图的name。2.搜索"ranges":,会找到ranges赋值的地方,在此处代码断点,并点击跳过断点,结束此次调试。

老衲爱洗头的博客 1195

Vue3 - vite 项目报错:Uncaught ReferenceError: require is not defined(解决 vue3 vite 项目无法识别 require 语法导致报错)

vue3,vite,报错解决,vue3+vite报错requireisnotdefined,vue3vite引插件不识别require,老插件必须用require怎么办,vite项目插件要求使用require引入但报错,vue3不兼容require导致第三方包插件无法使用,vue3vite中使用require报错怎么办,解决Vite+vue3使用第三方依赖报错“requireisnotdefined”问题,vite项目require语法兼容问题解决requireisnotdefine

🏆 前端领域优质创作者 2万+

Windows Hook 易核心编程(4) API Hook 续 拦截API

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

ywbhnay的专栏 2327

RK3588开发笔记-Hailo AI模块调试

本文详细介绍了在RK3588开发板上调试HailoAI模块的全过程。首先概述了RK3588处理器的强大性能(4核A76+4核A55,6TOPS算力)和Hailo-8 AI加速模块的特点,重点阐述了通过PCIe接口连接两者的硬件方案。调试步骤包括:确认内核PCIe配置、编译Hailo驱动、下载固件文件并部署到指定目录,最后通过运行resnet模型验证模块性能(实测FPS达2456)。文中提供了完整的软件包下载地址和GitHub源码链接,为开发者实现类似AI加速方案提供了实用参考。

flypig has a dream! 963

Hook MessageBox 进阶 跨进程Hook

转载注明出处 http://blog.youkuaiyun.com/xugangjava/article/details/7455851 以前的文章中说了 如果Hook 系统的MessageBox的函数,本文主要介绍如何Hook全局的MessageBox函数。 这里我用SetWindowsHookEx 来实现,SetWindowsHookEx最后一个参数设置为0 ,表示拦截所有进程的相关消息。

xugangjava的专栏 7010

黑猫带你学eMMC协议第22篇:emmc可靠写详解(Write Reliability)

1 前言 1.1 声明 本文依据eMMC JEDEC5.1、网络资料及个人工作经验整理而成,如有部分错误请留言。 本文部分内容可能源自网络,侵删。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 内容提要 1、什么是可靠性写属性(Write Reliability)? 2、可靠写和普通的写有什么区别? 3、设置可靠写的流程及流程框图。 4、可靠写需要遵循哪些规则? 1.3 参考链接 本文主要参考链接:http://www.up48.com/cn/support/8_37.html 2 什么

黑猫奥利奥的博客 3122

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

内核级HOOK的几种实现与应用

首页 焦点原创 安全文摘 安全工具 安全漏洞 焦点项目 焦点论坛 关于我们 添加文章 English Version  文章分类  专题文章 漏洞分析 安全配置 黑客教学 编程技术 工具介绍 火墙技术 入侵检测 破解专题 焦点公告 焦点峰会  文章推荐  LSD RPC 溢出漏洞之分析 任意用户模式下执行 ring 0 代码 IIS的NSIISLOG.

ljtt的专栏 1227

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C# Hook原理及EasyHook简易教程

前言   在说C# Hook之前,我们先来说说什么是Hook技术。相信大家都接触过外挂,不管是修改游戏客户端的也好,盗取密码的也罢,它们都是如何实现的呢?   实际上,Windows平台是基于事件驱动机制的,整个系统都是通过消息的传递来实现的。当进程有响应时(包括响应鼠标和键盘事件),则Windows会向应用程序发送一个消息给应用程序的消息队列,应用程序进而从消息队列中取出消息并发送给相应窗口进...

u014712365的博客 2264

WINCC7.3破解文件

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

linux kernel 5.0 inline hook框架

linux kernel inline hook

qq_42931917的博客 1687

使用INT3进行HOOK处理

原理:设置异常捕获,然后将需要HOOK的代码直接修改成INT3即可 用的一个关键的API:SetUnhandledExceptionFilter //异常处理函数 function MyInt3(CONST P:EXCEPTION_POINTERS):Integer;cdecl; var add:Pointer; begin OutputDebugString(PChar(inttohe

IT男也疯狂 2260

linux 进程 inline hook,Linux高级内核Inline HOOK

目前流行和成熟的kernel inline hook技术就是修改内核函数的opcode,通过写入jmp或push ret等指令跳转到新的内核函数中,从而达到高级Linux Kernel Inline Hook技术分析与实现[目录]1. 简述2. 更改offset实现跳转3. 补充4. 如何查杀5. 实例一、简述目前流行和成熟的kernel inline hook技术就是修改内核函数的opcode,...

weixin_42297810的博客 543

应用层InLine HOOK

exe程序在xp下运行需要设置的地方 // ConsoleApplication6.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <Windows.h> typedef int(__stdcall *MessageBox_type) ( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType ); MessageBox_type old_MessageBoxA; //定

Windows内核学习笔记 167

XP中Inline HOOK 8042驱动实现键盘钩子的方法

首先说说我写这个驱动的动机,说来特别搞笑。首先是QQ的Nportect有时候会搞得我的键盘按键混乱,这搞得我很郁闷。这使我对键盘产生了兴趣,但是真正让我动手写的原因却更有趣。公司有一台老机器给我们用于测试,但机器的键盘却不好用,我们只能把测试用的命令复制到文本中上传上去。如此的不便使我动手写了一个远程控制键盘的驱动,由于我不知道每个键的scancode,网上的资料又乱七八糟懒得仔细看了,所以顺编写

1987

GetProcAddress

GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。  函数原型:  FARPROC GetProcAddress(  HMODULE hModule, // DLL模块句柄  LPCSTR lpProcName // 函数名  ); 参数: hModule  [in] 包含此函数的DLL模块的句柄。LoadLibrary、AfxLoadLibrary 或者GetMo...

mpp_king的博客 8493
上一篇: 又是一个APIHOOK
下一篇: hook对应的汇编码0x8B, 0xFF,0x55,0x8B, 0xEC, // mov ebp,esp
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值