2024年9月apihook教程(如何使用Detour3.0来进行相应的API HOOK开发)

 更新时间:2024-09-21 06:39:39

  ⑴apihook教程(如何使用Detour.来进行相应的APIHOOK开发

  ⑵如何使用Detour.来进行相应的APIHOOK开发

  ⑶反编译一个class文件:jadexample.class,会生成example.jad,用文本器打开就是java源代码指定生成源代码的后缀名:jad-sjavaexample.class,生成example.java改变生成的源代码的名称,可以先使用-p将反编译后的源代码输出到控制台窗口,然后使用重定向,输出到文件:jad-pexample.class》myexample.java把源代码文件输出到指定的目录:jad-dnewdir-sjavaexample.class,在newdir目录下生成example.java把packages目录下的class文件全部反编译:jad-sjavapackages/*.class把packages目录以及子目录下的文件全部反编译:jad-sjavapackages/**/*.class,不过你仍然会发现所有的源代码文件被放到了同一个文件中,没有按照class文件的包路径建立起路径把packages目录以及子目录下的文件全部反编译并建立和java包一致的文件夹路径,可以使用-r命令:jad-r-sjavapackages/**/*.class当重复使用命令反编译时,Jad会提示“whetheryouwanttooverwriteitornot”,使用-o可以强制覆盖旧文件

  ⑷C#中,如何HOOK一个API函数!

  ⑸HOOKAPI是一个永恒的话题,如果没有HOOK,许多技术将很难实现,也许根本不能实现。这里所说的API,是广义上的API,它包括DOS下的中断,WINDOWS里的API、中断服务、IFS和NDIS过滤等。比如大家熟悉的即时翻译软件,就是靠HOOKTextOut()或ExtTextOut()这两个函数实现的,在操作系统用这两个函数输出文本之前,就把相应的英文替换成中文而达到即时翻译;IFS和NDIS过滤也是如此,在读写磁盘和收发数据之前,系统会调用第三方提供的回调函数来判断操作是否可以放行,它与普通HOOK不同,它是操作系统允许的,由操作系统提供接口来安装回调函数。甚至如果没有HOOK,就没有病毒,因为不管是DOS下的病毒或WINDOWS里的病毒,都是靠HOOK系统服务来实现自己的功能的:DOS下的病毒靠HOOKINT来感染文件(文件型病毒,靠HOOKINT来感染引导扇区(引导型病毒;WINDOWS下的病毒靠HOOK系统API(包括RING层的和RING层的,或者安装IFS(CIH病毒所用的方法来感染文件。因此可以说“没有HOOK,就没有今天多姿多彩的软件世界”。由于涉及到专利和知识产权,或者是商业机密,微软一直不提倡大家HOOK它的系统API,提供IFS和NDIS等其他过滤接口,也是为了适应杀毒软件和防火墙的需要才开放的。所以在大多数时候,HOOKAPI要靠自己的力量来完成。HOOKAPI有一个原则,这个原则就是:被HOOK的API的原有功能不能受到任何影响。就象医生救人,如果把病人身体里的病毒杀死了,病人也死了,那么这个“救人”就没有任何意义了。如果你HOOKAPI之后,你的目的达到了,但API的原有功能失效了,这样不是HOOK,而是REPLACE,操作系统的正常功能就会受到影响,甚至会崩溃。HOOKAPI的技术,说起来也不复杂,就是改变程序流程的技术。在CPU的指令里,有几条指令可以改变程序的流程:JMP,CALL,INT,RET,RETF,IRET等指令。理论上只要改变API入口和出口的任何机器码,都可以HOOK,但是实际实现起来要复杂很多,因为要处理好以下问题:,CPU指令长度问题,在位系统里,一条JMP/CALL指令的长度是个字节,因此你只有替换API里超过个字节长度的机器码(或者替换几条指令长度加起来是字节的指令,否则会影响被更改的小于个字节的机器码后面的数条指令,甚至程序流程会被打乱,产生不可预料的后果;,参数问题,为了访问原API的参数,你要通过EBP或ESP来引用参数,因此你要非常清楚你的HOOK代码里此时的EBP/ESP的值是多少;,时机的问题,有些HOOK必须在API的开头,有些必须在API的尾部,比如HOOKCreateFilaA(),如果你在API尾部HOOKAPI,那么此时你就不能写文件,甚至不能访问文件;HOOKRECV(),如果你在API头HOOK,此时还没有收到数据,你就去查看RECV()的接收缓冲区,里面当然没有你想要的数据,必须等RECV()正常执行后,在RECV()的尾部HOOK,此时去查看RECV()的缓冲区,里面才有想要的数据;,上下文的问题,有些HOOK代码不能执行某些操作,否则会破坏原API的上下文,原API就失效了;,同步问题,在HOOK代码里尽量不使用全局变量,而使用局部变量,这样也是模块化程序的需要;,最后要注意的是,被替换的CPU指令的原有功能一定要在HOOK代码的某个地方模拟实现。下面以ws_.dll里的send()为例子来说明如何HOOK这个函数:Exportedfn():send-Ord:h地址机器码汇编代码:AAFpushebp//将被HOOK的机器码(第种方法:AAFBECmovebp,esp//将被HOOK的机器码(第种方法:AAFECsubesp,:AAFApushesi:AAFBpushedi:AAFCFFxoredi,edi:AAFEDCACAcmpdwordptr,AC//将被HOOK的机器码(第种方法:ABFDjeA:ABEDFleaeax,dwordptr:ABpusheax:ABEFFFFFcallA:ABBmpeax,edi:ABFCmovdwordptr,eax:ABCFCjneAAFE:ABFFpush:ABEFFFFFcallA:ABABFmovesi,eax:ABCBFcmpesi,edi:ABEFABjeAAFDF:ABBmoveax,dwordptr:ABpushebx:ABDDFCleaecx,dwordptr:ABBpushecx:ABCFFFpush:ABFDDleaecx,dwordptr:ABpushedi:ABpushedi:ABFFpush:ABFmovdwordptr,eax:ABABCmoveax,dwordptr:ABDpushecx:ABEApush:ABDDFleaecx,dwordptr:ABpushecx:ABFFpush:ABFmovdwordptr,eax:ABABCmoveax,dwordptr:ABDFFcall:ABBCEmovecx,esi:ABBDmovebx,eax:ABECFFFFFcallA//将被HOOK的机器码(第种方法:ABBDFcmpebx,edi:ABBBpopebx:ABCFFjneAAFD:ABBmoveax,dwordptr:ABFpopedi:ABEpopesi:ABCleave:ABCret下面用种方法来HOOK这个API:,把API入口的第一条指令是PUSHEBP指令(机器码x替换成INT(机器码x,然后用WINDOWS提供的调试函数来执行自己的代码,这中方法被SOFTICE等DEBUGER广泛采用,它就是通过BPX在相应的地方设一条INT指令来下断点的。但是不提倡用这种方法,因为它会与WINDOWS或调试工具产生冲突,而汇编代码基本都要调试;,把第二条movebp,esp指令(机器码BEC,字节替换为INTF指令(机器码CDF,然后在IDT里设置一个中断门,指向我们的代码。我这里给出一个HOOK代码:leaebp,//模拟原指令movebp,esp的功能pushfd//保存现场pushad//保存现场//在这里做你想做的事情popad//恢复现场popfd//恢复现场iretd//返回原指令的下一条指令继续执行原函数(AAF地址处这种方法很好,但缺点是要在IDT设置一个中断门,也就是要进RING。,更改CALL指令的相对地址(CALL分别在AB、AB、AB,但前面条CALL之前有一个条件跳转指令,有可能不被执行到,因此我们要HOOKAB处的CALL指令。为什么要找CALL指令下手?因为它们都是字节的指令,而且都是CALL指令,只要保持操作码xE不变,改变后面的相对地址就可以转到我们的HOOK代码去执行了,在我们的HOOK代码后面再转到目标地址去执行。假设我们的HOOK代码在A处,那么我们把AB处的CALL指令改为CALLA(原指令是这样的:CALLA而A处的HOOK代码是这样的:A:pushad//在这里做你想做的事情popadjmpA//跳转到原CALL指令的目标地址,原指令是这样的:callA这种方法隐蔽性很好,但是比较难找这条字节的CALL指令,计算相对地址也复杂。,替换AAFE地址上的cmpdwordptr,AC指令(机器码:DCACA,字节成为callAnopnopnopnopnop(机器码:EXXXXXXXX,字节在A的HOOK代码是:pushadmovedx,ACh//模拟原指令cmpdwordptr,Ampdwordptr,ACpushfd//在这里做你想做的事popfdpopadret这种方法隐蔽性最好,但不是每个API都有这样的指令,要具体情况具体操作。以上几种方法是常用的方法,值得一提的是很多人都是改API开头的个字节,但是现在很多杀毒软件用这样的方法检查API是否被HOOK,或其他病毒木马在你之后又改了前个字节,这样就会互相覆盖,最后一个HOOKAPI的操作才是有效的,

  ⑹易语言HOOKAPI教程要详细的说明

  ⑺#include#include“APIHook.h“externCAPIHookg_OpenProcess;//自定义OpenProcess函数#pragmadata_seg(“YCIShared“)HHOOKg_hHook=NULL;DWORDdwCurrentProcessId=;#pragmadata_seg()HANDLEWINAPIHook_OpenProcess(DWORDdwDesiredAess,BOOLbInheritHandle,DWORDdwProcessId){typedefHANDLE(WINAPI*PFNTERMINATEPROCESS)(DWORD,BOOL,DWORD);if(dwProcessId!=dwCurrentProcessId){return((PFNTERMINATEPROCESS)(PROC)g_OpenProcess)(dwDesiredAess,bInheritHandle,dwProcessId);}return;}//挂钩OpenProcess函数CAPIHookg_OpenProcess(“kernel.dll“,“OpenProcess“,(PROC)Hook_OpenProcess);////staticHMODULEModuleFromAddress(PVOIDpv){MEMORY_BASIC_INFORMATIONmbi;if(::VirtualQuery(pv,&mbi,sizeof(mbi))!=){return(HMODULE)mbi.AllocationBase;}else{returnNULL;}}staticLRESULTWINAPIGetMsgProc(intcode,WPARAMwParam,LPARAMlParam){return::CallNextHookEx(g_hHook,code,wParam,lParam);}BOOLWINAPISetSysHook(BOOLbInstall,DWORDdwThreadId){BOOLbOk;dwCurrentProcessId=dwThreadId;if(bInstall){g_hHook=::SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,ModuleFromAddress(GetMsgProc),);bOk=(g_hHook!=NULL);}else{bOk=::UnhookWindowsHookEx(g_hHook);g_hHook=NULL;}returnbOk;}API通过HOOKOpenProcess()实现进程防杀--:在WINDOWS操作系统下,当我们无法结束或者不知道怎样结束一个程序的时候,或者是懒得去找“退出”按钮的时候,通常会按“CTRL+ALT+DEL”呼出任务管理器,找到想结束的程序,点一下“结束任务”就了事了,呵呵,虽然有点粗鲁,但大多数情况下都很有效,不是吗?设想一下,如果有这么一种软件,它所要做的工作就是对某个使用者在某台电脑上的活动作一定的限制,而又不能被使用者通过“结束任务”这种方式轻易地解除限制,那该怎么做?无非有这么三种方法:.屏蔽“CTRL+ALT+DEL”这个热键的组合;.让程序不出现在任务管理器的列表之中;.让任务管理器无法杀掉这个任务。对于第一种方法,这样未免也太残酷了,用惯了“结束任务”这种方法的人会很不习惯的;对于第二种方法,在WINDOWSX下可以很轻易地使用注册服务进程的方法实现,但是对于WINDOWSNT架构的操作系统没有这个方法了,进程很难藏身,虽然仍然可以实现隐藏,但实现机制较为复杂;对于第三种方法,实现起来比较简单,我的作品:IPGate网址过滤器就是采用的这种方式防杀的,接下来我就来介绍这种方法。任务管理器的“结束任务”实际上就是强制终止进程,它所使用的杀手锏是一个叫做TerminateProcess()的WinAPI函数,我们来看看它的定义:BOOLTerminateProcess(HANDLEhProcess;//将被结束进程的句柄UINTuExitCode;//指定进程的退出码);看到这里,是不是觉得不必往下看都知道接下来要做什么:HookTerminateProcess()函数,每次TerminateProcess()被调用的时候先判断企图结束的进程是否是我的进程,如果是的话就简单地返回一个错误码就可以了。真的是这么简单吗?先提出一个问题,如何根据hProcess判断它是否是我的进程的句柄?答案是:在我的进程当中先获得我的进程的句柄,然后通过进程间通讯机制传递给钩子函数,与hProcess进行比较不就行了?错!因为句柄是一个进程相关的值,不同进程中得到的我的进程的句柄的值在进程间进行比较是无意义的。怎么办?我们来考察一下我的hProcess它是如何得到的。一个进程只有它的进程ID是独一无二的,操作系统通过进程ID来标识一个进程,当某个程序要对这个进程进行访问的话,它首先得用OpenProcess这个函数并传入要访问的进程ID来获得进程的句柄,来看看它的参数:HANDLEOpenProcess(DWORDdwDesiredAess,//希望获得的访问权限BOOLbInheritHandle,//指明是否希望所获得的句柄可以继承DWORDdwProcessId//要访问的进程ID);脉络渐渐显现:在调用TerminateProcess()之前,必先调用OpenProcess(),而OpenProcess()的参数表中的dwProcessId是在系统范围内唯一确定的。得出结论:要Hook的函数不是TerminateProcess()而是OpenProcess(),在每次调用OpenProcess()的时候,我们先检查dwProcessId是否为我的进程的ID(利用进程间通讯机制),如果是的话就简单地返回一个错误码就可以了,任务管理器拿不到我的进程的句柄,它如何结束我的进程呢?至此,疑团全部揭开了。由HookTerminateProcess()到HookOpenProcess()的这个过程,体现了一个逆向思维的思想。其实我当初钻进了TerminateProcess()的死胡同里半天出也不来,但最终还是蹦出了灵感的火花,注意力转移到了OpenProcess()上面,实现了进程防杀。喜悦之余,将这心得体会拿出来与大家分享。参考资料:版权所有,谢绝抄袭!!!!!!

  ⑻如何使用c#hook一个windowsapi函数

  ⑼hookapi有几种方式、导入表hook,枚举导入表,找到位置,替换函数指针即可,api加算法即可完成,因此c#也可以调用api来完成、inlinehook,找到函数地址,开头写入跳转指令跳转到新位置,新位置执行后可以选择调用原函数,原函数之前可以先执行被覆盖的指令在跳转到剩余函数指令上。api加算法即可完成,因此c#也可以调用api来完成

  ⑽delphi怎么HOOK指定API函数

  ⑾使用delphi语言来Hook指定的API函数,比较简便的方法如下:

  ⑿下载Pack小组的免费开源组件包VCL,将之安装到delphi系统中:

  ⒀在VCL组件包中,提供了?InProcessAPIHook单元,该单元文件提供了?TInProcessAPIHook组件,及其他相关的函数,提供了“进程内实现APIHook”功能:

  ⒁编写代码实现HOOK指定API函数的示例:

  ⒂uses?InProcessAPIHook;

  ⒃建立TInProcessAPIHook实例,并指定需要HOOK的API:

  ⒄procedure?TForm.FormCreate(Sender:?TObject);begin??FAPIHook?:=?TInProcessAPIHook.Create(Self);??FAPIHook.DllFunction?:=?’MessageBoxA’;//需要?HOOK?的?API???FAPIHook.DllName?:=?’User.dll’;//API所属动态库名称??FAPIHook.ParamCount?:=?;??FAPIHook.Mutex?:=?True;??FAPIHook.RestoreWhenOnHook?:=?True;??FAPIHook.OnAPIHookProc?:=?HookAPIAPIHookProc;//指定响应事件end;

  ⒅procedure?TForm.ButtonClick(Sender:?TObject);begin?FAPIHook.Active?:=?True;end;

  ⒆procedure?TForm.ButtonClick(Sender:?TObject);begin?FAPIHook.Active?:=?False;end;

  ⒇如何检测自己程序的API被HOOK了

  ⒈这个程序的原版大家自己找,名字就叫做API拦截教程。启动该程序后,按下拦截createprocess的按钮后,运行任何程序都会弹出运行程序的路径。稍微了解apihook的都了解,通常ring下hookapi的办法有三种,一是修改程序的iat表,使api调用跳向自己的函数而不是转向api入口。二是修改api入口的机器码。三是用创建远线程CreateRemoteThread的办法来完成。那么这个教程究竟用了什么先进手法呢?先运行一次,按下按钮后,果然explorer弹出了程序的路径。此时,你如果使用icesword类的可以查看程序模块的程序查看explorer的模块,你就会发现explorer里面多了个InterceptDll.dll的模块,当我们卸载了这个dll后,这个拦截的效果就没有了。看来这个程序的核心不是那个启动的程序,而是这个dll。现在让我们看看这个InterceptDll.dll到底做了什么。先使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件DUMPBINInterceptDll.dll/EXPROTS/OUT:InterceptDll.defordinalhintRVAnameInstallHookUninstallHook只有两个导出函数,看名字就知道,一个是安装钩子,一个卸载钩子。我们调用看看,结果连参数都不用,只要调用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的按钮,断下以后,一步一步跟踪。转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦

  ⒉VC如何hook任意api

  ⒊的确可以用detours库,不过现在关于这个比较系统的中文教程很少好,你还是找点代码示例来看,结合那些教程吧

  ⒋如何使用APIHOOK封包

  ⒌.子程序_启动子程序,整数型,,请在本子程序中放置动态链接库初始化代码.局部变量临时变量,HOOK.局部变量i,整数型’下面的动态链接库初始化代码,第一次加载DLL时才有效,也就是说只执行一次系统类别=取操作系统类别()进程伪句柄=取当前进程伪句柄()’请在下面加入要HOOK的API加入到HOOK列表(“ws_.dll”,“send”,&MySend)加入到HOOK列表(“ws_.dll”,“recv”,&MyRecv)加入到HOOK列表(“ws_.dll”,“WSARecv”,&MyWSARecv)’加入到HOOK列表(“user.dll”,“ExitWindowsEx”,&MyExitWindowsEx)’.......计次循环首(取数组成员数(HOOK),i)HOOKAPI(真,HOOK,i).计次循环尾()载入(窗口,,真)_临时子程序()’在初始化代码执行完毕后调用测试代码返回()’返回值被忽略。.子程序_临时子程序’本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。***注意不要修改本子程序的名称、参数及返回值类型。.子程序HOOK,,公开’===============下面是示例,只要注意新的API函数,要与原来的API函数的参数一样即可.子程序MySend,整数型.参数TSocket,整数型.参数Buf,文本型.参数len,整数型.参数flags,整数型.局部变量返回值,整数型.局部变量临时变量,整数型写到文件(“C:Send.TXT”,读入文件(“C:Send.TXT”)+到字节集(到文本(取现行时间()))+到字节集(#换行符)+到字节集(Buf)+到字节集(#换行符))临时变量=取API序号(“send”)HOOKAPI(假,HOOK,临时变量)返回值=send(TSocket,Buf,len,flags)HOOKAPI(真,HOOK,临时变量)返回(返回值)

  ⒍如何使用WINSOCKApihook拦截修改socket数据包

  ⒎下面重点介绍创建挡截WinSock外挂程序的基本步骤:()创建DLL项目,选择WinDynamic-LinkLibrary,再选择AnemptyDLLproject。()新建文件wsock.h,按如下步骤输入代码:①加入相关变量声明:HMODULEhModule=NULL;//模块句柄charbuffer;//缓冲区FARPROCproc;//函数入口指针②定义指向原WinSock库中的所有函数地址的指针变量,因WinSock库共提供多个函数,限于篇幅,在此就只选择几个常用的函数列出,有关这些库函数的说明可参考MSDN相关内容。//定义指向原WinSock库函数地址的指针变量。SOCKET(__stdcall*socket)(int,int,int);//创建Sock函数。int(__stdcall*WSAStartup)(WORD,LPWSADATA);//初始化WinSock库函数。int(__stdcall*WSACleanup)();//清除WinSock库函数。int(__stdcall*recv)(SOCKET,charFAR*,int,int);//接收数据函数。int(__stdcall*send)(SOCKET,constchar*,int,int);//发送数据函数。int(__stdcall*connect)(SOCKET,conststructsockaddr*,int);//创建连接函数。int(__stdcall*bind)(SOCKET,conststructsockaddr*,int);//绑定函数。......其它函数地址指针的定义略。()新建wsock.cpp文件,按如下步骤输入代码:①加入相关头文件声明:#include《windows.h》#include《stdio.h》#include“wsock.h“

  ⒏哪里可以学api劫持

  ⒐哔哩哔哩。API劫持主要是利用动态链接技术,通过预先加载SO,隐藏符号,是有由教程视频的,可以前往哔哩哔哩学习。ApiHook又叫做API劫持,也就是如果A程序调用了B.cll里面的C函数,我们可以做到当A调用C函数执行的时候,直接执行我们自己事先准备好的函数,之后我们在执行真正的C,当然我们可以不执行C或者更改C的参数。

您可能感兴趣的文章:

相关文章