. Win32Exts for API_Monitor 是Win32Exts项目组提供的一个强大的API 监视工具,
相较于流行的 API_Monitor,它具有解码功能强大、灵活二次扩展开发、与其他脚本语言完美融合交互 等等优异的特性。
. https://github.com/tankaishuai/Win32Exts_for_API_Monitor
开发此项目的目的是为了弥补当下流行的 API Monitor 的一些不足之处:
例如笔者在 Win10 x64 管理员权限下监控 API RegOpenKeyExW,API Monitor 并没有正确的工作。
相反,Win32Exts_for_API_Monitor 却工作的很好。
Win32Exts_for_API_Monitor 却可以支持解码各种复杂的数据类型以及 自定义结构体!! 格式表示,
同时对于预定义不支持的类型也提供了插件扩展方式支持之。
例如以下形式的导出函数:
BOOL PathAppendW(__inout WCHAR *pszPath, LPCWSTR szSubPath);
由于参数 pszPath 是一个输入输出型参数,API Monitor 并不能正确拿到函数调用之后 pszPath 是什么数据内容。
Win32Exts_for_API_Monitor 可以正确监控API调用之前,以及调用之后的参数、返回值 信息。
同时线程信息、LastError信息也一应俱全。
实现阻止指定的API调用,并且伪造一个指定的返回码 以返回调用上下文。例如 以下阻止 RegOpenKeyExW 直接返回 0x233:
当然,API Monitor 也有一些优点是 Win32Exts_for_API_Monitor所不具备的,具体体现在:
(1) 预定义了大量的API声明,但也限制了其灵活性。
Win32Exts_for_API_Monitor 并不提供除示例外的任何API声明, 可以非常灵活的按照输出格式自由配置。
(2) 友好的用户界面,目前 Win32Exts_for_API_Monitor 并不提供一个完整的用户界面,
捕获的函数调用信息 以控制台、日志、或者调试输出的方式记录。
鉴于此,大家可以酌情选择使用之。
API Monitor 的API配置是以XML形式保存的,例如:
比较复杂,Win32Exts_for_API_Monitor 仅仅只需要在win32exts.ini 中按如下格式记录参数类型符即可:
或
或
其中 [] 表示可选参数,
以上配置中逗号(,)后面的 in_args、out_args 是参数类型描述,预定义的类型描述见下表:
================================================
a : LPSTR (gbk)
t : LPSTR (utf-8)
w或s : LPWSTR
i或d : int
u : unsigned int
x : hex
b : true/false
c : char
h : short
l : int64
f : float
g : double
v : VARIANT *
k : UNICODE_STRING *
m : BSTR
p : hex
@ : 注册表 hkey
#: 窗口 hwnd
$ : 文件handle
| : 进程 handle
! : 进程 id
~ :线程 handle
. : 模块 hDll
< : 局部atom
`> : 全局atom
? : IUnknown *
& : 二进制(buf, size)
% : 二进制(buf)
' : time_t
" : FILETIME *
[struct_name] : 自定义结构体,结构体 struct_name 的各个成员需定义在:
win32exts.ini 的 [StructFmt] 下面。支持结构体各种嵌套,同时对于循环链表也能够正确的输出。
==================================================
另外,字母大小写有区别,小写表示按值传递,而大写表示按引用方式传递。例如监控:
1=psapi!GetModuleFileNameExW,|pwu
会输出完整的 进程名、模块句柄、模块名、缓冲区尺寸。
配合脚本语言,可以支持运行时动态的添加、修改该API监控列表。
执行批处理:
Api_Monitor 16进制的进程窗口句柄
或者直接运行:
rundll32 "%cd%\win32exts.dll",MyAnyHookApi_RunDll32 --hwnd=16进制的进程窗口句柄
即可开始监控。
对于无窗口进程,则可以使用下列命令行:
rundll32 "%cd%\win32exts.dll",MyAnyHookApi_RunDll32 –thread=目标线程Id –type=钩子类型
由于 Win32Exts for Lua/JavaScript/VBScript/Python等等过于复杂,可实现的功能非常丰富,
需要了解的可联系作者(tankaishuai@126.com)沟通。
例如以下Lua脚本直接在目标进程注入一个扩展模块:
编写一个常规 Dll:MyAnyHookDisplayCall.dll 实现并导出下列接口:
bool MyAnyHookDisplayCall(
. LPCSTR szFuncName,
. bool bIsCallRet,
. INT_PTR *pArgs,
. LPCSTR *pszFmt,
. __inout LPSTR *lpszOutText){
. … …
}
即可实现自定义的参数类型解码输出。如有需要,具体开发细节可联系作者。