源程序程序破解之 API HOOK技术
- 格式:docx
- 大小:341.52 KB
- 文档页数:10
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的实现原理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函数。
hook技术--代码hook1.简介:对于IAT hook ⽅法,它只能hook掉在iat中的API,如果是通过动态加载的就不⾏了因为动态加载的dll的API不在iat中,⽽是动态⽣成的.这时可以预先加载该dll和API,并对API前⼏个字节进⾏保存然后修改成跳转到⾃⼰的某函数中,然后进⾏⼀些操作后可以再跳回到原来的API.这就是所谓的API修改hook.2.以hook掉任务管理器的进程遍历功能,为例,⽤此来隐藏calc.exe这个进程windows上ring3层的遍历进程API底层都调⽤了ZwQuerySystemInformation 函数该函数在ntdll中,但没有公开在⽹上寻找该API的参数和返回值信息,在代码中体现代码思路是: 先获取ZwQuerySystemInformation的地址,保存前5个字节的代码. 再覆盖为⼀个跳转到我们实现的⼀个伪ZwQuerySystemInformation函数地址的jmp指令的机器代码.在我们的函数中找到calc.exe的进程名,然后再跳过这个节点即可.#include "stdafx.h"#include <Windows.h>#include <wchar.h>#include <malloc.h>#include<stdio.h>#define funcName "ZwQuerySystemInformation"#define dllName "ntdll.dll"#define processName L"calc.exe"typedef LONG NTSTATUS;typedef enum _SYSTEM_INFORMATION_CLASS {SystemBasicInformation = 0,SystemPerformanceInformation = 2,SystemTimeOfDayInformation = 3,SystemProcessInformation = 5,SystemProcessorPerformanceInformation = 8,SystemInterruptInformation = 23,SystemExceptionInformation = 33,SystemRegistryQuotaInformation = 37,SystemLookasideInformation = 45} SYSTEM_INFORMATION_CLASS;typedef struct _SYSTEM_PROCESS_INFORMATION {ULONG NextEntryOffset;ULONG NumberOfThreads;BYTE Reserved1[48];PVOID Reserved2[3];HANDLE UniqueProcessId;PVOID Reserved3;ULONG HandleCount;BYTE Reserved4[4];PVOID Reserved5[11];SIZE_T PeakPagefileUsage;SIZE_T PrivatePageCount;LARGE_INTEGER Reserved6[6];} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;typedef NTSTATUS(WINAPI *PFZWQUERYSYSTEMINFORMATION)(SYSTEM_INFORMATION_CLASS SystemInformationClass,PVOID SystemInformation,ULONG SystemInformationLength,PULONG ReturnLength);BYTE orgCode[5];//原始指令BYTE fakeCode[5]; //伪造的jmp指令DWORD funcBase; //我们的函数基址// char debug[100]={0};DWORD WINAPI myZwQuerySystemInformation(SYSTEM_INFORMATION_CLASS SystemInformationClass,PVOID SystemInformation,ULONG SystemInformationLength,PULONG ReturnLength);DWORD hook(DWORD funcbase, DWORD fakeFunc);DWORD unhook(DWORD funcbase);BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){ //获取⽬标函数基址和伪造函数基址DWORD fakeFunc;funcBase = (DWORD)GetProcAddress(GetModuleHandleA(dllName), funcName);fakeFunc = (DWORD)myZwQuerySystemInformation;switch (ul_reason_for_call){case DLL_PROCESS_ATTACH: //加载时就hook掉hook(funcBase, fakeFunc);break;case DLL_PROCESS_DETACH:unhook(funcBase);break;}return TRUE;}DWORD hook(DWORD funcbase, DWORD fakeFunc){DWORD page;//如果已经被hook了就不再继续if(*(BYTE*)funcbase==0xe9){return0;}VirtualProtect((LPVOID)funcbase, 5, PAGE_EXECUTE_READWRITE, &page);memcpy(orgCode, (LPVOID)funcbase, 5);fakeCode[0] = 0xe9;DWORD opCode = fakeFunc -funcBase - 5;//jmp指令的操作码计算公式为:⽬标地址-当前指令地址-5 // sprintf(debug,"hook fakeFunc is %p, funcbase is %p",fakeFunc,funcbase);memcpy(fakeCode + 1, &opCode, 4);//填充为指令memcpy((LPVOID)funcBase, fakeCode, 5); //修改代码VirtualProtect((LPVOID)funcbase, 5, page, &page);return1;}DWORD unhook(DWORD funcbase){DWORD page;if(*(BYTE*)funcbase!=0xe9){return0;}VirtualProtect((LPVOID)funcbase, 5, PAGE_EXECUTE_READWRITE, &page);memcpy((LPVOID)funcBase, orgCode, 4); //恢复代码VirtualProtect((LPVOID)funcbase, 5, page, &page);return1;}DWORD WINAPI myZwQuerySystemInformation(SYSTEM_INFORMATION_CLASS SystemInformationClass,PVOID SystemInformation,ULONG SystemInformationLength,PULONG ReturnLength)/*这个函数的hook和⼀般的函数不同,这种函数属于查询类的函数,真正有⽤的信息在该函数调⽤完了后才会写到缓冲区类的参数,⽽调⽤前的参数信息基本没⽤,因此我们要对该函数进⾏正常调⽤,完后了再截取信息*/{DWORD fakeFunc;funcBase = (DWORD)GetProcAddress(GetModuleHandleA(dllName), funcName);fakeFunc = (DWORD)myZwQuerySystemInformation;PSYSTEM_PROCESS_INFORMATION p, pPre;unhook(funcBase); //取消hook以正常调⽤DWORD status=4;status=((PFZWQUERYSYSTEMINFORMATION)funcBase)(SystemInformationClass,SystemInformation,SystemInformationLength,ReturnLength);//正常调⽤该函数if(status!=0){hook(funcBase, fakeFunc); //hook住return0;}if (SystemInformationClass== SystemProcessInformation) //只对查询进程的信息感兴趣 {p = ((PSYSTEM_PROCESS_INFORMATION)SystemInformation);while (1){if(p->Reserved2[1]!=0){if (lstrcmpiW((WCHAR*)p->Reserved2[1], processName)==0){if (p->NextEntryOffset==0)//说明是最后⼀个了{pPre->NextEntryOffset = 0; //将后⾯⼀个节点的next指针置0即可}else{//跳过本节点 NextEntryOffset字段是相对于本节点的偏移,⽽不是绝对地址 //当当前节点是第⼀个节点时这个式⼦也成⽴pPre->NextEntryOffset += p->NextEntryOffset;}}else{pPre = p;}}if(p->NextEntryOffset==0){break;}p =((PSYSTEM_PROCESS_INFORMATION)((DWORD)p + p->NextEntryOffset)); }}hook(funcBase, fakeFunc); //hook住return1;}。
第6章APIHOOKAPIHOOK始终是系统程序员关心的热门话题。
通过APIHOOK,可以对Win32API函数进行拦截,从而改变函数乃至程序的固有行为。
通过APIHOOK拦截可以解决十分棘手的难题。
本章主要介绍Win32API拦截、驱动程序服务函数的拦截、BrowserHelpObject实现、SPI接口的应用,并利用Detours库实现对DLL的绑定。
6.1 APIHOOK综述APIHOOK尽管能够提供非常强大的功能,但是遗憾的是,无论是DDK还是SDK都没有提供这方面的任何文档和例子。
使用APIHOOK前,用户首先应该弄清楚,究竟是拦截一个应用程序还是系统范围内的拦截。
系统的拦截往往需要实现对创建的新的进程进行监视。
对系统底层服务进行拦截,能够打破进程边界。
最简单的实现拦截的方法是实现一个代理的动态链接库。
这个动态链接库实现了目标拦截动态链接库的全部输出函数,但是它只是一个函数转发器,其函数功能还是通过间接地调用原来的目标动态链接库函数实现。
当程序或者系统调用目标动态链接库的时候,真正调用的是代理动态链接库。
代理动态链接库的输出函数会首先检查调用函数的入口参数,决定直接返回一个值,还是调用原来的函数。
可以把这个函数的返回结果作为返回值返回,也可以对调用结果进行二次处理。
由于这种方法需要对所有的函数进行处理,这个过程十分繁琐,而且并非所有的函数都提供了足够的文档,因此这种方法在某些情况下几乎是无法实现的。
这方面应用的例子有关于WinInet实现的程序,发表在1994年12月份的MSJ杂志上,网址是/MSJ/0997/hood0997.htm。
对API函数的拦截不外乎两种方式,要么在磁盘文件上实现,要么在内存中实现。
前者拦截在可执行程序加载以前,后者则是在程序加载之后。
两种方法基本上都是通过打补丁的方法实现的。
如果用户以前曾经研究过APIHOOK,也许听说过导入地址表补丁的概念。
它的很多优点使得这种WindowsAPIHOOK的方法成为最体面、最常见的方法之一。
Hook技术是一种用于拦截API函数调用的技术,它通过修改系统API函数的内存地址,从而拦截系统函数的调用,实现对系统API函数的拦截和修改。
Hook技术的基本原理是将系统API函数的内存地址指向一个用户定义的函数,而不是指向实际的API函数。
当调用系统API函数时,系统将调用用户定义的函数,而不是原来的函数。
这样就可以实现对系统API函数的拦截和修改。
Hook技术的实现步骤如下:
1、首先,程序员需要查找和定位需要拦截的API函数的内存地址。
2、然后,程序员需要编写用户定义的函数,用来拦截和修改系统API函数的调用。
3、接着,程序员需要将系统API函数的内存地址指向用户定义的函数,从而实现API函数的拦截。
4、最后,程序员需要将系统API函数的原始内存地址保存起来,以便在不再需要拦截时,可以恢复原来的API函数调用行为。
Hook技术是一种强大的技术,可以用来实现各种功能,比如拦截软件的调用,拦截软件的输入输出,拦截系统函数的调用等。
Hook技术也可以用来实现防病毒,反垃圾邮件,防恶意程序,实现软件保护以及实现自定义控件等功能。
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())。
这样,当函数每次执⾏⽬标函数的时候,就会跳转到我们⾃定义的函数⾥⾯去。
Windows下Hook API技术 inline hook分类: WINDOWS什么叫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_MOUSEHOOKPROC 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原理
Hook原理是一种编程手段,它可以在不修改源代码的情况下,通过在应用程序的关键步骤之前或之后插入特定的代码,来实现对应用程序的功能增强、维护或检测。
Hook原理是一种“挂钩”机制,即在应用程序运行时,通过挂钩机制,将第三方软件插入原来的程序中,从而实现功能拓展,是一种常用的API和操作系统级别的编程技术。
Hook原理可以用来实现各种功能,如增强处理器性能、实现数据存储、实现调试技术、运行安全性检查、更新应用程序、保护数据和确保安全等等。
Hook原理的实现可以通过几种方法,包括直接在应用程序的关键函数上添加hook代码,将hook代码作为程序的一部分添加,或使用已有的应用程序接口(API)来实现hook原理。
首先,要实现hook原理,就必须在应用程序的关键函数上添加hook代码,即在函数的入口处和出口处添加hook 代码,以便在函数的入口处检查函数的参数,在函数的出口处检查函数的返回值,并在此基础上实现相应的功能增强。
其次,可以将hook代码作为应用程序的一部分添
加,即在调用函数的入口处添加hook代码,以便在调用函数之前和之后进行检查,实现相应的功能增强。
另外,也可以利用已有的应用程序接口(API)来实现hook原理。
API中有一组特殊的函数,可以在应用程序的关键步骤之前或之后插入特定的代码,以便实现功能增强、维护或检测。
比如,Windows系统中的SetWindowHookEx函数,可以让用户在应用程序的特定消息发生时,即时地收到消息,从而实现功能增强或检测。
以上就是hook原理的实现方式。
hook原理广泛应用于编程中,可以实现各种功能,有助于提高应用程序的性能和安全性。
注: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会自动的降低安全警告等级到普通,否则会显示为危险。
android hook技术原理Android Hook技术原理Android Hook技术是指通过修改Android系统或应用程序代码,以便在运行时拦截和修改程序的功能或行为。
通过Hook技术,可以实现对Android应用程序的各种操作,如修改应用程序的界面、修改应用程序的行为、监控应用程序的运行状态等。
本文将对Android Hook技术的原理进行详细介绍。
一、Hook技术的原理1. 什么是HookHook是一种技术手段,可以在程序运行的过程中,拦截并修改程序的行为。
在Android系统中,Hook技术可以通过修改系统的API调用,来改变应用程序的行为,实现对应用程序的控制。
2. Hook的实现方式在Android系统中,Hook技术可以通过两种主要的方式来实现:静态Hook和动态Hook。
静态Hook是通过修改应用程序的代码来实现的,需要对应用程序的源代码进行修改,并重新编译成新的应用程序。
这种方式需要对应用程序的代码结构和运行机制有较深的了解,并且需要有相应的开发工具和环境。
动态Hook是通过在应用程序运行时修改应用程序的行为来实现的,不需要对应用程序的源代码进行修改。
这种方式不需要对应用程序的代码结构和运行机制有深入的了解,只需要在运行时注入一些代码即可。
3. 动态Hook的原理动态Hook的实现主要依赖于Android系统的底层机制和技术,主要包括以下几个步骤:(1)定位目标方法:首先需要确定要Hook的目标方法,即需要拦截和修改的方法。
(2)获取目标方法的地址:通过反射等方式,获取目标方法在内存中的地址。
(3)修改目标方法的地址:通过修改目标方法在内存中的地址,将其指向Hook方法。
(4)实现Hook方法:Hook方法是指在目标方法执行前或执行后需要执行的代码。
可以通过编写一个Hook回调函数,来实现Hook方法的功能。
(5)完成Hook操作:将Hook方法的地址写入目标方法的地址中,完成Hook操作。
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); 第⼀个参数表⽰挂钩类型,是⼀个低级键盘钩⼦。
上一期,我们讲了用HOOK技术实现远程线程插入,相信大家还记忆犹新.这一期我们来谈谈 API HOOKAPI Hook技术应用广泛,常用于屏幕取词,网络防火墙,病毒木马,加壳软件,串口红外通讯,游戏外挂,internet通信等领域API HOOK的中文意思就是钩住API,对API进行预处理,先执行我们的函数,例如我们用API Hook技术挂接ExitWindowsEx API函数,使关机失效,挂接ZwOpenProcess函数,隐藏进程等等......总的来说,常用的挂钩API方法有以下两种: <一>改写IAT导入表法我们知道,Windows下的可执行文档的文件格式是一种叫PE(“portable executable”,可移植的可执行文件)的文件格式,这种文件格式是由微软设计的,接下来这张图描述了PE文件的结构:+-------------------------------+ - offset 0| MS DOS标志("MZ") 和 DOS块 |+-------------------------------+| PE 标志 ("PE") |+-------------------------------+| .text | - 模块代码| 程序代码 || |+-------------------------------+| .data | - 已初始化的(全局静态)数据| 已初始化的数据 || |+-------------------------------+| .idata | - 导入函数的信息和数据| 导入表 || |+-------------------------------+| .edata | - 导出函数的信息和数据| 导出表 || |+-------------------------------+| 调试符号 |+-------------------------------+这里对我们比较重要的是.idata部分的导入地址表(IAT)。
API Hook基本原理和实现Hook是什么?Windows系统下的编程,消息message的传递是贯穿其始终的。
这个消息我们可以简单理解为一个有特定意义的整数,正如我们看过的老故事片中的“长江长江,我是黄河”一个含义。
windows中定义的消息给初学者的印象似乎是“不计其数”的,常见的一部分消息在winuser.h头文件中定义。
hook与消息有着非常密切的联系,它的中文含义是“钩子”,这样理解起来我们不难得出“hook是消息处理中的一个环节,用于监控消息在系统中的传递,并在这些消息到达最终的消息处理过程前,处理某些特定的消息”。
这也是hook分为不同种类的原因。
hook的这个本领,使它能够将自身的代码“融入”被hook住的程序的进程中,成为目标进程的一个部分。
我们也知道,在windows2000以后的系统中,普通用户程序的进程空间都是独立的,程序的运行彼此间都不受干扰。
这就使我们希望通过一个程序改变其他程序的某些行为的想法不能直接实现,但是hook的出现给我们开拓了解决此类问题的道路。
API Hook是什么?在windows系统下编程,应该会接触到api函数的使用,常用的api函数大概有2000个左右。
今天随着控件,stl等高效编程技术的出现,api的使用概率在普通的用户程序上就变得越来越小了。
当诸如控件这些现成的手段不能实现的功能时,我们还需要借助api。
最初有些人对某些api函数的功能不太满意,就产生了如何修改这些api,使之更好的服务于程序的想法,这样api hook就自然而然的出现了。
我们可以通过api hook,改变一个系统api 的原有功能。
基本的方法就是通过hook“接触”到需要修改的api函数入口点,改变它的地址指向新的自定义的函数。
api hook并不属于msdn上介绍的13类hook中的任何一种。
所以说,api hook并不是什么特别不同的hook,它也需要通过基本的hook提高自己的权限,跨越不同进程间访问的限制,达到修改api函数地址的目的。
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),表示所有程序调用被截函数时都自动跳转到自定义函数。
API函数_超强HOOK技术其实 DNF QQ三国等SX HS 非法扩展名文件提示检测完全可以用API_HOOK技术来搞定的截获API是个很有用的东西,比如你想分析一下别人的程序是怎样工作的。
这里我介绍一下一种我自己试验通过的方法。
首先,我们必须设法把自己的代码放到目标程序的进程空间里去。
WindowsHook 可以帮我们实现这一点。
SetWindowsHookEx的声明如下:HHOOKSetWindowsHookEx(intidHook,hooktypeHOOKPROClpfn,hookprocedureHINSTANCEhMod,handletoapplicationinstanceDWORDdwThreadIdthreadidentifier);具体的参数含义可以翻阅msdn,没有msdn可谓寸步难行。
这里Hook本身的功能并不重要,我们使用它的目的仅仅只是为了能够让Windows把我们的代码植入别的进程里去。
hookType我们任选一种即可,只要保证是目标程序肯定会调用到就行,这里我用的是WH_CALLWNDPROC。
lpfn和hMod分别指向我们的钩子代码及其所在的dll,dwThreadId设为0,表示对所有系统内的线程都挂上这样一个hook,这样我们才能把代码放到别的进程里去。
之后,我们的代码就已经进入了系统内的所有进程空间了。
必须注意的是,我们只需要截获我们所关心的目标程序的调用,因此还必须区分一下进程号。
我们自己的钩子函数中,第一次运行将进行最重要的API重定向的工作。
也就是通过将所需要截获的API的开头几个字节改为一个跳转指令,使其跳转到我们的API 中来。
这是最关键的部分。
这里我想截三个调用,ws2_32.dll中的send和recv、user32.dll中的GetMessageA。
DWORDdwCurrentPID=0;HHOOKhOldHook=NULL;DWORDpSend=0;DWORDpRecv=0;GETMESSAGEpGetMessage=NULL;BYTEbtNewBytes[8]={0x0B8,0x0,0x0,0x40,0x0,0x0FF,0x0E0,0}; DWORDdwOldBytes[3][2];HANDLEhDebug=INVALID_HANDLE_value;LRESULTCALLBACKCallWndProc(intnCode,WPARAMwParam,LPARAMlParam){DWORDdwSize;DWORDdwPIDWatched;HMODULEhLib;if(dwCurrentPID==0){dwCurrentPID=GetCurrentProcessId();HWNDhwndMainHook;hwndMainHook=FindWindow(0,MainHook);dwPIDWatched=SendMessage(hwndMainHook,(WM_USER+100),0,0);hOldHook=(HHOOK)SendMessage(hwndMainHook,(WM_USER+101),0,0);if(dwCurrentPID==dwPIDWatched){hLib=LoadLibrary(ws2_32.dll);pSend=(DWORD)GetProcAddress(hLib,send);pRecv=(DWORD)GetProcAddress(hLib,recv);ReadProcessMemory(INVALID_HANDLE_value,(void)pSend,(void)dwOldBytes[0],sizeof(D WORD)2,&dwSize);(DWORD)(btNewBytes+1)=(DWORD)new_send;WriteProcessMemory(INVALID_HANDLE_value,(void)pSend,(void)btNewBytes,sizeof(DWO RD)2,&dwSize);ReadProcessMemory(INVALID_HANDLE_value,(void)pRecv,(void)dwOldBytes[1],sizeof(D WORD)2,&dwSize);(DWORD)(btNewBytes+1)=(DWORD)new_recv;WriteProcessMemory(INVALID_HANDLE_value,(void)pRecv,(void)btNewBytes,sizeof(DWO RD)2,&dwSize);hLib=LoadLibrary(user32.dll);pGetMessage=(GETMESSAGE)GetProcAddress(hLib,GetMessageA); ReadProcessMemory(INVALID_HANDLE_value,(void)pGetMessage,(void)dwOldBytes[2],si zeof(DWORD)2,&dwSize);(DWORD)(btNewBytes+1)=(DWORD)new_GetMessage;WriteProcessMemory(INVALID_HANDLE_value,(void)pGetMessage,(void)btNewBytes,size of(DWORD)2,&dwSize);hDebug=CreateFile(CTrace.log,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NOR MAL,0);}}if(hOldHook!=NULL)if(hOldHook!=NULL){returnCallNextHookEx(hOldHook,nCode,wParam,lParam);}return0;}上面的钩子函数,只有第一次运行时有用,就是把三个函数的首8字节修改一下(实际上只需要7个)。
8种hook技术_hook方式在软件开发中,常常需要对特定的功能或流程进行定制化。
而在定制化过程中,hook技术是一个重要的利器。
本文将介绍8种常见的hook方式。
1. 函数Hook:函数Hook是指通过修改函数的入口地址,截获函数的执行过程以实现自定义逻辑。
通常使用的方法有替换函数指针、注入代码等。
2. 系统调用Hook:系统调用是操作系统提供的接口,用于访问底层资源。
通过hook系统调用,可以在应用程序执行系统调用时,对其进行自定义处理,如修改传入参数、替换返回值等。
3. 消息Hook:消息是GUI应用程序中用于传递用户输入、系统事件等的基本单元。
通过hook消息,可以拦截和处理应用程序接收到的消息,并进行相应的操作。
4. API Hook:API是应用程序提供的接口,用于实现特定功能。
通过hook API,可以在调用API的过程中,修改其行为或增加额外的功能。
5. 线程Hook:线程是程序执行的基本单位,通过hook线程,可以在线程创建、销毁、执行过程中注入自定义代码,实现对线程行为的监控和控制。
6. 类Hook:类是面向对象编程中的基本概念,通过hook类,可以修改类的行为或增加新的功能。
常见的类hook方式包括继承、代理、装饰器等。
7. 注册表Hook:注册表是Windows操作系统中用于存储系统配置信息的数据库。
通过hook注册表,可以拦截对注册表的读写操作,实现对系统配置的自定义修改。
8. 文件系统Hook:文件系统是操作系统中用于管理文件和目录的模块。
通过hook文件系统,可以拦截对文件和目录的操作,实现对文件系统的自定义控制和保护。
综上所述,以上是8种常见的hook技术方式。
在软件开发中,合理运用这些hook技术,可以实现对应用程序的灵活定制和功能增强,提升开发效率和系统性能。
当然,在使用hook技术时,务必注意合法合规,避免不必要的安全风险和潜在问题。
希望本文能对读者对hook 技术有所了解和应用。