如何监控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官方使用指南

http://www.rohitab.com/category/api-monitor-tutorials

posted @ 2023-04-18 10:00  zhaotianff  阅读(4791)  评论(0编辑  收藏  举报