如何监控Windows API调用?API Monitor简易使用教程
很早就知道有Api Monitor这个软件,可以监控Windows API调用,但当时没有正式的使用场景,所以也没怎么在意。
最近又用到这个软件,做个系统的总结。有意思的是,这玩意儿在CSDN上是收费下载的。还把评论关了
API Monitor
简介
API Monitor 可以监视、控制应用程序以及服务进行的 Windows API 调用。分为32位和64位版本,32位版本只能监控32位程序,64位只能监控64位程序。
软件官网:http://www.rohitab.com/apimonitor
下载地址:http://www.rohitab.com/downloads
核心功能
* 支持64位
* 应用程序摘要语法高亮
* 支持13,000+ API , 1,300+ COM 接口
* 支持Structures, Unions, Enums 和Flags解码显示
* 可视化缓冲区数据
* 树型显示API调用层次
* 解码参数和返回值
* 断点
* 监控DLL导出函数
* 编辑进程内存数据
* 调用筛选
* COM接口监控
* 自带ErrorFormat功能
* 调用堆栈
* 界面多种布局设置
* 进程查看
* 服务监控
* 线程显示
以前用过一个叫做 minhook的库,项目地址:https://github.com/TsudaKageyu/minhook
x86/x64 API Hooking Library for Windows
这个库可以把API Hook下来,在调用API时,可以先执行自己的代码,再执行API函数。
API Monitor应该也是类似的原理,不过API Monitor的强大之处远不止这些,向大佬学习就完事了。
下面进入主题
如何监控API函数调用
这里我以CreateFile函数为例进行演示。
首先我创建一个MFC工程(MonitorAPI),添加一个按钮和文本框(IDC_EDIT1)。当点击按钮时,调用CreateFile创建一个文件。
按钮事件
1 void CMonitorAPIDlg::OnBnClickedButton1() 2 { 3 CString str; 4 GetDlgItemText(IDC_EDIT1, str); 5 CreateFile(str.GetBuffer(0), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 6 }
在API Filter这里可以选择要进行监听的 API函数,
API Filter列表里的这些API函数都进行了分类,方便查找 。
如果要快速定位 API,可以单击搜索按钮,输入要监听的API函数,
这里以CreateFile为例
钩选CreateFile后,再将进程添加到监听列表
添加进程到监听列表有两种方式:
针对已经运行的进程,直接在进程列表双击添加到监控列表即可
如果需要单独运行需要监控的程序,在进程监控这里点击 监控新进程 按钮即可。
监听开始后,单击创建文件按钮,可以在右边的摘要中看到 CreateFile的相关调用信息
参数这里可以看到调用的参数
缓冲区这里缓冲区数据
如何编辑内存数据
还是以上面的MFC程序为例,假设我们在界面上输入的是D:\a.txt,我们通过修改内存数据,改变成其它的路径。
首先在左边的API Fiter这里,找到CreateFileW函数,右键 菜单中选择 Breakpoint (断点)-> Before Call(在调用前)
然后开始监听程序,在界面上输入 D:\a.txt,点击创建按钮,API Monitor会弹出 如下对话框
如果新值不会超出原来分配的缓冲区大下,右键 选择Edit Value。可以直接编辑value。
例如我们将D:\a.txt修改成D:\e.txt。(理论上这样是没问题,但建议还是申请新内存吧)。
修改完成后点击 Continue 按钮,函数执行后,可以看到在D盘创建一个e.txt文件,而不是a.txt文件。
我们也可以直接申请新内存,然后编辑数据,再将 lpFileName参数的地址修改为新地址。
右键菜单,选择 Edit Memory。
然后选择New,新开辟一块内存空间
大小根据自己需求填写。申请 出来的新内存空间如下:
此时我们再将自己需要的值编辑进去,如 D:\helloworld.txt
编辑完成后,我们将地址复制下来,单击 Close 关闭。再编辑 lpFileName的值,替换成新地址的值
再单击 Continue,可以看到在D盘创建了一个helloworld.txt的文件
如何监控DLL中的函数
首先我们使用Visual Studio 创建一个DLL工程,增加一个导出函数,如下
1 #include<Windows.h> 2 3 extern "C" __declspec(dllexport) void MessageBoxShow(LPTSTR str) 4 { 5 MessageBox(NULL, str, L"title", MB_OK); 6 }
然后继续使用上面的MFC工程,增加一个按钮 【消息框】,在按钮事件里加载上面的DLL,并调用导出函数。
1 void CMonitorAPIDlg::OnBnClickedButton2() 2 { 3 CString str; 4 GetDlgItemText(IDC_EDIT1, str); 5 6 HMODULE hModule = LoadLibrary(L"ApiMonitorDll.dll"); 7 if (hModule) 8 { 9 funcMessageBoxShow func = (funcMessageBoxShow)GetProcAddress(hModule, "MessageBoxShow"); 10 11 if (func) 12 func(str.GetBuffer(0)); 13 14 FreeLibrary(hModule); 15 } 16 }
再回到Api Monitor,在左上角,在Api Filter这里找到External DLL
单击Add External DLL,添加上面创建的DLL,然后在 MessageBoxShow函数前断点。
此时再运行上面创建的MFC程序,单击 【消息框】按钮,即可进入断点。
演示过程中使用的代码,点击 这里 下载
参考:
Api Monitor官方使用指南