本文目录
- 对app进行hook什么意思呢
- 如何检测自己程序的API被HOOK了
- C#中,如何HOOK一个API函数!
- 如何使用c#hook一个windows api 函数
- 如何实现这样的API hook
- 易语言 HOOK API 教程 要详细的说明
- delphi怎么HOOK指定API函数
- 关于hookapi
- 怎样HOOK API啊
- 我是电脑迷,常看到API hook,请问什么用法是什么意思啊
对app进行hook什么意思呢
对app进行hook的意思是去调用或者篡改APP代码。
软件HOOK即钩子函数,钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。
钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
HOOK技术在windows系统下编程,应该会接触到api函数的使用,常用的api函数大概有2000个左右。今天随着控件,stl等高效编程技术的出现,api的使用概率在普通的用户程序上就变得越来越小了。当诸如控件这些现成的手段不能实现的功能时,我们还需要借助api。
如何检测自己程序的API被HOOK了
这个程序的原版大家自己找,名字就叫做API拦截教程。启动该程序后,按下拦截createprocess的按钮后,运行任何程序都会弹出运行程序的路径。稍微了解apihook的都了解,通常ring3下hookapi的办法有三种,一是修改程序的iat表,使api调用跳向自己的函数而不是转向api入口。二是修改api入口的机器码。三是用创建远线程CreateRemoteThread的办法来完成。那么这个教程究竟用了什么先进手法呢? 先运行一次,按下按钮后,果然explorer弹出了程序的路径。此时,你如果使用icesword类的可以查看程序模块的程序查看explorer的模块,你就会发现explorer里面多了个InterceptDll.dll的模块,当我们卸载了这个dll后,这个拦截的效果就没有了。看来这个程序的核心不是那个启动的程序,而是这个dll。现在让我们看看这个InterceptDll.dll到底做了什么。 先使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件 DUMPBIN InterceptDll.dll /EXPROTS /OUT:InterceptDll.def ordinal hint RVA name 1 0 00001230 InstallHook 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偷偷的钻进了我写的这个程序。 好,现在动手钻进InterceptDll.dll的内部,看看他到底干了什么!我用的是olldbg,其实windbg也可以,我用od习惯了。先附加到我自己写的这个小explorer程序,然后在createprocess下断点,按下启动notepad的按钮,断下以后,一步一步跟踪。转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦
C#中,如何HOOK一个API函数!
HOOK API是一个永恒的话题,如果没有HOOK,许多技术将很难实现,也许根本不能实现。这里所说的API,是广义上的API,它包括DOS下的中断,WINDOWS里的API、中断服务、IFS和NDIS过滤等。比如大家熟悉的即时翻译软件,就是靠HOOK TextOut()或ExtTextOut()这两个函数实现的,在操作系统用这两个函数输出文本之前,就把相应的英文替换成中文而达到即时翻译;IFS和NDIS过滤也是如此,在读写磁盘和收发数据之前,系统会调用第三方提供的回调函数来判断操作是否可以放行,它与普通HOOK不同,它是操作系统允许的,由操作系统提供接口来安装回调函数。 甚至如果没有HOOK,就没有病毒,因为不管是DOS下的病毒或WINDOWS里的病毒,都是靠HOOK系统服务来实现自己的功能的:DOS下的病毒靠HOOK INT 21来感染文件(文件型病毒),靠HOOK INT 13来感染引导扇区(引导型病毒);WINDOWS下的病毒靠HOOK 系统API(包括RING0层的和RING3层的),或者安装IFS(CIH病毒所用的方法)来感染文件。因此可以说“没有HOOK,就没有今天多姿多彩的软件世界”。 由于涉及到专利和知识产权,或者是商业机密,微软一直不提倡大家HOOK它的系统API,提供IFS和NDIS等其他过滤接口,也是为了适应杀毒软件和防火墙的需要才开放的。所以在大多数时候,HOOK API要靠自己的力量来完成。 HOOK API有一个原则,这个原则就是:被HOOK的API的原有功能不能受到任何影响。就象医生救人,如果把病人身体里的病毒杀死了,病人也死了,那么这个“救人”就没有任何意义了。如果你HOOK API之后,你的目的达到了,但API的原有功能失效了,这样不是HOOK,而是REPLACE,操作系统的正常功能就会受到影响,甚至会崩溃。 HOOK API的技术,说起来也不复杂,就是改变程序流程的技术。在CPU的指令里,有几条指令可以改变程序的流程:JMP,CALL,INT,RET,RETF,IRET等指令。理论上只要改变API入口和出口的任何机器码,都可以HOOK,但是实际实现起来要复杂很多,因为要处理好以下问题:1,CPU指令长度问题,在32位系统里,一条JMP/CALL指令的长度是5个字节,因此你只有替换API里超过5个字节长度的机器码(或者替换几条指令长度加起来是5字节的指令),否则会影响被更改的小于5个字节的机器码后面的数条指令,甚至程序流程会被打乱,产生不可预料的后果;2,参数问题,为了访问原API的参数,你要通过EBP或ESP来引用参数,因此你要非常清楚你的HOOK代码里此时的EBP/ESP的值是多少;3,时机的问题,有些HOOK必须在API的开头,有些必须在API的尾部,比如HOOK CreateFilaA(),如果你在API尾部HOOK API,那么此时你就不能写文件,甚至不能访问文件;HOOK RECV(),如果你在API头HOOK,此时还没有收到数据,你就去查看RECV()的接收缓冲区,里面当然没有你想要的数据,必须等RECV()正常执行后,在RECV()的尾部HOOK,此时去查看RECV()的缓冲区,里面才有想要的数据;4,上下文的问题,有些HOOK代码不能执行某些操作,否则会破坏原API的上下文,原API就失效了;5,同步问题,在HOOK代码里尽量不使用全局变量,而使用局部变量,这样也是模块化程序的需要;6,最后要注意的是,被替换的CPU指令的原有功能一定要在HOOK代码的某个地方模拟实现。下面以ws2_32.dll里的send()为例子来说明如何HOOK这个函数:Exported fn(): send - Ord:0013h地址 机器码 汇编代码:71A21AF4 55 push ebp //将被HOOK的机器码(第1种方法):71A21AF5 8BEC mov ebp, esp //将被HOOK的机器码(第2种方法):71A21AF7 83EC10 sub esp, 00000010:71A21AFA 56 push esi:71A21AFB 57 push edi:71A21AFC 33FF xor edi, edi:71A21AFE 813D1C20A371931CA271 cmp dword ptr [71A3201C], 71A21C93 //将被HOOK的机器码(第4种方法):71A21B08 0F84853D0000 je 71A25893:71A21B0E 8D45F8 lea eax, dword ptr [ebp-08]:71A21B11 50 push eax:71A21B12 E869F7FFFF call 71A21280:71A21B17 3BC7 cmp eax, edi:71A21B19 8945FC mov dword ptr [ebp-04], eax:71A21B1C 0F85C4940000 jne 71A2AFE6:71A21B22 FF7508 push [ebp+08]:71A21B25 E826F7FFFF call 71A21250:71A21B2A 8BF0 mov esi, eax:71A21B2C 3BF7 cmp esi, edi:71A21B2E 0F84AB940000 je 71A2AFDF:71A21B34 8B4510 mov eax, dword ptr [ebp+10]:71A21B37 53 push ebx:71A21B38 8D4DFC lea ecx, dword ptr [ebp-04]:71A21B3B 51 push ecx:71A21B3C FF75F8 push [ebp-08]:71A21B3F 8D4D08 lea ecx, dword ptr [ebp+08]: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]:71A21B4D 51 push ecx:71A21B4E 6A01 push 00000001:71A21B50 8D4DF0 lea ecx, dword ptr [ebp-10]:71A21B53 51 push ecx:71A21B54 FF7508 push [ebp+08]:71A21B57 8945F4 mov dword ptr [ebp-0C], eax:71A21B5A 8B460C mov eax, dword ptr [esi+0C]:71A21B5D FF5064 call [eax+64]:71A21B60 8BCE mov ecx, esi:71A21B62 8BD8 mov ebx, eax:71A21B64 E8C7F6FFFF call 71A21230 //将被HOOK的机器码(第3种方法):71A21B69 3BDF cmp ebx, edi:71A21B6B 5B pop ebx:71A21B6C 0F855F940000 jne 71A2AFD1: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:1,把API入口的第一条指令是PUSH EBP指令(机器码0x55)替换成INT 3(机器码0xcc),然后用WINDOWS提供的调试函数来执行自己的代码,这中方法被SOFT ICE等DEBUGER广泛采用,它就是通过BPX在相应的地方设一条INT 3指令来下断点的。但是不提倡用这种方法,因为它会与WINDOWS或调试工具产生冲突,而汇编代码基本都要调试;2,把第二条mov ebp,esp指令(机器码8BEC,2字节)替换为INT F0指令(机器码CDF0),然后在IDT里设置一个中断门,指向我们的代码。我这里给出一个HOOK代码:lea ebp,[esp+12] //模拟原指令mov ebp,esp的功能pushfd //保存现场pushad //保存现场//在这里做你想做的事情popad //恢复现场popfd //恢复现场iretd //返回原指令的下一条指令继续执行原函数(71A21AF7地址处)这种方法很好,但缺点是要在IDT设置一个中断门,也就是要进RING0。3,更改CALL指令的相对地址(CALL分别在71A21B12、71A21B25、71A21B64,但前面2条CALL之前有一个条件跳转指令,有可能不被执行到,因此我们要HOOK 71A21B64处的CALL指令)。为什么要找CALL指令下手?因为它们都是5字节的指令,而且都是CALL指令,只要保持操作码0xE8不变,改变后面的相对地址就可以转到我们的HOOK代码去执行了,在我们的HOOK代码后面再转到目标地址去执行。假设我们的HOOK代码在71A20400处,那么我们把71A21B64处的CALL指令改为CALL 71A20400(原指令是这样的:CALL 71A21230)而71A20400处的HOOK代码是这样的:71A20400:pushad//在这里做你想做的事情popadjmp 71A21230 //跳转到原CALL指令的目标地址,原指令是这样的:call 71A21230这种方法隐蔽性很好,但是比较难找这条5字节的CALL指令,计算相对地址也复杂。4,替换71A21AFE地址上的cmp dword ptr [71A3201C], 71A21C93指令(机器码:813D1C20A371931CA271,10字节)成为call 71A20400nopnopnopnopnop(机器码:E8 XX XX XX XX 90 90 90 90 90,10字节)在71A20400的HOOK代码是:pushadmov edx,71A3201Ch //模拟原指令cmp dword ptr [71A3201C], 71A21C93cmp dword ptr [edx],71A21C93h //模拟原指令cmp dword ptr [71A3201C], 71A21C93pushfd//在这里做你想做的事popfdpopadret这种方法隐蔽性最好,但不是每个API都有这样的指令,要具体情况具体操作。以上几种方法是常用的方法,值得一提的是很多人都是改API开头的5个字节,但是现在很多杀毒软件用这样的方法检查API是否被HOOK,或其他病毒木马在你之后又改了前5个字节,这样就会互相覆盖,最后一个HOOK API的操作才是有效的,
如何使用c#hook一个windows api 函数
hook api有几种方式1、导入表hook,枚举导入表,找到位置,替换函数指针即可,api加算法即可完成,因此c#也可以调用api来完成2、inline hook,找到函数地址,开头写入跳转指令跳转到新位置,新位置执行后可以选择调用原函数,原函数之前可以先执行被覆盖的指令在跳转到剩余函数指令上。api加算法即可完成,因此c#也可以调用api来完成
如何实现这样的API hook
api hook技术的难点,并不在于hook技术,初学者借助于资料“照葫芦画瓢”能够很容易就掌握hook的基本使用技术。但是如何修改api函数的入口地址?这就需要学习pe可执行文件(.exe,.dll等)如何被系统映射到进程空间中,这就需要学习pe格式的基本知识。windows已经提供了很多数据结构struct帮助我们访问pe格式,借助它们,我们就不要自己计算格式的具体字节位置这些繁琐的细节。但是从api hook的实现来看,pe格式的访问部分仍然是整个编程实现中最复杂的一部分,对于经常crack的朋友不在此列。假设我们已经了解了pe格式,那么我们在哪里修改api的函数入口点比较合适呢?这个就是输入符号表imported symbols table(间接)指向的输入符号地址。 下面对于pe格式的介绍这一部分,对于没有接触过pe格式学习的朋友应该是看不太明白的,但我已经把精华部分提取出来了,学习了pe格式后再看这些就很容易了。pe格式的基本组成+-------------------+ | DOS-stub | --DOS-头 +-------------------+ | file-header | --文件头 +-------------------+ | optional header | --可选头 |- - - - - - - - - -| | | | data directories | --(可选头尾的)数据目录 | | +-------------------+ | | | section headers | --节头 | | +-------------------+ | | | section 1 | --节1 | | +-------------------+ | | | section 2 | --节2 | | +-------------------+ | | | ... | | | +-------------------+ | | | section n | --节n | | +-------------------+ 在上图中,我们需要从“可选头”尾的“数据目录”数组中的第二个元素——输入符号表的位置,它是一个IMAGE_DATA_DIRECTORY结构,从它中的VirtualAddress地址,“顺藤摸瓜”找到api函数的入口地点。 下图的简单说明如下:OriginalFirstThunk 指向IMAGE_THUNK_DATA结构数组,为方便只画了数组的一个元素,AddressOfData 指向IMAGE_IMPORT_BY_NAME结构。IMAGE_IMPORT_DESCRIPTOR数组:每个引入的dll文件都对应数组中的一个元素,以全0的元素(20个bytes的0)表示数组的结束IMAGE_THUNK_DATA32数组:同一组的以全0的元素(4个bytes的0)表示数组的结束,每个元素对应一个IMAGE_IMPORT_BY_NAME结构IMAGE_IMPORT_BY_NAME:如..@Consts@initialization$qqrv. 表示Unmangled Borland C++ Function: qualified function __fastcall Consts::initialization() 为了减少这个图的大小,不得已将汇编和c++的结构都用上了。这个图是输入符号表初始化的情形,此时两个IMAGE_THUNK_DATA结构数组的对应元素都指向同一个IMAGE_IMPORT_BY_NAME结构。 程序加载到进程空间后,两个IMAGE_THUNK_DATA结构数组指向有所不同了。看下图:// 本文转自 C++Builder研究 -
易语言 HOOK API 教程 要详细的说明
#include#include “APIHook.h“ extern CAPIHook g_OpenProcess; // 自定义OpenProcess函数 #pragma data_seg(“YCIShared“) HHOOK g_hHook = NULL; DWORD dwCurrentProcessId=0; #pragma data_seg() HANDLE WINAPI Hook_OpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId) { typedef HANDLE (WINAPI *PFNTERMINATEPROCESS)(DWORD, BOOL,DWORD); if(dwProcessId != dwCurrentProcessId) { return ((PFNTERMINATEPROCESS)(PROC)g_OpenProcess)(dwDesiredAccess,bInheritHandle,dwProcessId); } return 0; } // 挂钩OpenProcess函数 CAPIHook g_OpenProcess(“kernel32.dll“, “OpenProcess“, (PROC)Hook_OpenProcess); ////static HMODULE ModuleFromAddress(PVOID pv) { MEMORY_BASIC_INFORMATION mbi; if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0) { return (HMODULE)mbi.AllocationBase; } else { return NULL; } } static LRESULT WINAPI GetMsgProc(int code, WPARAM wParam, LPARAM lParam) { return ::CallNextHookEx(g_hHook, code, wParam, lParam); } BOOL WINAPI SetSysHook(BOOL bInstall, DWORD dwThreadId) { BOOL bOk; dwCurrentProcessId=dwThreadId; if(bInstall) { g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, ModuleFromAddress(GetMsgProc), 0); bOk = (g_hHook != NULL); } else { bOk = ::UnhookWindowsHookEx(g_hHook); g_hHook = NULL; } return bOk; } API 通过HOOK OpenProcess() 实现进程防杀2007-07-04 14:41在WINDOWS操作系统下,当我们无法结束或者不知道怎样结束一个程序的时候,或者是懒得去找“退出”按钮的时候,通常会按“CTRL+ALT+DEL”呼出任务管理器,找到想结束的程序,点一下“结束任务”就了事了,呵呵,虽然有点粗鲁,但大多数情况下都很有效,不是吗? 设想一下,如果有这么一种软件,它所要做的工作就是对某个使用者在某台电脑上的活动作一定的限制,而又不能被使用者通过“结束任务”这种方式轻易地解除限制,那该怎么做?无非有这么三种方法:1.屏蔽“CTRL+ALT+DEL”这个热键的组合;2.让程序不出现在任务管理器的列表之中;3.让任务管理器无法杀掉这个任务。对于第一种方法,这样未免也太残酷了,用惯了“结束任务”这种方法的人会很不习惯的;对于第二种方法,在WINDOWS 9X下可以很轻易地使用注册服务进程的方法实现,但是对于WINDOWS NT架构的操作系统没有这个方法了,进程很难藏身,虽然仍然可以实现隐藏,但实现机制较为复杂;对于第三种方法,实现起来比较简单,我的作品:IPGate网址过滤器 就是采用的这种方式防杀的,接下来我就来介绍这种方法。 任务管理器的“结束任务”实际上就是强制终止进程,它所使用的杀手锏是一个叫做TerminateProcess()的Win32 API函数,我们来看看它的定义: BOOL TerminateProcess( HANDLE hProcess; // 将被结束进程的句柄 UINT uExitCode; // 指定进程的退出码 ); 看到这里,是不是觉得不必往下看都知道接下来要做什么:Hook TerminateProcess()函数,每次TerminateProcess()被调用的时候先判断企图结束的进程是否是我的进程,如果是的话就简单地返回一个错误码就可以了。真的是这么简单吗?先提出一个问题,如何根据hProcess判断它是否是我的进程的句柄?答案是:在我的进程当中先获得我的进程的句柄,然后通过进程间通讯机制传递给钩子函数,与hProcess进行比较不就行了?错!因为句柄是一个进程相关的值,不同进程中得到的我的进程的句柄的值在进程间进行比较是无意义的。 怎么办?我们来考察一下我的hProcess它是如何得到的。一个进程只有它的进程ID是独一无二的,操作系统通过进程ID来标识一个进程,当某个程序要对这个进程进行访问的话,它首先得用OpenProcess这个函数并传入要访问的进程ID来获得进程的句柄,来看看它的参数: HANDLE OpenProcess( DWORD dwDesiredAccess, // 希望获得的访问权限 BOOL bInheritHandle, // 指明是否希望所获得的句柄可以继承 DWORD dwProcessId // 要访问的进程ID ); 脉络渐渐显现:在调用TerminateProcess()之前,必先调用OpenProcess(),而OpenProcess()的参数表中的dwProcessId是在系统范围内唯一确定的。得出结论:要Hook的函数不是TerminateProcess()而是OpenProcess(),在每次调用OpenProcess()的时候,我们先检查dwProcessId是否为我的进程的ID(利用进程间通讯机制),如果是的话就简单地返回一个错误码就可以了,任务管理器拿不到我的进程的句柄,它如何结束我的进程呢? 至此,疑团全部揭开了。由Hook TerminateProcess()到Hook OpenProcess()的这个过程,体现了一个逆向思维的思想。其实我当初钻进了TerminateProcess()的死胡同里半天出也不来,但最终还是蹦出了灵感的火花,注意力转移到了OpenProcess()上面,实现了进程防杀。喜悦之余,将这心得体会拿出来与大家分享。参考资料: http://hi.baidu.com/wlw7758/blog/item/9d109322816032f1d7cae2d7.html版权所有,谢绝抄袭!!!!!!
delphi怎么HOOK指定API函数
使用 delphi 语言来 Hook 指定的 API 函数,比较简便的方法如下:
1、下载 CnPack 小组的免费开源组件包 CnVCL,将之安装到 delphi 系统中:
2、在 CnVCL 组件包中,提供了 CnInProcessAPIHook 单元,该单元文件提供了 TCnInProcessAPIHook 组件,及其他相关的函数,提供了“进程内实现 APIHook ”功能:
其主要定义如下:
3、编写代码实现 HOOK 指定 API 函数的示例:
(1)先要引入单元文件:
uses CnInProcessAPIHook;
(2)建立 TCnInProcessAPIHook 实例,并指定需要 HOOK 的 API :
procedure TForm1.FormCreate(Sender: TObject);begin FCnAPIHook := TCnInProcessAPIHook.Create(Self); FCnAPIHook.DllFunction := ’MessageBoxA’;//需要 HOOK 的 API FCnAPIHook.DllName := ’User32.dll’;//API所属动态库名称 FCnAPIHook.ParamCount := 4; FCnAPIHook.Mutex := True; FCnAPIHook.RestoreWhenOnHook := True; FCnAPIHook.OnAPIHookProc := CnHookAPI1APIHookProc;//指定响应事件end;
(3)开始 HOOK 代码:
procedure TForm1.Button2Click(Sender: TObject);begin FCnAPIHook.Active := True;end;
终止 HOOK 代码:
procedure TForm1.Button3Click(Sender: TObject);begin FCnAPIHook.Active := False;end;
关于hookapi
所谓 HookAPI,就是改写程序的 IAT,再调用我自己写的用于替换原API函数的函数。在我们自己写的API函数中,我们可以进行我们想要的工作。之后呢,可以把原来的函数传回去,也可以不传回去,只要你设计好了就行。 而所谓调用自己的函数,就是把原函数参数都传给我的替换函数。我们就可以利用这些参数去干我们想做的事。而系统呢,我想由于微软设置的这个钩子的目的(我这么认为的),所以不会去检查替换函数是否就是原函数,只要参数、返回值符合条件就行,要不会出错。替换函数的返回值最好是原函数,否则有可能会出错 HookAPI时,exe程序起到的作用就是进行Hook,把dll注入到要Hook的程序,并且传回要挂接的进程的ID或者全局钩子,以便查询所要挂接的模块的IAT。如果不注入进去,系统不会让你去查询IAT的。DLL做的事情是确定要挂接哪个函数和这个函数在哪个DLL中等。
怎样HOOK API啊
要使用全局钩子,做成DLL文件,可以用IAT Hook,也可以用inline hookiat hook相对简单,但只有在导入表中明确调用的api才能被hook,如果是用LoadLibrary加载的api就不能被Hookinline hook则没有这个限制,但它需要硬编码(汇编中的jmp指令),难免有系统相关性
我是电脑迷,常看到API hook,请问什么用法是什么意思啊
1、API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。API除了有应用“应用程序接口”的意思外,还特指 API的说明文档,也称为帮助文档。2、也就是说,Windows 这个多作业系统除了协调应用程式的执行、分配内存、管理系统资源…之外, 她同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗、描绘图形、使用周边设备…等目的,由于这些函数服务的对象是应用程式, 所以便称之为 Application Programming Interface,简称 API 函数。WIN32 API也就是MicrosoftWindows 32位平台的应用程序编程接口。 凡是在 Windows 工作环境底下执行的应用程式, 都可以调用Windows API。