使用API Monitor探测C++程序在调用HtmlHelp接口打开.chm文件时传入了哪些参数

目录

1、API Monitor介绍

2、为何要使用API Monitor工具?

HtmlHelp%E5%87%BD%E6%95%B0%E5%9C%A8API%E5%88%97%E8%A1%A8%E5%87%BD%E6%95%B0%E4%B8%AD%E6%89%BE%E4%B8%8D%E5%88%B0%EF%BC%8C%E5%B0%86%E6%89%80%E5%9C%A8%E6%A8%A1%E5%9D%97%E4%BD%9C%E4%B8%BA%E5%A4%96%E9%83%A8Extern%20DLL%E6%A8%A1%E5%9D%97%E6%B7%BB%E5%8A%A0%E5%88%B0API%20Monitor%E4%B8%AD-toc" style="margin-left:40px;">2、HtmlHelp函数在API列表函数中找不到,将所在模块作为外部Extern DLL模块添加到API Monitor

3、开启对Beyond Compare工具软件的实时监测

HtmlHelp%E6%8E%A5%E5%8F%A3%E7%9A%84%E8%B0%83%E7%94%A8-toc" style="margin-left:40px;">4、在Beyond Compare软件中打开chm帮助文档,监测到了对HtmlHelp接口的调用

HtmlHelp%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E6%97%B6%E4%B8%BA%E5%95%A5%E6%B2%A1%E6%9C%89%E6%98%BE%E7%A4%BA%E5%8F%82%E6%95%B0%E5%85%B7%E4%BD%93%E7%9A%84%E7%B1%BB%E5%9E%8B%EF%BC%9F-toc" style="margin-left:40px;">5、监测到HtmlHelp函数调用时为啥没有显示参数具体的类型?

6、最后


