当前位置: 首页 > news >正文

使用Process Monitor排查因dll库被锁定导致C++程序启动报“0xc0000022”错误问题

目录

1、问题描述

2、查找到异常值0xc0000022对应的标识STATUS_ACCESS_DENIED

3、使用Process Monitor定位到哪个dll库被隔离了

4、在360安全卫士中将被隔离的文件恢复了,但360并没有释放对文件的锁定


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具案例集锦(正在更新中...)https://blog.csdn.net/chenlycly/category_12279968.html       360安全卫士怀疑C++程序依赖的某个dll包含病毒行为,将该dll库隔离了、锁定住了,禁止其他程序访问该文件,导致C++程序启动时报错,启动失败。本文简单地讲述整个问题的排查过程,给大家提供一些借鉴或参考。       

1、问题描述

       某天要使用VS调试C++代码,结果调试运行Debug版本的C++程序时,弹出如下的报错提示框:

很是奇怪。最开始以为是不是程序依赖的库有问题,于是将相关的库代码重新都编译了一下,但问还是无法启动程序,这是啥情况?其实当时应该用windbg挂一下的,可能是直接能找打原因的,但当时忘记了,等问题解决后就没有现象了。

2、查找到异常值0xc0000022对应的标识STATUS_ACCESS_DENIED

       这段时间经常遇到这样那样程序启动报错的问题,所以想深入研究一下到底是怎么回事。于是到百度中以“0xc0000022 msdn”为关键字搜索了一下,搜到了msdn上关于该错误码的相关说明:

[MS-CIFS]: Response | Microsoft Docs

网页相关截图如下:

从图中可以看出,0xc0000022值对应的是STATUS_ACCESS_DENIED,从字面上看应该是拒绝访问了。

估计是C++程序启动时,在将其依赖的库加载的库加载到进程空间中时出现了访问被拒绝的问题,所以导致程序启动失败了。

       将上面截图中的字符串“STATUS_ACCESS_DENIED”拷贝到VS2017中,然后go到所在的头文件中,头文件路径如下:
C:\Program Files\Windows Kits\10\Include\10.0.17763.0\shared\ntstatus.h
在该头文件中看到了0xC0000022值的定义及含义:(在有些电脑上可能找不到STATUS_ACCESS_DENIED的定义,可以到上述类似的路径中去找ntstatus.h头文件,如果找不到,可以尝试先安装一下WIndbg10,然后就会有上述目录了

所以后面在遇到类似的错误弹窗,可以到上述头文件中找到错误码数组对应的含义是什么了!

3、使用Process Monitor定位到哪个dll库被隔离了

       这个问题还要进一步研究,到底是访问哪个文件时被拒绝了呢?于是尝试使用Process Monitor工具监测一下文件活动,看看是否有ACCESS_DENIED的记录。

Process Monitor工具可以监测目标进程的文件与注册表活动,使用该工具可以辅助排查一些软件运行过程中的问题。

        启动Process Monitor后,点击工具栏的漏斗图标,将testdemo.exe设置为进程过滤对象:

 然后点击工具栏中的按钮,将对注册表活动等的监控都取消掉,只监控文件活动:

然后双击启动testdemo.exe程序,Process Monitor中立即监测到testdemo.exe进程所有的文件操作记录。

       在监测到的记录中以Denied关键字搜索,搜索到了一条Denied记录,右键点击属性,查看详细信息如下:

从上图可以看出,应该是访问到mtpbstructdll.dll文件时被拒绝了。

       难道是360觉得该文件可能包含病毒,将该文件隔离了,禁止访问了?于是到360安全卫士按照下面的操作步骤查看拦截记录。先点击主页面上方的“木马查杀”按钮,进入如下页面:

​点击恢复区按钮,进入如下的页面:

 上面的截图是事后查看的历史记录,应该是点击可恢复区界面,将被隔离的文件恢复回去就好了,如下所示:

 记得将恢复确认窗口下方的“恢复后新人此文件,不再查杀”的选项勾选上,下次可能就不会查杀了。将文件恢复之后,就能正常C++程序了。

4、在360安全卫士中将被隔离的文件恢复了,但360并没有释放对文件的锁定

        后来有一次,又出现了0xc0000022启动报错的问题。使用上述这个方法,定位出是在加载mtdispatchdll.dll库时访问被拒绝,估计mtdispatchdll.dll库又被360安全卫士锁住了,导致目标程序无法访问了。

       到360拦截记录中并没有找到关于mtdispatchdll.dll的条目,应该是之前弹出拦截提示框时,我们取消对该文件的拦截,我们将该文件恢复了。估计是360安全卫士的bug,文件被恢复后并没有释放对文件的锁定,导致还是无法启动目标程序。后来重启电脑才可以启动程序。

http://www.lryc.cn/news/67949.html

相关文章:

  • Unity UI -- (1)概览
  • 玩转 LLMs 之基础设施「利刃出鞘」
  • WPF MaterialDesign 初学项目实战(1)首页搭建
  • 【纳什博弈、ADMM】基于纳什博弈和交替方向乘子法的多微网主体能源共享研究(Matlab代码实现)
  • 每日学术速递5.8
  • ChatGPT时代:我们可能站到了自然语言编程的大门口
  • 关于不同处理器的函数调用规则
  • Rust Wasm Linux开发环境搭建
  • 【项目设计】 负载均衡在线OJ系统
  • 【服务器】无公网IP,异地远程连接威联通NAS
  • 在中国,年收入20W是什么水平?答案扎心了(文末附最新招聘)
  • navicat连接oracle报错 ORA-28547
  • 量化指标WR:弱的确是弱,但是老Q会魔改啊!
  • 生物信息学知识点
  • 14.贪心算法
  • 你知道营销人为什么要讲洞察吗?
  • Neovim-配置教程
  • Windows管理内存的3种方式——堆、虚拟内存、共享内存
  • PCM/FM解调原理与Matlab算法仿真
  • 我的『1024』创作纪念日
  • Python ---> 衍生的数据技术
  • 【27】linux进阶——rpm软件包的管理
  • HTTP第六讲——键入网址再按下回车,后面究竟发生了什么?
  • layui目录和项目引入
  • Ubuntu22.04 将EFI启动分区迁移到另一块硬盘
  • 只要学会这些AI工具,一个人就是一家营销咨询公司
  • [离散数学] 函数
  • 好家伙,又一份牛逼笔记面世了...
  • 基于nodejs+vue3 的高仿网易云音乐
  • MySQL数据库用户管理以及数据库用户授权