hook api技术
详解易语言的钩子(钩子HOOK与APIHOOK区别)
详解易语⾔的钩⼦(钩⼦HOOK与APIHOOK区别)在本篇内容⾥我们给⼤家详细分析了易语⾔中间的钩⼦概念以及HOOK与APIHOOK区别钩⼦原英⽂名称 Hook ,钩⼦的意思是指拦截或截获。
作⽤就是拦截程序中交互的数据,先经过我们预定的钩⼦处理接⼝程序,处理过后,再交还给原处理程序,或者⼲脆阻⽌,吃掉这些数据,让原处理程序什么也得不到。
钩⼦原来是Windows操作系统常⽤来检查系统与程序间通信的⼀些数据是否到达⽬标时⽤的,为不传之密,后来随着⼀些⾼⼿们的研究,逐渐的发现了这些秘密的技术并且公布了出来。
同时还有更多的⼈在掌握了这些技术后,⽤在⾃已的软件开发中,实现出奇招⽽超过其它同类软件的功能⽽赢得市场。
钩⼦技术的种类上很多.HOOK API和HOOK技术完全不同。
尽管它们都是钩⼦。
HOOK钩的是消息,它在系统将消息传递给应⽤程序之前截获它,然后进⾏操作、或修改消息、或停⽌消息的传递;⽽HOOK API截获的是应⽤程序对系统API的调⽤,它在应⽤程序对系统API的调⽤之前截获此调⽤动作,让其转⽽调⽤我们所定义的函数(内容可能是进⾏⼀些操作后再调⽤原系统API)。
关于HOOK技术,微软为我们提供了现成的API,有固定的使⽤步骤。
⽽对于HOOK API技术,微软并没有向我们提供类似的API,没有那么简洁的步骤可供我们参考,也许是因为微软并不希望我们⽤这样的⼿段编程,所以相对要⿇烦⼀些。
WINDOWS的钩⼦函数可以认为是WINDOWS的主要特性之⼀。
利⽤它们,您可以捕捉您⾃⼰进程或其它进程发⽣的事件。
通过“钩挂”,您可以给WINDOWS⼀个处理或过滤事件的回调函数,该函数也叫做“钩⼦函数”,当每次发⽣您感兴趣的事件时,WINDOWS都将调⽤该函数。
⼀共有两种类型的钩⼦:局部的和远程的。
局部钩⼦仅钩挂您⾃⼰进程的事件。
远程的钩⼦还可以将钩挂其它进程发⽣的事件。
远程的钩⼦⼜有两种:基于线程的它将捕获其它进程中某⼀特定线程的事件。
Windows 下 API hook 和 Windows hook 应用区别
Windows 下API hook 和Windows hook 应用区别Hook 字面的意思是钩子,但是实际上更像提供一种过滤,或者说修改消息处理,或者API的机制。
API hook什么是API的hook呢,其实就是将API调用的地方进行了转移,或者重新实现的一种技术。
这种技术不仅仅可以用在windows 上,其他OS上一样可以使用,我曾经在brew mp 上的手机开发上测试过API hook。
所以这里主要只讲windows 下的API hook。
API 的hook 基本思路都是想办法替换原来的API,使函数的调用关系,直接进行转换,典型的如下可以看到client 端要调用的FunctionA,在A进入之后,就调用了FunctionB , 在FunctionB 中回到FunctionA 做具体A应该做的事情,从A返回之后,FunctionB 然后在返回给Client,那么在FunctionB 中使用FunctionA的前后,它自己都可以干自己想要干的事情,这样就是一个API的hook, 下面我们主要讨论Windows 上最常用的两种API hook 策略。
A)IAT 替换API hook所谓的IAT (import address table ) 这个是PE文件中一个重要的部分,这里我们不详细讨论PE文件的构成,因为这个本来就可以写一张内容。
我们主要了解的是PE如何在一个已经加载在内存中的PE文件如何找到它的IAT。
(1)为什么要找IAT?一个模块,可能依赖别的API,也可能提供API,供别的模块调用,MS为了在PE文件中,分别用导入表和导出表进行描述两种关系。
导入表IAT 主要是描述了这个模块依赖那些其他模块提供的API。
而导出表EAT 是描述这个模块中都提供那些函数供别的模块调用。
如果我们在某个模块的导入表中替换它所依赖的函数,那么这样就可以实现API hook.(2)如何找IAT?要找IAT 要稍微了解一下PE文件的结构,一个PE 文件的大概长相就是这样,我们要找的IAT,就是要先找到PE文件可选头,在这个数据结构中,描述了IAT 描述的位置在那里,然后给距IAT descriptor 就可以找到IAT了。
通过DLL劫持技术HookAPI
DLL劫持技术当一个可执行文件运行时,Windows加载器将可执行模块映射到进程的地址空间中,加载器分析可执行模块的输入表,并设法找出任何需要的DLL,并将它们映射到进程的地址空间中。
由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL文件。
首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录中查找,最后是在环境变量中列出的各个目录下查找。
利用这个特点,先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL。
程序调用系统DLL时会先调用当前目录下伪造的DLL,完成相关功能后,再跳到系统DLL同名函数里执行,如图18.3所示。
这个过程用个形象的词来描述就是系统DLL被劫持(hijack)了。
图18.3 DLL劫持技术演示利用这种方法取得控制权后,可以对主程序进行补丁。
此种方法只对除kernel32.dll、ntdll.dll等核心系统库以外的DLL有效,如网络应用程序的ws2_32.dll、游戏程序中的d3d8.dll,还有大部分应用程序都调用的lpk.dll,这些DLL都可被劫持。
利用第5章5.6.2节提供的CrackMeNet.exe来演示一下如何利用劫持技术制作补丁,目标文件用Themida v1.9.2.0加壳保护。
1.补丁地址去除这个CrackMe网络验证方法参考第5章5.6.2节,将相关补丁代码存放到函数PatchProcess()里。
例如将401496h改成:00401496 EB 29 jmp short 004014C1补丁编程实现就是:unsigned char p401496[2] = {0xEB, 0x29};WriteProcessMemory(hProcess,(LPVOID)0x401496, p401496, 2, NULL);p401496这个数组的数据格式,可以用OllyDbg插件获得,或十六进制工具转换。
APIHOOK的实现原理
APIHOOK的实现原理API Hooking(API挂钩)是一种常见的软件技术,用于修改或者扩展应用程序的行为,它通过“操纵”应用程序的API调用过程来实现这一目标。
API Hooking通常用于各种目的,例如:监视应用程序的行为、修复漏洞、收集数据等。
本文将介绍API Hook的实现原理及其相关概念。
1. API Hook概述API Hooking通过劫持和修改应用程序对动态链接库(DLL)中导出函数的调用来实现目标功能。
在Windows操作系统中,每个可执行文件都会使用一些API函数,这些函数由系统提供并存储在动态链接库中。
当应用程序调用这些函数时,操作系统会在库文件中查找并执行相应的函数代码。
API Hooking就是在应用程序和DLL之间插入一个中间层,通过改变函数调用的目标,来控制和改变应用程序的行为。
API Hooking的实现原理可以归纳为以下几个步骤:(1)定位目标函数:首先,需要确定要Hook的目标函数。
可以通过静态分析程序源代码、反汇编可执行文件、监视应用程序行为等方法来获取目标函数的地址或名称。
(2)获取目标函数的原始地址:通过动态链接库(DLL)中的导入表,可以获取到目标函数的原始地址。
导入表中保存了DLL中导出函数地址的引用。
(3)Hook目标函数:Hook目标函数的方式有多种,这里介绍两种常见的方式。
a. 钩子函数(Hook Function):通过将Hook函数替换为目标函数的调用,可以劫持目标函数的执行。
Hook函数在执行之前、中间或者之后可以执行额外的逻辑操作,并返回结果给应用程序。
b. IAT Hooking(Import Address Table Hooking):IAT是动态链接库中的导入表,包含了动态链接库中导出函数的地址。
通过修改IAT中目标函数的地址,将其指向Hook函数,即可实现Hook效果。
(4)重定向函数调用:Hook目标函数后,需要将应用程序中对目标函数的调用重定向到Hook函数。
Linux API Hook
第七个字节表示操作系统标识: #define EI_OSABI 7 /* OS ABI identification */
#define ELFOSABI_NONE 0 /* UNIX System V ABI */
#define ELFOSABI_SYSV 0 /* Alias. */ #define ELFOSABI_HPUX 1 /* HP-UX */ #define ELFOSABI_NETBSD 2 /* NetBSD. */ #define ELFOSABI_LINUX 3 /* Linux. */ #define ELFOSABI_SOLARIS 6 /* Sun Solaris. */ #define ELFOSABI_AIX 7 /* IBM AIX. */ #define ELFOSABI_IRIX 8 /* SGI Irix. */ #define ELFOSABI_FREEBSD 9 /* FreeBSD. */ #define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX. */ #define ELFOSABI_MODESTO 11 /* Novell Modesto. */ #define ELFOSABI_OPENBSD 12 /* OpenBSD. */ #define ELFOSABI_ARM 97 /* ARM */ #define ELFOSABI_STANDALONE 255 /*Standalone(embedded) application */ 第八个字节表示 ABI 版本 #define EI_ABIVERSION 8 /* ABI version */ 第九个字节表示 e_ident 中从哪开始之后未使用. #define EI_PAD 9 /* Byte index of padding bytes */ e_type: 这个成员是 ELF 文件的类型: 1:表示此文件是重定位文件. 2:表示可执行文件. 3:表示此文件是一个动态连接库。
hook技术原理
Hook技术是一种用于拦截API函数调用的技术,它通过修改系统API函数的内存地址,从而拦截系统函数的调用,实现对系统API函数的拦截和修改。
Hook技术的基本原理是将系统API函数的内存地址指向一个用户定义的函数,而不是指向实际的API函数。
当调用系统API函数时,系统将调用用户定义的函数,而不是原来的函数。
这样就可以实现对系统API函数的拦截和修改。
Hook技术的实现步骤如下:
1、首先,程序员需要查找和定位需要拦截的API函数的内存地址。
2、然后,程序员需要编写用户定义的函数,用来拦截和修改系统API函数的调用。
3、接着,程序员需要将系统API函数的内存地址指向用户定义的函数,从而实现API函数的拦截。
4、最后,程序员需要将系统API函数的原始内存地址保存起来,以便在不再需要拦截时,可以恢复原来的API函数调用行为。
Hook技术是一种强大的技术,可以用来实现各种功能,比如拦截软件的调用,拦截软件的输入输出,拦截系统函数的调用等。
Hook技术也可以用来实现防病毒,反垃圾邮件,防恶意程序,实现软件保护以及实现自定义控件等功能。
陷阱式APIHook的原理及其在截取串口数据中的应用
2024/9/29
8
NewCreateFile(文件名){ 还原CreateFile; Handle = CreateFile(文件名); 修改CreateFile; if(文件名==“COM2”) 保存Handle到共享内存变量ComHandle中
}
2024/9/29
9
NewWriteFile(文件句柄,数据){ if(文件句柄=ComHandle) 修改“数据”
GetMsgProc(){ }
2
目的进程载入 DLPSLIB.dll
(寄生程序)
同步修改ReadFile跳
转到NewReadFile
NewReadFile(){ }
2024/9/29
DLPSLIB.dll
目的进程载入dll时, dll就已经成为其一
部分了
SetDIPSHook{ SetWindowsHookEx(…)
2024/9/29
6
……
调用 Call ReadFile
1
……
4
自定义函数
NewReadFile(){ 还原ReadFile 调用ReadFile 修改ReadFile
ret
}
被劫持函数 ReadFile(){
……
2
ret
3
}
2024/9/29
……
调用 Call ReadFile
1
……
9
自定义函数 NewReadFile(){
1
……
9
自定义函数 NewReadFile(){
call ShadowReadFile(); 3
}
8
ShadowyReadFile(){
影子函数
源程序程序破解之 API HOOK技术
gCallCounter ++;
}
#endif
return ret;
}
2)使用刚才提到的方法进行DLL导入
string hexData1 = toHexString((const char *)pbData, strlen((const char *)pbData));
int ret = sub_4026B0(pbData);
string hexData2 = toHexString((const char *)pbData, strlen((const char *)pbData));
gHooks.Add(_T("KERNEL32.DLL"), "DeviceIoControl", my_DeviceIoControl);
static int gCallCounter = 0;
BOOL WINAPI my_DeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize,
// 指定DLL的某个函数进行HOOK
HANDLE Add(LPCTSTR lpszModule, LPCSTR lpcFuncName, void *pNewAddr, DWORD dwData = 0);
// 给定一个函数地址进行HOOK
易语言HookAPI 技巧
易语言HookAPI 技巧易语言Hook的代码有很多,Hook的跳转代码也很简单,不多说,主要注意的有:1.可以保存原API函数的API头到自己申请的地址,Hook跳转的地址仍然是自己的子程序,但如果保存了API头,就可以call addr 实现不恢复Hook调用原函数。
.版本2.如果真(FuncAddress =0 或HookFuncAddr =0)返回(0).如果真结束hHook =VirtualAlloc (0, 14, 位或(#MEM_COMMIT, #MEM_RESERVE), #PAGE_EXECUTE_READWRITE).如果真(hHook =0)返回(0).如果真结束RtlMoveMemory_1 (hHook, 到字节集(FuncAddress), 4)JmpCode =hHook +4RtlMoveMemory (JmpCode, FuncAddress, 5)RtlMoveMemory_1 (JmpCode +5, { 233 } +到字节集(到整数(FuncAddress + 5 -JmpCode -10)), 5)VirtualProtect (FuncAddress, 5, #PAGE_EXECUTE_READWRITE, OldProtect)RtlMoveMemory_1 (FuncAddress, { 233 } +到字节集(到整数(HookFuncAddr -FuncAddress -5)), 5)VirtualProtect (FuncAddress, 5, OldProtect, 0)返回(JmpCode)2.Hook recv函数等的技巧,这类函数的特点是,某个参数是具有缓冲区性质的,并在函数调用完成后参数会直接传递数据,所以结合上面的代码,就可以这样了:ret=Call(jmpcode,para1,para2.etc)这时候,再对参数para1等进行处理,才可以获得数据3.Anti-Hook的躲避技巧,部分程序会有检测API头5字节,所以我们只需要在Hookaddr上面加上一段偏移(大于5)即可躲避。
hook api几种方法
:71A21B72 8B4508 mov eax, dword ptr [ebp+08]
:71A21B75 5F pop edi
:71A21B76 5E pop esi
:71A21B77 C9 leave
:71A21B78 C21000 ret 0010
下面用4种方法来HOOK这个API:
:71A21B62 8BD8 mov ebx, eax
:71A21B64 E8C7F6FFFF call 71A21230 //将被HOOK的机器码(第3种方法)
:71A21B69 3BDF cmp ebx, edi
:71A21B6B 5B pop ebx
:71A21B6C 0F855F940000 jne 71A2AFD1
假设我们的HOOK代码在71A20400处,那么我们把71A21B64处的CALL指令改为CALL 71A20400(原指令是这样的:CALL 71A21230)
而71A20400处的HOOK代码是这样的:
71A20400:
pushad
//在这里做你想做的事情
:71A21B42 57 push edi
:71A21B43 57 push edi
:71A21B44 FF7514 push [ebp+14]
:71A21B47 8945F0 mov dword ptr [ebp-10], eax
:71A21B4A 8B450C mov eax, dword ptr [ebp+0C]
4,上下文的问题,有些HOOK代码不能执行某些操作,否则会破坏原API的上下文,原API就失效了;
5,同步问题,在HOOK代码里尽量不使用全局变量,而使用局部变量,这样也是模块化程序的需要;
APIHook的几种实现
APIHook的⼏种实现所谓的API Hook,就是利⽤某种技术将API的调⽤转为我们⾃⼰定义的函数的调⽤。
这种技术在实际项⽬⾥⾯的应⽤也是很⼴泛的。
最近,我在做关于我们项⽬的⾃动化测试的时候,就遇到了这种情况。
在写测试代码之前,我们对测试代码有⼀些要求。
1. 不能因为测试代码⽽修改原代码。
2. 原有的模块是以dll格式输出的,在做测试的时候,要测的类和函数也只能使⽤dll的导出类或者函数,⽽不能将源⽂件重新编译。
由于这些限制,导致测试⽤例往往不能在普通的机器上运⾏。
⽐如这样⼀个函数:int func(){//Some initializing codesint hardware_code = get_hardware_code();if (is_valid_code(hardware_code)){//}//return ret;}此处,函数get_hardware_code()是与特定平台相关的,在普通PC上运⾏肯定⽆法获得正确的结果。
如果拿不到正确的结果,也就不能对函数func()进⾏测试了。
于是,我们就可以利⽤API Hook技术,在测试代码⾥⾯,把所有对get_hardware_code()的调⽤换成我们⾃定义的函数mock_get_hardware_code()的调⽤,这样,在我们⾃⼰定义的函数⾥⾯,可以返回⼀个有效的代码以保证原代码能够正确的往下执⾏。
经过研究,API Hook有这么⼏种⽅法。
1. 改写函数的⾸地址。
这个是在《Windows核⼼编程》⾥⾯⼤师提到的API Hook的⽅法之⼀。
原理就是,⾸先获得要被Hook的函数的地址(⽐如get_hardware_code()),然后将其⾸地址之后的若⼲字节(通常是5个字节)改成⼀条jmp指令,⽽jmp的⽬标地址就是⾃定义函数的地址(此处为mock_get_hardware_code())。
这样,当函数每次执⾏⽬标函数的时候,就会跳转到我们⾃定义的函数⾥⾯去。
HOOKAPI(一)——HOOK基础+一个鼠标钩子实例
HOOKAPI(⼀)——HOOK基础+⼀个⿏标钩⼦实例HOOK API (⼀)——HOOK基础+⼀个⿏标钩⼦实例code: https:///hfl15/windows_kernel_development/tree/master/demo_source_code/MouseHook0x00 起因最近在做毕业设计,有⼀个功能是需要实现对剪切板的监控和进程的防终⽌保护。
原本想从内核层实现,但没有头绪。
最后决定从调⽤层⼊⼿,即采⽤HOOK API的技术来挂钩相应的API,从⽽实现预期的功能。
在这样的需求下,就开始学习了HOOK API。
0x01什么是HOOK APIHOOK(钩⼦,挂钩)是⼀种实现Windows平台下类似于中断的机制。
HOOK机制允许应⽤程序拦截并处理Windows消息或指定事件,当指定的消息发出后,HOOK程序就可以在消息到达⽬标窗⼝之前将其捕获,从⽽得到对消息的控制权,进⽽可以对该消息进⾏处理或修改,加⼊我们所需的功能。
钩⼦按使⽤范围分,可分为线程钩⼦和系统钩⼦,其中,系统钩⼦具有相当⼤的功能,⼏乎可以实现对所有Windows消息的拦截、处理和监控。
这项技术涉及到两个重要的API,⼀个是SetWindowsHookEx,安装钩⼦;另⼀个是UnHookWindowsHookEx,卸载钩⼦。
本⽂使⽤的HOOK API技术,是指截获系统或进程对某个API函数的调⽤,使得API的执⾏流程转向我们指定的代码段,从⽽实现我们所需的功能。
Windows下的每个进程均拥有⾃⼰的地址空间,并且进程只能调⽤其地址空间内的函数,因此HOOK API尤为关键的⼀步是,设法将⾃⼰的代码段注⼊到⽬标进程中,才能进⼀步实现对该进程调⽤的API进⾏拦截。
然⽽微软并没有提供HOOK API的调⽤接⼝,这就需要开发者⾃⼰编程实现,⼤家所熟知的防毒软件、防⽕墙软件等均采⽤HOOK API实现。
⼀般来说,HOOK API由两个组成部分,即实现HOOK API的DLL⽂件,和启动注⼊的主调程序。
CC++ HOOK API(原理深入剖析之-LoadLibraryA)
Inline_Hook( _function lawfun, _function newfun )
:__InlineHOOK_Base( lawfun, newfun, args ) { hook(); }
~Inline_Hook( void ){ unhook(); }
__callfunc:
call [eax+8] // call my function .
mov ecx, dword ptr[esp] // get __InlineHOOK_Base's this pointer.
memcpy( _lawFunc, _lawByteCode, 16 );
VirtualProtect( _lawFunc, 8, dwOldFlag, &dwOldFlag );
return true;
}
_newByteCode[ 15 ] = 0;
}
memcpy( _lawByteCode, _lawFunc, 16 ); // save
}
template< typename _function, DWORD args >
struct Inline_Hook : __InlineHOOK_Base
{
// It's hooked.
if ( memcmp( _newByteCode, _lawFunc, 16 ) == 0 )
{
DWORD dwOldFlag;
VirtualProtect( _lawFunc, 8, PAGE_EXECUTE_READWRITE, &dwOldFlag );
运用Detours库hookAPI(原理是改写函数的头5个字节)
运⽤Detours库hookAPI(原理是改写函数的头5个字节)⼀、Detours库的来历及下载:Detours库类似于WTL的来历,是由 and Doug Brubacher⾃⼰开发出来,于99年7⽉发表在⼀篇名为《.》的论⽂中。
基本原理是改写函数的头5个字节(因为⼀般函数开头都是保存堆栈环境的三条指令共5个字节:8B FF 55 8B EC)为⼀条跳转指令,直接跳转到⾃⼰的函数开头,从⽽实现API拦截的。
后来得到MS的⽀持并在其⽹站上提供下载空间:⽬前最新的版本是:Detours Express 2.1。
⼆、Detours的使⽤准备:Detours库是以源码形式提供的,这给我们的使⽤带来极⼤的⽅便。
你可以选择把它编译成库、也可以直接把源码加⼊⼯程……形式使⽤。
农夫采取的⽅法是编译成库后使⽤的。
编译库的⽅法很简单,下载包中已经制作好了makefile,我们只须直接⽤vc下的nmake⼯具直接编译即可。
鉴于前段时间在⽹上看见有部分朋友对此也存疑惑,农夫在此“浪费”⼀下空间,详细解说⼀下编译的过程(括号中为本⼈的例⼦):1、运⾏你下载的安装包,把⽂件解压到磁盘上此处建议您把解压后的src⽂件夹拷贝到VC的安装⽬录的VC98⼦⽬录下(D:/SDK/6.0/VC98)。
对于像我⼀样使⽤库的⽅式会有好处,稍后即讲:)。
2、编译并设置开发环境在你刚才拷贝过去的src⽂件夹下建⽴⼀个*.bat⽂件,⾥⾯填上“../bin/nmake”内容后保存即可。
运⾏该批处理⽂件,恭喜您:库已经编译完成,唯⼀要做的是要把../bin/Detoured.dll拷贝到您的系统⽬录下。
现在您的⼯程⾥⾯包含如下⽂件即可运⽤Detours库来进⾏开发了:#include <detours.h>#pragma comment(lib, "detours.lib")#pragma comment(lib, "detoured.lib")对于没有把src⽂件拷贝过来的朋友,也不⽤着急。
什么是APIHOOK
注:System Repair Engineer API HOOK检测功能是一项高级功能,仅供参考使用。
本文档可能会在未通知的情况下予以变更。
什么是API HOOK在Windows 操作系统里面,API是指由操作系统提供功能的、由应用程序调用的函数。
这些函数在Windows操作系统里面有上千个之多,分布于不同的DLL文件里面或者EXE文件里面。
应用程序通过调用这些函数来获得一些功能的支持。
API HOOK:API HOOK技术是一种用于改变API执行结果的技术,Microsoft 自身也在Windows操作系统里面使用了这个技术,如Windows兼容模式等。
API HOOK 技术并不是计算机病毒专有技术,但是计算机病毒经常使用这个技术来达到隐藏自己的目的。
隐藏:是Rootkits各种表现形式里面的一种,也是最重要的一种。
如果一个计算机病毒实现了自我隐藏,那么99%的软件将无法发现他们,包括:资源管理器、任务管理器等。
System Repair Engineer API HOOK 检测鉴于很多计算机病毒(如灰鸽子后门程序等)采用Win32 API HOOK 技术来达到隐藏自身的目的,System Repair Engineer (SREng) 从 2.3版本开始正式提供对Win32 API HOOK 检测的支持。
System Repair Engineer API HOOK 检测功能是专门为有一定计算机知识的人设计的一个高级功能,其主要目的是警示用户系统里面的哪些API和预期值不符。
一个有经验的分析人员能够从不符的API名称里面得知潜在的危险是什么。
SREng 2.4 版本新增功能在System Repair Engineer (SREng) 2.4版本里面,增加了显示被HOOK的API是由系统中的哪一个文件来执行的。
同时增加了HOOK 安全级别判定功能,当System Repair Engineer 确认是系统自带的模块或者安全模块来执行HOOK操作的时候,System Repair Engineer会自动的降低安全警告等级到普通,否则会显示为危险。
8种hook技术_hook方式
8种hook技术_hook方式
有很多种hook技术,以下是其中一些常见的hook方式:
1. Inline hook:在应用程序执行的过程中,修改或替换指令,从而实现hook功能。
2. DLL hook:通过替换目标程序的函数地址指向自己的DLL 函数来实现hook功能。
3. VTable hook:通过修改类对象的虚函数表指针,将目标函数指针替换为自己的函数指针来实现hook功能。
4. API hook:通过劫持或替换目标程序中的API函数,从而实现hook功能。
5. System call hook:通过修改系统调用表或系统调用中断向量表,将目标系统调用指向自己的函数来实现hook功能。
6. Message hook:通过修改消息处理函数来截取和修改目标程序接收到的消息,从而实现hook功能。
7. Keyboard/Mouse hook:通过拦截和篡改键盘或鼠标事件的处理函数,实时监控和修改用户的输入。
8. Network hook:在网络层拦截和处理网络数据包,实现对网络通信的监控和修改。
Windows下APIHook技术
Windows下APIHook技术1 前⾔在Micrisoft Windows中,每个进程都有⾃⼰的私有地址空间。
当我们⽤指针来引⽤内存的时候,指针的值表⽰的是进程⾃⼰的⾃制空间的⼀个内存地址。
进程不能创建⼀个指针来引⽤属于其他进程的内存。
独⽴的地址控件对开发⼈员和⽤户来说都是⾮常有利的。
对开发⼈员来说,系统更有可能捕获错误的内存读\写。
对⽤户⽽⾔,操作系统变得更加健壮。
当然这样的健壮性也是要付出代价的,因为它使我们很难编写能够与其他进程通信的应⽤程序或对其他进程进⾏操控的应⽤程序。
在《Windows 核⼼编程》第⼆⼗⼆章《DLL注⼊和API拦截》中讲解了多种机制,他们可以将⼀个DLL注⼊到另⼀个进程地址的空间中。
⼀旦DLL代码进⼊另⼀个地址空间,那么我们就可以在那个进程中随⼼所欲了。
本⽂主要介绍了如何实现替换Windows上的API函数,实现Windows API HOOK。
API HOOK的实现⽅法⼤概不下五六种。
本位主要介绍了其中的⼀种,即如何使⽤WIndows挂钩来注⼊DLL。
2 使⽤Windows挂钩来注⼊DLL2.1 简单windows消息HOOK2.1.1 SetWindowsHookEx这个是安装狗⼦的函数声明如下:HHOOK WINAPI SetWindowsHookEx(__in int idHook, \\钩⼦类型__in HOOKPROC lpfn, \\回调函数地址__in HINSTANCE hMod, \\实例句柄__in DWORD dwThreadId); \\线程ID,0表⽰所有让我们通过⼀个例⼦来学些下这个API。
进程A(⼀个游戏改建⼯具,需要接获键盘消息),安装了WH_KEYBOARD_LL挂钩,如下所⽰:HOOK hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstDll, 0); 第⼀个参数表⽰挂钩类型,是⼀个低级键盘钩⼦。
API Hook完全手册
注:本文是根据我两年前写的一个系统行为监测程序写成(参考了一些书籍和文章)。
最近在论坛上看到有不少人在问关于API Hook的问题,便写成此文,希望能对朋友们在写API Hook代码的时候能够有所帮助。
1 基本原理API Hook是什么我就不多说了,直接进入正题。
API Hook技术主要有下面的技术难点:1.如何将自己的的代码Inject到其他进程2.如何Hook到API1.1 代码的Injection常用的方法有:1.使用注册表HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs这种方法可以指定多个DLL,用空格隔开。
这些DLL会被任何用到User32.dll的所有程序自动加载。
当User32.dll加载的时候,User32.dll的DllMain会收到一个DLL_PROCESS_ATTACH通知,User32在这个时候读取注册表项中的值,调用LoadLibrary加载各个DLL。
显然使用这种方法要求设置注册表之后立刻重起系统,不过一般情况下这不是大问题。
这种方法的主要问题在于,只有用到User32.dll的应用程序才会被Inject。
所有的GUI和少部分CUI程序会用到User32.dll,所以如果你的API Hook程序不打算监视CUI程序的话,那么可能问题并不太大。
但是如果你的API Hook程序需要监视系统中所有进程的话,这种方法的限制将是非常致命的。
2.调用SetWindowsHookEx(WH_GETMESSAGE, …, 0)可以使用SetWindowsHookEx(WH_GETMESSAGE, …, 0) 设置全局的消息钩子,虽然可能你的程序并不用到消息钩子,但是钩子的一个副作用是会将对应的DLL加载到所有的GUI线程之中。
类似的,只有用到GUI的进程才会被挂接。
虽然有这种限制,这种方法仍然是最常用的挂接进程的方法。
Api hook
API拦截(API HOOK)技术及应用常用的API Hook(截取API,或函数钩子)有两种方式:陷阱式、改引入表式。
在Windows 9x、WindowsNT/2000这两个系统中的API Hook代码完全不同。
就Windows 9x而言,16位DLL与32位DLL的API Hook代码也完全不相同。
API HOOK入门API Hook是一项有趣而实用的Windows系统编程技术,应用领域十分广泛,屏幕取词、内码转换、屏幕翻译、中文平台、网络防火墙、串口红外通信或Internet通信的监视等,都涉及到了此项技术。
API Hook就是钩住API,钩就是绕弯的意思,即让API函数的调用先绕一个弯路,在它执行之前,先做一些“预处理”,这样我们就可以监视或定制某个Win32 API的调用,以实现一些特殊的功能。
至于具体可以实现些什么样的功能,就取决于程序设计者的想象力了。
在很多情况下,想监视或改变某个应用程序的一些特定的操作,但是该应用程序却没有提供相应的接口,而又几乎不可能得到其源代码。
因为大多数Windows应用程序的操作很大程度上依赖于API,所以可以采用API Hook的方式来试图监视和改变应用程序的行为。
常用的API Hook有两种方式:陷阱式和改引入表式。
API Hook的运行平台有三种:Windows 9x的16位DLL、Windows 9x的32位DLL和Windows NT/2000的32位DLL。
其关系如表7-1所示。
表7-1 API Hook的方式其中,×表示不能实现;Ο表示只对指定模块有效,对整个进程或整个操作系统无效;―表示在VC下可以实现,在C++Builder/Delphi下很难实现;√表示可以实现。
陷井式API HOOK原理Windows NT/2000陷阱式API Hook的工作原理如图1所示。
其工作过程如下:(1)加载陷阱式API Hook时,需要定位至被截函数处(图中是BF501234),写入一条跳转指令(Jmp XXXX,二进制代码为E9XXXX),表示所有程序调用被截函数时都自动跳转到自定义函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
随本程序附带的教程是未注册版本,如果您需要详细的资料,请通过网上商城进行注册。注册费用为 320 元人民币。最终价格请以网上商城的价格为准。
10001143 52 push edx
10001144 8B45 14 mov eax, dword ptr [ebp+14]
10001147 50 push eax
10001148 8B4D 10 mov ecx, dword ptr [ebp+10]
1000114B 51 push ecx
10001118 8945 FC mov dword ptr [ebp-4], eax
1000111B 50 push eax
1000111C 68 44710010 push 10007144 ; ASCII "鎎*b"
10001121 8B75 0C mov esi, dword ptr [ebp+C]
好,现在动手钻进InterceptDll.dll的内部,看看他到底干了什么!我用的是olldbg,其实windbg也可以,我用od习惯了。先附加到我自己写的这个小explorer程序,然后在createprocess下断点,按下启动notepad的按钮,断下以后,一步一步跟踪。当进入到原先createprocess的领空的时候,入口变了
先运行一次,按下按钮后,果然explorer弹出了程序的路径。此时,你如果使用icesword类的可以查看程序模块的程序查看explorer的模块,你就会发现explorer里面多了个InterceptDll.dll的模块,当我们卸载了这个dll后,这个拦截的效果就没有了。看来这个程序的核心不是那个启动的程序,而是这个dll。现在让我们看看这个InterceptDll.dll到底做了什么。
对于程序员来讲,API拦截技术是一种重要的基础技术。这项技能为编写某些工具软件提供了可能,并可以大大提高我们对第三方应用程序的控制能力。不过,目前 API 拦截的技术资料往往局限于原理方面的论述,对于如何具体地编译一个 API 拦截程序却守口如瓶。毕竟,对于程序员来讲,当初学习这项技能花费了不少心血,如果让他们无偿地奉献出来,恐怕不太现实;另外的一个因素就是竞争,多一个人学会这项技能,就多一份竞争。我在掌握这项技能的时候,就走了不少弯路,如果当初有一份详细的资料,这些不必要的弯路是完全可以避免。而这正是我编写这份技术资料的目的。
而asm中是自己动态获得的
获得代码如下
mov hacker.a,0B8h ;mov eax,
;mov hacker.d PMyapi ;0x000000
mov hacker.d,0FFh ;jmp
mov hacker.e, 0E0h ;eax
中间有间隔
mov hacker.PMyapi,offset MyAPI ;0x000010 ;要替代API的函数地址
1000110D 83EC 0C sub esp, 0C
10001110 53 push ebx
10001111 56 push esi
10001112 57 push edi
10001113 33C0 xor eax, eax
10001115 8945 E4 mov dword ptr [ebp-1C], eax
在构建新的跳转字节是靠这段代码
BYTE btNewBytes[8]={0xB8,0xE0,0x18,0x00,0x10,0xFF,0xE0,0x00};
这个机器吗的含义是,jmp到我们自己定义的MyCreateProcessA函数处。
这里使用是固定值,只要我们稍微修改一下代码,这里就要修改,很麻烦的是,如果使用非debug版本,你找不到jmp到这个函数的直接代码,需要你自己去调试查找非常麻烦。
这样的话,完全不用考虑api的地址由程序自己来定位,由于本人vc功力不够,实在不知道如何实现这个代码,希望高手能指点一二。
第二个问题相对简单点,大家可以看见,我asm的代码中钩的是createprocessw而vc钩的是createprocessa,为什么呢?explorer实际上是调用createprocessw来启动程序的,用createprocessa是钩不住explorer启动的程序。而我在用vc写createprocessw钩子的时候,解决不了unicode的问题,因为MyCreateProcessA的特殊性,他要求跟原来的函数格式一样,所以只要我一使用WideCharToMultiByte这类的函数,返回值就出错了。而如果完全用unicode来写这个函数,我又不知道LPSTARTUPINFO这个的宽字符格式是什么?所以也请高手同样给与指点!
更为重要的是,apihook中这样的hook有很大的缺陷,为什么这么说呢?我们可以看见他是将入口修改为 jmp 100010F0
7C802332 >- E9 B9ED7F93 jmp 100010F0
我们知道一般的api函数头部是不会出现这样的远距离的jmp的,所以只要检测api的函数头一个字节是否e9就可以很轻松的检测出api是否被hook住了。还有一个问题就是,如果我们的目的并不停止于,只是在api函数处理之前修改某些入口函数或者做些处理,而是整个重新处理而不回到系统的api处理处,这个流程也不符合我们的要求。
先使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
DUMPBIN InterceptDll.dll /EXPROTS /OUT:InterceptDll.def
ordinal hint RVA name
1 0 00001230 InstallHook
因为表面上Detours可以很容易的钩住api,但是他的自由度太低了。最重要的是,他无法完成ssdt hook,还是提高自己的水平最重要。
我改出了两个版本一个是asm的一个是vc的,但是奇怪的是asm代码没有问题,而vc的代码却出了问题,我希望高手能帮我解决以下两个问题,
第一个问题:就是在vc代码中(根据王艳萍的windows程序设计代码修改)
这就引起了我的好奇,难道这个软件用了什么牛x的新技术?居然这么值钱!那得看看,于是就把该软件下载下来研究了研究。谁知道,他所用的技术不但一点创新都没有,还有着很大的局限性。于是就有了这篇文章,还希望高手不要见笑。
这个程序的原版大家自己找,名字就叫做API拦截教程。启动该程序后,按下拦截createprocess的按钮后,运行任何程序都会弹出运行程序的路径。稍微了解apihook的都了解,通常ring3下hookapi的办法有三种,一是修改程序的iat表,使api调用跳向自己的函数而不是转向api入口。二是修改api入口的机器码。三是用创建远线程CreateRemoteThread的办法来完成。那么这个教程究竟用了什么先进手法呢?
2 1 00001270 UninstallHook
只有两个导出函数,看名字就知道,一个是安装钩子,一个卸载钩子。我们调用看看 ,结果连参数都不用,只要调用InstallHook就可以把InterceptDll.dll插入explorer,用UninstallHook就可以卸载钩子。看来我们不用分析他的exe文件了,因为有用的东西就在这个dll里。那么如何分析这个dll这么工作的呢?直接用ida看静态代码,可以看见dll里有vivirtualalloc,setwindowshookexa等钩子函数。但是,里面乜嘢CreateRemoteThread这个函数,那么基本可以排除了第三种方法了。修改iat或者字节数的可能性比较大一些。那么具体究竟是用了什么手段,又是怎么实现的呢?光静态看源代码看出来,我可没那种本事。如果说要实时调试explorer又非常的麻烦,那么怎么办呢?其实办法很简单啦,只要自己修改一个exe文件名让他跟explorer同名就可以了。这家伙可不管你是真李逵还是假李鬼,统统都插!我先写了个很简单的exe程序,只有一个按钮直接掉用createprocess启动notepad的小程序,然后改名为explorer。运行后让程序拦截,果然再用icesword看模块,那个InterceptDll.dll偷偷的钻进了我写的这个程序。
100010D0 8BFF mov edi, edi
100010D2 55 push ebp
100010D3 8BEC mov ebp, esp
100010D5 - E9 5D12806C jmp kernel32.7C802337
而 kernel32.7C802337处i
不过没有关系,既然现在我们已经知道了这个dll工作的大至流程,我们也可以自己写一个拦截createprocess的dll了,而我们把这个程序改进一下,使他成为一个全局的钩子,而且我们可以选择程序的开启,在程序开启以前弹出一个msgbox,上面有是和否的按钮,你按下是程序就不能启动,而按下否程序就照常启动,而弹出的按钮里不但有这个程序的路径,还有启动这个程序的路径。怎么样,比他的还要高级一些吧。
10001124 56 push esi
10001125 50 push eax
10001126 FF15 FC700010 call dword ptr [100070FC] ; USER32.MessageBoxW
1000112C 8B45 2C mov eax, dword ptr [ebp+2C]
100010D2 55 push ebp
100010D3 8BEC mov ebp, esp
正是原本createprocess代码接下来的一段