C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C/C++基础入门与实战进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.htmlWindows C++ 软件开发从入门到精通(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12695902.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_2276111.html       API Monitor工具可以用来探测目标程序对系统API函数或者第三方非系统库API接口的调用,对探测目标软件是如何实现某个功能时很有用。今天就来详细讲述一下如何使用API Monitor去探测Beyond Compare软件在打开chm帮助文件时传入了什么参数,以供大家借鉴或参考。

1、API Monitor介绍

       API Monitor是一个功能强大的工具,主要用于监视和控制应用程序及服务的API调用情况。API Monitor能够让你看到应用程序和服务是如何工作的,或者跟踪在你自己应用程序中遇到的问题。

       该工具可以用来探测目标程序对系统API函数或者第三方非系统库API接口的调用,不仅可以看到接口调用的记录,还可以看到调用接口时传递的参数,还可以看到函数调用时的函数调用堆栈(默认堆栈中显示5条记录,可以在设置中设置显示的堆栈条目个数)。对于探测目标软件是如何实现某个功能很有用。我们在项目中多次使用该工具,模仿相关软件去实现类似的功能。

       API Monitor工具打开后的主界面如下所示:

主界面的大体构成已经在上图中进行标注了,下面在讲实例时会详细讲到,此处就不展开了。

       下面详细讲述一下如何使用API Monitor去探测Beyond Compare软件在打开chm帮助文件时传入了什么参数,给大家演示一下API Monitor是如何使用的。

2、为何要使用API Monitor工具?

       很多软件将帮助文档做成chm格式,方便大家查看使用,特别是方便大家搜索查看函数或命令说明的帮助文档,比如离线版本的MSDN帮助文档,支持直接搜索API函数名,如下所示:

再比如Windbg的帮助文档,支持直接搜索Windbg命令:

       我们的软件也将帮助文档做成了chm文件,要在软件菜单中实现打开chm帮助文档的功能。经搜索得知需要调用系统API函数HtmlHelp去实现,但不知调用该函数时应该传递什么样的参数。HtmlHelp函数的声明如下:

第一个参数是所属owner窗口,应该可以设置为NULL;
第二个参数是要打开的chm帮助文件的完整路径,这个参数没问题;
第三个和第四个参数要传什么样的值没法确定,MSDN上也没有明确的说明。

       之前使用过API Monitor工具,正好想再次使用该该工具,看看其他成熟软件是在调用HtmlHelp函数打开chm帮助文档时传入了什么样的参数。于是查看日常用的软件,看看哪些软件在菜单栏中有打开chm帮助文档的功能,Windbg、Process Explorer、Source Insight和Beyond Compare等老牌软件都有打开chm帮助文档的功能。我们选择监测一下Beyond Compare软件,大家在看完本篇文章之后,也可以去监测一下Windbg、Process Explorer、Source Insight等软件对HtmlHelp函数的调用。

HtmlHelp%E5%87%BD%E6%95%B0%E5%9C%A8API%E5%88%97%E8%A1%A8%E5%87%BD%E6%95%B0%E4%B8%AD%E6%89%BE%E4%B8%8D%E5%88%B0%EF%BC%8C%E5%B0%86%E6%89%80%E5%9C%A8%E6%A8%A1%E5%9D%97%E4%BD%9C%E4%B8%BA%E5%A4%96%E9%83%A8Extern%20DLL%E6%A8%A1%E5%9D%97%E6%B7%BB%E5%8A%A0%E5%88%B0API%20Monitor%E4%B8%AD">2、HtmlHelp函数在API列表函数中找不到,将所在模块作为外部Extern DLL模块添加到API Monitor

       打开API Monitor后,用鼠标点击左边的API函数列表,然后按下Ctrl+F快捷键打开API函数搜索窗口,输入HtmlHelp

点击确定,进行搜索。但在左边的API函数列表中并没有搜索到HtmlHelp函数:

这有点奇怪,明明是系统API函数,为啥搜索不到呢?这个API函数也不是很新的API,不会因为API Monitor工具版本较老而没有这个API函数。

      于是到微软在线的MSDN上搜索HtmlHelp,查看该函数所在的模块,如下所示:

该函数位于hhctrl.ocx模块中,这是一个ocx控件?不是一个像ntdll.dll一样的通用的系统库。

       相对于ntdll.dll这样的系统通用库,hhctrl.ocx是外部库?API Monitor支持添加外部模块,要把hhctrl.ocx作为外部模块添加到API MOnitor中?先用Everything工具在电脑上搜索hhctrl.ocx文件的路径,如下所示:

因为当前的Beyond Compare是32位的,所以选择C:\Windows\SysWoW64系统路径下的hhctrl.ocx

       于是点击左边的API列表中的External DLL标签页

点击“Add External DLL (Insert)”按钮,弹出文件选择对话框,切换到将C:\Windows\SysWoW64系统路径下,在该路径中寻找hhctrl.ocx文件,但找不到这个文件需要将默认的Dvnamic-link libraries (*.dll)文件类型改成All Files (*.*),就能找到了:

添加进来后,就能看到hhctrl.ocx模块的导出接口了,如下所示:

看到了HtmlHelp函数,其中HtmlHelpA是ANSI版本的,HtmlHelpW是Unicode宽字节版本的。于是将这两个函数都勾选上。


       在这里,给大家重点推荐一下我的几个热门畅销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)

专栏1:(该精品技术专栏的订阅量已达到490多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!欢迎订阅!)

C++软件调试与异常排查从入门到精通系列文章汇总icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931

本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!

专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2:  

