# process.apiHook 库模块帮助文档

## process 成员列表 <a id="process" href="#process">&#x23;</a>

### process.apiHook <a id="process.apiHook" href="#process.apiHook">&#x23;</a>
在外部32位进程内安装 API 函数钩子，  
作用仅仅是安装，需要要用 C,或 C++ 写 32位 dll 钩子。  
可以在 aardio 中通过远程 API 调用钩子 DLL 中的函数。  
具体用法可参考 process.ruffle 扩展库源码。  

进程内钩子请改用 thread.apiHook,  
线程内钩子请改用 raw.apiHook

创建 API Hook 工具

### process.apiHook() <a id="process.apiHook" href="#process.apiHook">&#x23;</a>
[返回对象:processApihookObject](#processApihookObject)

### process.apiHook(执行文件,命令行参数,{suspended=true}) <a id="process.apiHook" href="#process.apiHook">&#x23;</a>
运行执行文件或关联文档，并返回 API Hook 安装工具。  
启动后暂停进程，可在安装钩子以后调用 resume() 函数继续运行进程

### process.apiHook(执行文件,命令行参数,启动参数) <a id="process.apiHook" href="#process.apiHook">&#x23;</a>
运行执行文件或关联文档，并返回 API Hook 安装工具。  
也可以仅指定第二个参数运行纯命令行  
启动参数为 process.STARTUPINFO 结构体,可选,  
可以使用普通table对象替代启动参数.将自动转换为STARTUPINFO结构体

### process.apiHook(进程ID) <a id="process.apiHook" href="#process.apiHook">&#x23;</a>
使用进程 ID 打开进程，并返回 API Hook 安装工具。  
失败则返回 null,以及错误信息.

## processApihookObject 成员列表 <a id="processApihookObject" href="#processApihookObject">&#x23;</a>

### processApihookObject.freeLibrary(模块地址) <a id="processApihookObject.freeLibrary" href="#processApihookObject.freeLibrary">&#x23;</a>
卸载DLL

### processApihookObject.getProcAddress(模块地址,"API函数名") <a id="processApihookObject.getProcAddress" href="#processApihookObject.getProcAddress">&#x23;</a>
查找外部进程API函数,返回函数地址

### processApihookObject.install("拦截DLL模块名","拦截API函数名","钩子模块名","钩子API函数名") <a id="processApihookObject.install" href="#processApihookObject.install">&#x23;</a>
安装钩子,返回HookInfo对象  
也可以直接写拦截函数地址或钩子函数地址,  
但函数地址必须是目标进程内的函数地址,不可使用aardio函数,  

注意是在目标进程内调用LoadLibrary搜索DLL，  
默认搜索路径包含目标EXE所在目录，而非当前EXE所在目录  
但以斜杠开头的路径aardio会在当前进程中解析为完整路径

### processApihookObject.install() <a id="processApihookObject.install" href="#processApihookObject.install">&#x23;</a>
[返回对象:procssHookInfoObject](#procssHookInfoObject)

### processApihookObject.loadLibrary("DLL模块名") <a id="processApihookObject.loadLibrary" href="#processApihookObject.loadLibrary">&#x23;</a>
在目标进程中加载DLL,返回数值类型句柄

### processApihookObject.process <a id="processApihookObject.process" href="#processApihookObject.process">&#x23;</a>
进程对象,  

[返回对象:processObject](https://www.aardio.com/zh-cn/docs/library-reference/process/_.html#processObject)

### processApihookObject.resume() <a id="processApihookObject.resume" href="#processApihookObject.resume">&#x23;</a>
继续运行进程

### processApihookObject.unInstall(HookInfo) <a id="processApihookObject.unInstall" href="#processApihookObject.unInstall">&#x23;</a>
卸载钩子,  
传入参数必须是 install函数的返回值  

要注意的问题:  
1、如果钩子函数正在回调中卸载自身会导致目标进程崩溃,  
1、卸载钩子时目标函数不能正在使用中,  
aardio会先暂停目标进程主线程，卸载完再恢复,  
但目标进程可能是多线程的,请避免目标函数正在被调用时去释放

### processApihookObject.unInstallAll() <a id="processApihookObject.unInstallAll" href="#processApihookObject.unInstallAll">&#x23;</a>
释放所有钩子,  
该函数会在对象回收时自动调用  
如果不希望在进程关闭时卸载钩子，请将此函数赋值为null

## procssHookInfoObject 成员列表 <a id="procssHookInfoObject" href="#procssHookInfoObject">&#x23;</a>

### procssHookInfoObject.addrHookFunction <a id="procssHookInfoObject.addrHookFunction" href="#procssHookInfoObject.addrHookFunction">&#x23;</a>
钩子函数地址

### procssHookInfoObject.addrProtect <a id="procssHookInfoObject.addrProtect" href="#procssHookInfoObject.addrProtect">&#x23;</a>
函数内存保护属性

### procssHookInfoObject.addrTargetFunction <a id="procssHookInfoObject.addrTargetFunction" href="#procssHookInfoObject.addrTargetFunction">&#x23;</a>
被拦截函数地址

### procssHookInfoObject.addrTrampoline <a id="procssHookInfoObject.addrTrampoline" href="#procssHookInfoObject.addrTrampoline">&#x23;</a>
用于调用原函数的跳板地址

### procssHookInfoObject.hHookModule <a id="procssHookInfoObject.hHookModule" href="#procssHookInfoObject.hHookModule">&#x23;</a>
钩子模块地址

### procssHookInfoObject.hModule <a id="procssHookInfoObject.hModule" href="#procssHookInfoObject.hModule">&#x23;</a>
被拦截模块地址

### procssHookInfoObject.restoreOpCodeSize <a id="procssHookInfoObject.restoreOpCodeSize" href="#procssHookInfoObject.restoreOpCodeSize">&#x23;</a>
安装钩子覆盖指令长度
