Hook API

来源:互联网 发布:考研政治题库软件 编辑:程序博客网 时间:2024/06/04 18:33

17.6 应 用 实 例(1)
嵌入代码调用API

17.6 应 用 实 例(3)
17.6.2  在PE文件上添加执行代码

 

(1)
进程A 调用SetWindowsHookEx钩取全局/指定进程
SetWindowsHookEx回调函数A位于HookApi.dll里面
回调时会加载到 目标进程B 的地址空间内 (参考钩子插入DLL)

定位DLL:回调函数A在进程B的地址 = DLL在进程B加载地址 + (回调函数A在进程A的地址 - DLL在进程A加载地址)

函数A调用CallNextHookEx,目的只是让 进程B 加载DLL
加载DLL会自动调用入口函数C
DLL入口函数C:HOOK API

GetModuleHandle  ;取DLL模块句柄
.if eax==NULL
LoadLibrary  ;加载DLL,未必需要这样做
.endif
GetProcAddress  ;取API地址
ReadProcessMemory ;备份原API的前几个字节
VirtualQueryEx,Process, Papi,addr mbi,SIZEOF MEMORY_BASIC_INFORMATION ;返回API所在页面虚拟信息
invoke VirtualProtectEx,Process, mbi.BaseAddress,8h,PAGE_EXECUTE_READWRITE,addr mbi.Protect ;页面改为可读写
WriteProcessMemory ;改写内存为跳转,跳至my函数(如何得知my函数在目标进程中的地址?)
invoke VirtualProtectEx,Process,mbi.BaseAddress,8h,PAGE_EXECUTE_READ,addr mbi.Protect ;改回只读模式
还原API时,重复上面4个函数,掉转修改的地址

 

/**
备份函数所在的整个DLL /或者/ 不用DLL,直接将HOOK API代码写入目标进程
用OpenProcess打开进程,获得最大权限
用VirtualAllocEx在目标进程里申请空间
ReadProcessMemory读出整个DLL数据
用VirtualAllocEx申请内存空间,WriteProcessMemory写入
备份API地址=备份空间地址 + 原函数地址 - 原DLL基地址
**/

 


GetModuleInformation  psapi.dll里的可以取得模块信息,DLL的基地址,大小等都可以取得
GetModuleHandle  获得当前调用模块的句柄,当前模块有可能是个dll,一般用于函数调用。  
GetCurrentProcess 获得当前进程的HANDLE,你可以用HANDLE进行一些操作,一般用于对自己进程本身的操作。  
OpenProcess  根据进程ID打开一个进程(其实是按照你的参数获得相应的进程操作权限),一般用于对其它进程的控制。

 


(2)
程序加壳,只看到外壳所用的输入表
手动加载的DLL,在输入表中看不到所用到的API

一、进程A 找到系统中指定的进程。
CreateToolhelp32Snapshot 能获取系统现有进程的快照,快照的句柄返回在Eax中。
Process32First   获取快照中的第一个进程有关信息,信息返回在一个结构中。 
Process32Next   用来循环获取进程信息。


二、搜取进程的导入表,找到指定的API。
三、修改指定API的FirstThunK。

搜索载入的PE文件格式,读取输入表内容,得到了要HOOK的API的入口地址的RVA
ReadProcessMemory ;读取保存API的入口地址的RVA
VirtualQueryEx  ;返回页面虚拟信息
VirtualProtectEx ;修改为可读写模式
WriteProcessMemory ;修改API的入口地址的RVA
VirtualProtectEx ;修改为只读模式


四、写操作指令到目标进程空间。

 

 

(3)
PROC pfnOrig = GetProcAddress(GetModuleHandle("Kernel32"), "ExitProcess");
取Kernel32.dll里面的ExitProcess API地址

HMODULE hmodCaller = GetModuleHandle("DataBase.exe");
取运行中程序DataBase.exe的模块句柄

利用模块句柄查内存地址,根据PE格式查出IAT是否包含ExitProcess API地址

WriteProcessMemory
改写API地址