EasyHook-FileMonitorHook
创建远程文件监视器
在本教程中,我们将使用EasyHook创建一个远程文件监视器。
我们将介绍如何:
根据进程ID将托管程序集注入现有目标进程,使用可执行文件路径将托管程序集注入新创建(并暂停)的进程
在远程进程中创建本地挂钩以监视3个文件操作(CreateFile,ReadFile和WriteFile),使用.NET进程间通信(IPC)将报告文件访问回主控制台应用程序.
在本教程中,我们将创建一个包含两个项目的解决方案:
FileMonitor:一个C#控制台应用程序;
FileMonitorHook:包含钩子逻辑和IPC接口的C#类库。该组件是我们的注入payload。
Remote hooking 概述
远程hook通常先用“injector”向目标进程注入一个payload,利用这个payload再安装我们的钩子。
由此,EasyHook库提供了“EasyHook.RemoteHooking”静态类和“EasyHook.IEntryPoint”接口。
- EasyHook.RemoteHooking.Inject:
向指定的进程注入特定的32位/64位payload指令集,提供的参数将被传递给被注入的库。 - EasyHook.RemoteHooking.CreateAndInject:
从提供的可执行路径和命令行以挂起状态创建一个新进程,然后以“Inject”方式注入一个特定的32位/64位payload。 - EasyHook.RemoteHooking.WakeUpProcess:
与payload/注入库中的CreateAndInject结合使用,以在准备就绪时唤醒进程。 - EasyHook.RemoteHooking.IpcCreateServer
:
一个用来初始化injector和host的IPC通道的辅助方法。 - EasyHook.RemoteHooking.IpcConnectClient
:
一个用来在注入完成后将客户端连接至IPC通道的辅助方法。(被运行在目标进程中的注入的dll所调用) - EasyHook.IEntryPoint:
payload指令集必须包含一个public类来实现此接口。
待完成注入后payload将使用EasyHook.LocalHook来创建钩子。
EasyHook.RemoteHooking.Inject
- 1. EasyHook.RemoteHooking.Inject 序列化配置,包括payload集合的路径和参数。
- 2. 向指定的目标进程中注入原生EasyHook32.dll或EasyHook64.dll依赖于它本身是32位或64位。如果有必要的话,EasyHook将自动使用EasyHookSvc32/64.exe来帮助程序将32位注入到64位中或反过来。 EasyHook.RemoteHooking.Inject 将会等待,直到它超时或者它已经发出注入已完成/失败的信号。
– 此时已运行在目标进程中 –
3. EasyHook32/64.dll通过加载EasyLoad32/64.dll来完成“managed injection”
(EasyLoad尝试创建一个新的AppDomain,以便可以卸载注入库)
(EasyHook32/64.dll发出EasyHook.RemoteHooking.Inject注入完成的信号)4. EasyLoad将托管程序集EasyHook.dll加载到目标进程并调用EasyHook.InjectionLoader.Main方法。
5. EasyHook.InjectionLoader反序列化配置,加载有效负载程序集并查找与提供给EasyHook.RemoteHooking.Inject调用的参数相匹配的EasyHook.IEntryPoint。
6. 如果找到,就会实例化payload集合中相匹配的EasyHook.IEntryPoint并最终调用对应的Run方法。
7. Payload的Run方法安装若干钩子。
最后当Run方法退出后,EasyLoad将会尝试卸载AppDomain
EasyHook.RemoteHooking.CreateAndInject
- 从提供的可执行路径和命令行以挂起状态创建一个新进程。
- 按照EasyHook.RemoteHooking.Inject的运行逻辑。
- 被创建的进程会保持被挂起的状态直到payload调用RemoteHooking.WakeUpProcess。