博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows上的IATHook学习
阅读量:6084 次
发布时间:2019-06-20

本文共 2169 字,大约阅读时间需要 7 分钟。

简单Demo

IATHook原理

IATHook 是指 hook 某个进程的导入表函数,当程序运行起来后 IAT 会填入该函数实际的内存地址,这个地址通常都在加载的某个 dll 内存中!然后我们修改这个地址值为我们自写函数所在的地址,当系统调用这个 IAT 函数时,就会跳转到我们所写的函数

代码

#include 
#include
#include
int WINAPI MessageBoxPro(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType){ printf("IATHook Success\n"); system("pause"); return 0; }int main(){ HMODULE hmod; PIMAGE_DOS_HEADER pdos; PIMAGE_NT_HEADERS pnt; PIMAGE_OPTIONAL_HEADER popt; PIMAGE_IMPORT_DESCRIPTOR piid; PIMAGE_THUNK_DATA pfuncname_addr,pfunc_addr; DWORD dwOldProtect,dwNewProtect; DWORD* repAddr = (DWORD *)MessageBoxPro; // 务必得转换一下 hmod = GetModuleHandle(NULL); pdos = (PIMAGE_DOS_HEADER)hmod; pnt = (PIMAGE_NT_HEADERS)((PBYTE)hmod + pdos->e_lfanew); popt = (PIMAGE_OPTIONAL_HEADER)(&(pnt->OptionalHeader)); piid = (PIMAGE_IMPORT_DESCRIPTOR)((BYTE *)hmod+popt->DataDirectory[1].VirtualAddress); // Base_addr + RVA_addr MessageBox(NULL,"HelloWorld","Title",MB_OK); while(piid->FirstThunk){ pfuncname_addr = (PIMAGE_THUNK_DATA)((BYTE *)hmod + piid->OriginalFirstThunk); pfunc_addr = (PIMAGE_THUNK_DATA)((BYTE *)hmod + piid->FirstThunk); // char* pdll_name = (char *)((BYTE *)hmod + piid->Name); // printf("%s\n",pdll_name); while(pfuncname_addr->u1.Function){ char* func_name = (char *)((BYTE *)hmod + pfuncname_addr->u1.AddressOfData+2); DWORD *lpAddr = (DWORD *)&pfunc_addr->u1.AddressOfData; if(!strcmp(func_name,"MessageBoxA")){ VirtualProtect(lpAddr,4,PAGE_EXECUTE_READWRITE,&dwOldProtect); WriteProcessMemory((HMODULE)-1,lpAddr,&repAddr,4,NULL); // 修改地址的第一种方式 // *lpAddr = repAddr; // 修改地址的第二种方式 } VirtualProtect(lpAddr,4,dwOldProtect,&dwNewProtect); pfuncname_addr++; pfunc_addr++; } piid++; } MessageBox(NULL,"HelloWorld","Title",MB_OK); return 0;}

说明

修改 IAT 地址可以赋值修改,也还可以用WriteProcessMemory函数修改!千万别忘了用VirtualProtect来修改内存页的属性,不然无法成功写入!需要注意函数名的类型转换以及指针的合理使用!最后就是尽量编译成 32 位程序,如要编译成 64 位程序需要自行修改变量类型,当然不改也是可以运行的!

运行结果

进阶Demo

待续...

END

转载地址:http://imkwa.baihongyu.com/

你可能感兴趣的文章
scikit-learn包的学习资料
查看>>
安卓开发学习笔记—————《第一行代码》第四章 探究碎片 (Fragment和RecyclerView实践)...
查看>>
异步与并行~CancellationTokenSource对线程的作用
查看>>
C#~异步编程再续~你必须要知道的ThreadPool里的throw
查看>>
Lind.DDD.UoW~方法回调完成原子化操作
查看>>
需求分析
查看>>
JS _函数作用域及变量提升
查看>>
SharePoint 2010 动态创建calculate column
查看>>
iOS程序员 如何做到升职加薪,5年 开发经验 码农 笔记送给你!
查看>>
win7电脑关机时间长怎么办
查看>>
MySQL配置文件mysql.ini参数详解
查看>>
struts2中Action到底是什么,怎么理解
查看>>
C++小思
查看>>
Longest Substring Without Repeating Characters
查看>>
Using the memcached telnet interface
查看>>
as3 AIR 添加或删除ApplicationDirectory目录下文件
查看>>
浅析伪数组
查看>>
验证码生成 点击刷新 ajax校验
查看>>
THINKPHP 默认模板路径替换
查看>>
mysql5.7 windows7编码统一utf-8
查看>>