使用Dependency Walker和Beyond Compare快速排查dll动态库损坏或被篡改的问题

目录

1、问题描述

2、用Dependency Walker工具打开qr.dll库,查看库与库的依赖关系以及接口调用情况,定位问题

3、使用Beyond Compare工具比较一下正常的msvcr100d.dll和问题msvcr100d.dll的差异

4、最后


C++软件异常排查从入门到精通系列教程(核心精品专栏,订阅量已达600多个,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C/C++实战专栏(重点专栏,专栏文章已更新500多篇,订阅量已达数百个,欢迎订阅,持续更新中...)https://blog.csdn.net/chenlycly/article/details/140824370C++ 软件开发从入门到实战(重点专栏,专栏文章已更新300多篇,欢迎订阅,持续更新中...)https://blog.csdn.net/chenlycly/category_12695902.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_2276111.html       某天在启动Debug版本的客户端程序时,弹出了找不到某个接口的提示框,于是使用Dependency Walker和Beyond Compare工具详细分析了一下。今天将详细分析过程分享出来,以供大家借鉴或参考。

1、问题描述

       某天在启动Debug版本exe主程序时,弹出了如下的报错提示框:

无法定位程序输入__CppXcptFilter(接口)于动态链接库 E:\QyLink\qr.dll上。注意,这个__CppXcptFilter接口并不是在qr.dll中找不到,而是在qr.dll依赖的某个库中找不到。

       一般出现这种找不到接口的问题,直接用Dependency Walker工具打开qr.dll库查看库与库的依赖关系以及接口调用的情况,就可以找出问题了。

2、用Dependency Walker工具打开qr.dll库,查看库与库的依赖关系以及接口调用情况,定位问题

        于是用Dependency Walker工具打开qr.dll库,如下所示:

问题出在msvcr100d.dll库中。qr.dll调用了msvcr100d.dll库中的导出接口__CppXcptFilter,但看msvcr100d.dll库的导出接口列表居然是空的,所以报出了找不到__CppXcptFilter接口的错误。

       这个msvcr100d.dll是Debug版本的微软C/C++运行时库,里面提供了大量的C/C++运行时函数,__CppXcptFilter应该是其中的一个函数之一,作为dll动态库,这些C/C++运行时函数肯定是导出接口,而Dependency Walker中显示的msvcr100d.dll库的导出接口列表中是空的,一个导出接口都没有,肯定是有问题的。

程序启动时,会优先将依赖的库加载到进程空间中,然后检查上层调用依赖的dll库中的接口能否在这些依赖的dll库中找到。如果调用的接口找不到,则会弹出接不到接口的报错提示框,然后终止dll库加载,终止程序的启动。

       在启动exe主程序时,会优先从exe主程序的所在路径中查找要加载的库,如果找到,则加载该路径中的dll库。对于当前出问题的msvcr100d.dll,就位于当前Debug版本的exe主程序路径中,所以程序启动时加载的就是该路径下的msvcr100d.dll库文件。因为Dependency Walker看不到msvcr100d.dll库的导出接口(一个导出接口都没有),所以怀疑当前Debug路径下的msvcr100d.dll可能是被篡改或者损坏了!

       解决办法很简单,msvcr100d.dll是VS2010带的运行时库,我机器上安装了VS2010,我可以到系统路径C:\Windows\System32系统路径中找到msvcr100d.dll库,直接拷贝到Debug路径中将问题msvcr100d.dll覆盖掉就好了。

此处有个细节需要注意一下,在从系统目录中拷贝msvcr100d.dll库时要注意一下库的位数(32位和64位)。32位模块和64位模块是不能混在一起使用的,否则会出错。假设当前Windows系统是64位的,如果exe主程序是32位的,则需要从C:\Windows\SysWOW64目录下拷贝32位版本的msvcr100d.dll;如果exe主程序是64位的,则需要从C:\Windows\System32目录中拷贝64位版本的msvcr100d.dll。

      关于DLL动态库编程以及动态库问题的相关专题,我写过多篇文章,感兴趣的可以来查看: 

【C++动态库】将C++代码封装成dll动态库有哪些好处?https://blog.csdn.net/chenlycly/article/details/144112995【C++动态库编程】C++名称改编、标准C接口、extern “C“、函数调用约定以及def文件详解https://blog.csdn.net/chenlycly/article/details/132520200【C++动态库】动态库隐式与显式加载 | 为什么要动态加载动态库 | LoadLibrary加载失败 | 参考开源操作系统ReactOS源码 | 用LoadLibraryEx替代LoadLibraryhttps://blog.csdn.net/chenlycly/article/details/143201106【C++动态库】DLL动态库加载失败导致程序启动报错以及DLL库加载失败的常见原因分析与总结https://blog.csdn.net/chenlycly/article/details/142714236


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

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

C++软件调试与异常排查从入门到精通系列文章汇总https://blog.csdn.net/chenlycly/article/details/125529931

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

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

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

专栏2:(本专栏涵盖了C++多方面的内容,是当前重点打造的专栏,订阅量已达300多个,专栏文章已经更新到500多篇,持续更新中...)

C/C++实战进阶(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_11931267.html

以多年的开发实战为基础,总结并讲解一些的C/C++基础与项目实战进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域多个方面的内容,包括C++基础及编程要点(模版泛型编程、STL容器及算法函数的使用等)、数据结构与算法、C++11及以上新特性(不仅看开源代码会用到,日常编码中也会用到部分新特性,面试时也会涉及到)、常用C++开源库的介绍与使用、代码分享(调用系统API、使用开源库)、常用编程技术(动态库、多线程、多进程、数据库及网络编程等)、软件UI编程(Win32/duilib/QT/MFC)、C++软件调试技术(排查软件异常的手段与方法、分析C++软件异常的基础知识、常用软件分析工具使用、实战问题分析案例等)、设计模式、网络基础知识与网络问题分析进阶内容等。

专栏3:  

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

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

专栏4:   

VC++常用功能开发汇总(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/124272585

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

专栏5: 

C++ 软件开发从入门到精通(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_12695902.html

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


3、使用Beyond Compare工具比较一下正常的msvcr100d.dll和问题msvcr100d.dll文件的差异

       我们可以使用Beyond Compare工具比较一下正常的msvcr100d.dll和问题msvcr100d.dll,看看有什么不同。打开这两个文件后,默认比较的是两个文件的版本信息(Version Compare),如下所示:

问题msvcr100d.dll中的版本信息都有异常了,有明显的残缺。dll是二进制文件,我们需要比较一下二进制内容,我们需要到Beyond Compare菜单栏中点击Session -> Compare in New View Using ->Hex Compare,切换到二进制内容比较模式:

切换到二进制比较模式,看到如下的差异:

也看到这两个库有明显的差异。目前基本可以确定当前的问题msvcr100d.dll被损坏或者被篡改了,但到底什么时候被篡改、被什么东西篡改了,就不得而知了。

Beyond Compare工具很好用,平时主要用来比较文本内容和二进制内容,我们在工作中会经常使用。

       之前还写过使用Beyond Compare工具分析实际问题的实例,可以查看我的文章:

使用PE信息查看工具和Beyond Compare文件比较工具排查dll库文件版本不对的问题https://blog.csdn.net/chenlycly/article/details/140731291

4、最后

       这是日常开发过程中遇到的一个小问题,对于有经验的老程序员来说,排查起来可能很简单,但对于新手来说,则有一定的参考价值,所以在此将此问题的排查过程与相关细节分享出来,供大家借鉴或参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025.3.17总结

今天又是不开心得一天,回归一个问题单,晚上看了下科目四,不到九点就领夜宵回去了。 每次干得不开心,总会有跑路得念头,真的卷不动了,考个试考到抑郁,考到怀疑人生。还没等他人辞退,…

【CF】Day9——Codeforces Round 953 (Div. 2) BCD

B. New Bakery 题目: 思路: 被标签害了,用什么二分( 很简单的思维题,首先如果a > b,那么全选a就行了,还搞啥活动 否则就选 b - a 天来搞活动,为什么? 首先如果我…

【大模型】Transformer、GPT1、GPT2、GPT3、BERT 的论文解析

前言 在自然语言处理(NLP)和深度学习的快速发展中,Transformer模型和 GPT系列模型扮演了至关重要的角色。本篇博客旨在对这些开创性的论文进行介绍,涵盖它们的提出时间、网络结构等关键信息,能够快速的理解这些模型的设…

Spring Security 教程:从入门到精通(含 OAuth2 接入)

Spring Security 教程:从入门到精通(含 OAuth2 接入) Spring Security 是 Spring 框架中备受推崇的安全模块,广泛应用于构建安全可靠的企业级应用程序。它提供了一套全面的解决方案,涵盖身份认证(Authenti…

OpenGL ES 入门指南:从基础到实战

引言:为什么需要 OpenGL ES? 在当今的嵌入式设备(如智能手机、汽车仪表盘、智能家居中控屏)中,流畅的图形渲染能力是用户体验的核心。OpenGL ES(OpenGL for Embedded Systems) 作为行业标准&am…

java的WeakHashMap可以用来做缓存使用?强软弱虚四种引用对比

在 Java 中,引用(Reference)机制用于管理对象的生命周期和垃圾回收。Java 提供了四种类型的引用:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Refer…

51单片机指令系统入门

目录 基本概念讲解 一、机器指令​ 二、汇编指令​ (一)汇编指令的一般格式 (二)按字节数分类的指令 三、高级指令 总结​ 基本概念讲解 指令是计算机(或单片机)中 CPU 能够识别并执行的基本操作命令…

使用 Docker 部署 MySQL 8

使用 Docker 部署 MySQL 8 详细指南 MySQL 是一个广泛使用的开源关系型数据库管理系统。通过 Docker 部署 MySQL 8 可以快速搭建一个可移植、可扩展的数据库环境。本文将详细介绍如何使用 Docker 部署 MySQL 8,并讲解如何根据需求配置 MySQL。 从拉取镜像开始的详细…

AtCoder Beginner Contest 397(ABCDE)

目录 A - Thermometer 翻译: 思路: 实现: B - Ticket Gate Log 翻译: 思路: 实现: C - Variety Split Easy 翻译: 思路: 实现: D - Cubes 翻译&#xff1a…

数模AI使用教程(新) 2025.3.17

DeepseekR1doubao1.5大模型组合,数模智能体题目解答一等水平,另外也有统计建模、期刊复现智能体。 功能:问题重述、解释数据文件、深度思考与逻辑梳理、问题关键点分析、知识整理、查找数据源、问题分析、使用方法推荐[会询问要求]、模型建立…

Spring Cloud Gateway 生产级实践:高可用 API 网关架构与流量治理解析

API 网关的核心价值 在分布式微服务架构中,API 网关作为系统流量的唯一入口,承担着路由分发、安全防护、流量治理三大核心职责。Spring Cloud Gateway 基于响应式编程模型与 Netty 高性能网络框架,提供灵活的路由规则、动态过滤器链和深度集…

在Pycharm配置conda虚拟环境的Python解释器

〇、前言 今天在配置python解释器时遇到了这样的问题 经过一下午自行摸索、上网搜寻后,终于找到的解决的方案,遂将该方法简要的记录下来,以备后用,并希望能帮助到有同样问题或需求的朋友:) 我所使用的软件的版本如下,假…

宽带(Broadband)

宽带(Broadband) 是一种高速互联网接入技术,能够同时传输多种类型的数据(如语音、视频、文本等)。与传统的窄带(如拨号上网)相比,宽带提供了更高的数据传输速率和更稳定的连接&#…

集成学习(上):Bagging集成方法

一、什么是集成学习? 在机器学习的世界里,没有哪个模型是完美无缺的。就像古希腊神话中的"盲人摸象",单个模型往往只能捕捉到数据特征的某个侧面。但当我们把多个模型的智慧集合起来,就能像拼图一样还原出完整的真相&a…

VLLM:虚拟大型语言模型(Virtual Large Language Model)

VLLM:虚拟大型语言模型(Virtual Large Language Model) VLLM指的是一种基于云计算的大型语言模型的虚拟实现。它通常是指那些由多个服务器组成的分布式计算环境中的复杂机器学习模型,这些模型能够处理和理解大量的文本数据。VLLM的…

Springboot+Vue登录、注册功能(含验证码)(后端!)

我们首先写一个接口,叫login!然后对传入一个user,因为我们前端肯定是要传过来一个user,然后我们后端返回一个user,因为我们要根据这个去校验!我们还引入了一个hutool的一个东西,在pom文件里面引…

冯 • 诺依曼体系结构

冯 • 诺依曼体系结构 一、冯 • 诺依曼体系结构推导阶段 1:初始计算机体系结构(仅输入、运算、输出)阶段 2:加入控制功能,初步形成 CPU 概念阶段 3:性能瓶颈与引入内存阶段 4:最终冯诺依曼体系…

Python print() 打印多个变量时,可变对象和不可变对象的区别

先来看这段代码: tmp [] print(tmp, tmp.append(1), tmp)输出: [1] None [1]并不是一些人认为的 [] None [1] 这是因为列表是可变对象,print()打印前会先计算出所有结果,最后再打印出来,中间在列表中添加了1&#…

【数学 线性代数】差分约束

前言 C算法与数据结构 本博文代码打包下载 什么是差分约束 x系列是变量&#xff0c;y系列是常量&#xff0c;差分系统由若干如下不等式组成。 x1-x2 < y1 x2-x3 < y2 ⋯ \cdots ⋯ 可能有负环的最短路 个人习惯&#xff1a;如果存在a指向b的边&#xff0c;则a是b的…

AutoGen :使用 Swarm 构建自治型多智能体团队

👉👉👉本人承接各类AI相关应用开发项目(包括但不限于大模型微调、RAG、AI智能体、NLP、机器学习算法、运筹优化算法、数据分析EDA等) !!!👉👉👉 有意愿请私信!!!AutoGen 的 AgentChat 模块提供了一种强大的方法来构建多智能体协作系统。 在之前的文章中,我们探讨了…