本文使用注入DLL设置硬件断点以及模拟执行指令的方式来记录API调用。流程如下:

1,将EXE自身复制一份,修改入口点和DLL标志,变成xixihaha.dll。
2,将xixihaha.dll注入目标进程。
3,DLL会挂钩以下5个函数:

代码:
VOID HookLdrLoadDll();  //分析新载入模块的导出表
VOID HookCsrNewThread();  //对新创建的线程下硬件断点
VOID HookKiUserExceptionDispatcher(VOID); //处理异常
VOID HookZwGetContextThread(); //防止硬件断点检测1
VOID HookZwSetContextThread(); //防止清除硬件断点
4,对所有模块的导出表进行分析,将所有信息记录到全局数组,并对第一个要监视的API下硬件断点。
5,硬件断点断下来后,分析API的返回地址,如果是EXE调用该API,说明要监视的第一个API被调用,开始模拟执行EXE的指令。
6,如果不是EXE调用,则对返回地址下断,执行到返回后,再对第一个API下断。
7,模拟执行指令过程中,如果EIP不在EXE内,则分析此地址对应的API名称,获取第二个API。

PS:
1,模拟执行指令没有加入大循环代码块的分析,否则,速度应该会再快一点
2,通过Hook KiUserExceptionDispatcher来处理异常,而不是通过调试器和设置ExceptionHandler,可以避免目标程序的大部分检测。首先分析异常是否是我们要处理的类型,如果是,直接处理然后返回(不再调用原始的异常处理),如果不是,首先将DRX寄存器清掉,然后再调用原始的异常处理,调用完毕后,再将DRX寄存器内容恢复。

exile.rar