C++常用软件分析工具从入门到精通案例集锦汇总(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795

常用的C++软件辅助分析工具有PE工具、Dependency Walker、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题,很有实战参考价值!

专栏3: 

C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html

以多年的开发实战为基础,总结并讲解一些的C/C++基础与进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域的多个方面的内容,同时给出C/C++及网络方面的常见笔试面试题,并详细讲述Visual Studio常用调试手段与技巧!

专栏4:   

VC++常用功能开发汇总(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585

将10多年C++开发实践中常用的功能,以高质量的代码展现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地解决软件开发过程中遇到的问题。

专栏5: 

Windows C++ 软件开发从入门到精通(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12695902.html

根据多年C++软件开发实践,详细地总结了Windows C++ 应用软件开发相关技术实现细节,分享了大量的实战案例,很有实战参考价值。


3、开启对Beyond Compare工具软件的实时监测

       上面已经将HtmlHelpA和HtmlHelpW函数勾选上了,然后在左下方的进程列表中找到Beyond Compare进程,右键点击该进程,在弹出的右键菜单中点击“Start Monitoring”菜单项:

开启对Beyond Compare工具软件的实时监测。

HtmlHelp%E6%8E%A5%E5%8F%A3%E7%9A%84%E8%B0%83%E7%94%A8">4、在Beyond Compare软件中打开chm帮助文档,监测到了对HtmlHelp接口的调用

       切换到已经打开的Beyond Compare软件界面,点击菜单栏中的Help->Contents,打开chm帮助文档。然后切换到API Monitor主界面,监测到了对HtmlHelp接口的调用,如下所示:

点击监测到的HtmlHelp调用条目,然后到下方的Parameters窗口中查看传递给HtmlHelp函数的四个参数。其中,第二个参数就是要打开的chm帮助文档的路径,第三个参数对照HtmlHelp函数的声明:

其值为0,即uCommand参数对应的枚举值为HH_DISPLAY_TOPIC:

第四个参数dwData传入的值为0,这样我们就可以参考第三个及第四个参数的值去编写我们的代码了,打开chm帮助文件的实现代码如下所示:

bool OpenChmHelpFile( LPCTSTR lpStrPath )
{HWND hHelpWnd = NULL;__try{hHelpWnd = HtmlHelp( NULL, lpStrPath, HH_DISPLAY_TOPIC, NULL );}__except( EXCEPTION_EXECUTE_HANDLER ){hHelpWnd = NULL;}if ( NULL == hHelpWnd ){WriteLog( _T("[OpenChmHelpFile] HtmlHelp execute failed, path [%s]!"), lpStrPath );return false;}return true;
}

        注意,实操时可能会遇到监测不到HtmlHelp接口调用记录的情况,我在实操时就遇到过。如果遇到监测不到的情况,可以尝试将API MonitorBeyond Compare工具都关闭掉,重新启动这两个软件,重新开启监测,应该可以监测到了。

HtmlHelp%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E6%97%B6%E4%B8%BA%E5%95%A5%E6%B2%A1%E6%9C%89%E6%98%BE%E7%A4%BA%E5%8F%82%E6%95%B0%E5%85%B7%E4%BD%93%E7%9A%84%E7%B1%BB%E5%9E%8B%EF%BC%9F">5、监测到HtmlHelp函数调用时为啥没有显示参数具体的类型?

       点击监测到的HtmlHelp调用条目,然后到下方的Parameters窗口中查看传递给HtmlHelp函数的四个参数,如下所示:

并没有显示具体的参数,而是把参数尝试当做不同的几个类型去解析。这是因为HtmlHelp函数所在的模块hhctrl.ocx,属于外部库,在安装路径下的API描述文档(xml文件)中没有对应的函数声明及参数说明。HtmlHelp函数属于hhctrl.ocx模块的导出函数,只能看到函数名,但没法知道函数的参数类型。

       API Monitor中的API描述文档的内容如下所示:

描述文档中首先给出API函数名,然后给出函数参数类型的说明,如果参数中有结构体,还会给出结构体的类型描述。如果在新的Windows系统API函数,在当前版本的API Monitor的xml描述文件中找不到,可以模仿现有API函数的描述,手动将新的API接口描述加进去,这样在API Monitor的API函数列表中就可以看到这个函数了。

       有人可能会问,pdb符号库文件会有函数参数类型等符号类型信息,这个API Monitor工具是否支持加载pdb文件呢?像Process Explorer、Process Monitor这些工具支持加载pdb文件,在显示的线程函数调用堆栈就可以看到详细的函数名和参数了。不幸地告诉大家,API Monitor工具不支持加载pdb文件。

6、最后

       本文通过监测Beyond Compare软件对HtmlHelp函数的调用,详细演示了如何使用API Monitor工具,有一定的实战参考价值,希望本文的内容可以帮到大家。


http://www.ppmy.cn/server/88908.html

相关文章

Spring MVC笔记

Java 版本: JDK17 Eclipse: eclipse-jee-2023-12-R-win32-x86_64.zip Tomcat 10 JDK17采用springframework 6 *必须考虑兼容性问题&#xff0c;所以JDK 和spring framework不要乱搭配 初步创建Maven Project 安装包 修改poem.xml <dependency><groupId>org.sprin…

Spring 事务管理 04

文章目录 为什么需要事务&#xff1f;1. 声明式事务2. 编程式事务管理3. 事务的实现原理3.1 事务管理器&#xff08;Transaction Manager&#xff09;&#xff1a;3.2 事务管理的抽象层&#xff1a;3.3 事务传播行为&#xff08;Propagation Behavior&#xff09;&#xff1a;3…

应对爬虫过程中代理IP掉线的实用指南

当代理IP在爬虫中频繁掉线时&#xff0c;我们先要了解出现问题的可能原因&#xff0c;这不仅限于技术性因素&#xff0c;还涉及操作策略和环境因素。只有在找到具体原因后&#xff0c;才能针对问题类型从源头解决IP掉线问题。 一、问题原因&#xff1a; 1. 代理IP质量问题导致…

Photoshop钢笔工具

一、钢笔工具概述 Photoshop中的钢笔工具&#xff08;快捷键为P&#xff09;是矢量绘图工具&#xff0c;主要用于精确绘制直线、曲线以及开放或闭合的路径。钢笔工具通过锚点和方向线来定义路径的形状&#xff0c;可以绘制出平滑的曲线和直线段&#xff0c;非常适合用于抠图、…

身份认证(session + token)

web 开发模式 服务端渲染 前后端分离 如何选择 前后端身份验证 session 原理 什么是 cookie cookie 安全性 提高cookie 安全性 配置 session 中间件 注意 只会清除当前用户的 session JWT 认证机制 express 中使用 JWT JWT 字符串 还原为 JSON 对象 一般 约定 api 开头的都…

Redisson中RSet的使用场景及用它来做网站独立访客统计的例子

RSet 是 Redisson 提供的一个用于操作 Redis 的 Set 数据类型的高级接口。在 Redis 中&#xff0c;Set 是一个存储字符串元素的无序集合&#xff0c;不允许重复元素。RSet 在 Java 应用程序中提供了一种方便的方式来操作 Redis 中的 Set 结构。下面列举了一些可能使用 RSet 的场…

ubuntu安装mysql8.0

文章目录 ubuntu版本安装修改密码取消root跳过密码验证 ubuntu版本 22.04 安装 更新软件包列表 sudo apt update安装 MySQL 8.0 服务器 sudo apt install mysql-server在安装过程中&#xff0c;系统可能会提示您设置 root 用户的密码&#xff0c;请务必牢记您设置的密码。…

Github遇到的问题解决方法总结(持续更新...)

1.github每次push都需要输入用户名和token的解决方法 push前&#xff0c;执行下面命令 &#xff1a; git config --global credential.helper store 之后再输入一次用户名和token之后&#xff0c;就不用再输入了。 2.git push时遇到“fatal: unable to access https://githu…

Docker-Compose实现MySQL之主从复制

1. 主服务器(IP:192.168.186.77) 1.1 docker-compose.yml services:mysql-master:image: mysql:latest # 使用最新版本的 MySQL 镜像container_name: mysql-master # 容器的名称environment:MYSQL_ROOT_PASSWORD: 123456 # MySQL root 用户的密码MYSQL_DATABASE: masterd…

编写Dockerfile文件解释

编写Dockerfile文件的基本步骤如下&#xff1a; 首先&#xff0c;创建一个新的文本文件&#xff0c;并将其命名为Dockerfile。 在Dockerfile的第一行添加基础镜像的指令。例如&#xff0c;使用ubuntu 18.04作为基础镜像&#xff0c;可以添加以下指令&#xff1a; FROM ubunt…

数据结构第二讲:顺序表

数据结构第二讲&#xff1a;顺序表 1.线性表2.什么是顺序表3. 静态顺序表4.动态顺序表4.1顺序表基础4.2顺序表的初始化4.3顺序表的销毁4.4顺序表的尾插4.5顺序表的头插4.6顺序表的尾删4.7顺序表的头删4.8顺序表在指定位置之前插入数据4.9顺序表删除指定位置的数据4.10顺序表查找…

分享一个最近在进行前后端联调时改了2天的bug...

场景再现 我们这边前端端口是8080 后端端口是8121 我们在前端里在首页面写了一个任务 当进入网页三秒后 发起一个叫getLoginUser的请求 我们的getLoginUser是调用的这里 一个异步请求 这边我们前端调用后端的接口也已经写好 我们先把后端跑起来 访问前端页面 接收到了这个…

1858. 数组查找及替换

问题描述 给定某整数数组和某一整数 b 。 要求删除数组中可以被 b 整除的所有元素&#xff0c;同时将该数组各元素按从小到大排序。如果数组元素数值在 &#x1d434;‘ 到 Z 的 ASCII 之间&#xff0c;替换为对应字母。 元素个数不超过 100&#xff0c;&#x1d44f; 在 1 …

linux shell(中)

结构化命令 if语句 if-then 最基本的结构化命令是 if-then 语句。if-then 语句的格式如下&#xff1a; if command thencommands ifif command; then # 通过把分号&#xff08;;&#xff09;放在待求值的命令尾部&#xff0c;可以将 then 语句写在同一行commands ifbash sh…

git stash 命令详解

git stash 描述 git stash 命令用于将当前工作目录中的未提交更改&#xff08;包括暂存区和工作区的更改&#xff09;保存到一个栈中&#xff0c;并恢复工作目录到干净的 HEAD 状态。这样您可以在不提交当前更改的情况下&#xff0c;切换到其他分支或进行其他操作。后续可以通…

Golang使用docker sdk管理docker

包括列出容器、创建容器、删除容器、进入容器、构建镜像等操作。 package dockertoolimport ("context""fmt""github.com/docker/docker/api/types""github.com/docker/docker/api/types/container""github.com/docker/docker/ap…

微服务安全——OAuth2.1详解、授权码模式、SpringAuthorizationServer实战、SSO单点登录、Gateway整合OAuth2

文章目录 Spring Authorization Server介绍OAuth2.0协议介绍角色OAuth2.0协议的运行流程应用场景授权模式详解客户端模式密码模式授权码模式简化模式token刷新模式 OAuth 2.1 协议介绍授权码模式PKCE扩展设备授权码模式拓展授权模式 OpenID Connect 1.0协议Spring Authorizatio…

java对接soap工具类-callSonyInterfaceQuery

新写的工具类&#xff0c;其中有对接soap的工具类 import com.shutong.common.exception.ServiceException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.Cont…

基于jeecgboot-vue3的Flowable流程仿钉钉流程设计器-抄送服务处理

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、因为仿钉钉设计器里抄送人是一个服务任务&#xff0c;所以要根据这个服务任务进行处理 2、前端就是一个抄送&#xff0c;选择人 3、这里用了jeecg的选择人组件 <el-form-item prop…

LongAlign:大模型长文本处理能力提升之道

人工智能咨询培训老师叶梓 转载标明出处 大模型&#xff08;LLMs&#xff09;在处理长文本时&#xff0c;需要在输入序列上进行指令微调&#xff08;instruction finetuning&#xff09;&#xff0c;以确保它们能够有效地处理长文本。现有的方法主要集中在上下文扩展&#xff0…