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

使用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、最后

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

相关文章:

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

目录 1、问题描述 2、用Dependency Walker工具打开qr.dll库,查看库与库的依赖关系以及接口调用情况,定位问题 3、使用Beyond Compare工具比较一下正常的msvcr100d.dll和问题msvcr100d.dll的差异 4、最后 C软件异常排查从入门到精通系列教程&#xff…...

3.14学习总结 排序算法

插入排序&#xff1a; 1.直接插入排序 维护一个有序区&#xff0c;把元素一个个插入有序区的适当位置&#xff0c;直到所有元素都有序为止。 for (int i 0;i < n - 1;i) {//升序int end i;int temp k[end 1];while (end > 0) {if (temp < k[end]) {k[end 1] …...

Hadoop、Spark、Flink Shuffle对比

一、Hadoop的shuffle 前置知识&#xff1a; Map任务的数量由Hadoop框架自动计算&#xff0c;等于分片数量&#xff0c;等于输入文件总大小 / 分片大小&#xff0c;分片大小为HDFS默认值128M&#xff0c;可调 Reduce任务数由用户在作业提交时通过Job.setNumReduceTasks(int)设…...

本地部署 RAGFlow - 修改默认端口

本地部署 RAGFlow - 修改默认端口 1. 前提条件2. 部署 RAGFlow 1. 前提条件 确保 vm.max_map_count 不小于 262144&#xff1a; 如需确认 vm.max_map_count 的大小&#xff1a; sysctl vm.max_map_count如果 vm.max_map_count 的值小于 262144&#xff0c;可以进行重置&…...

repo init 错误 Permission denied (publickey)

一、已经生成ssh-key并设置到gerrit上 二、已经设置.gitconfig &#xff08;此步骤是公司要求&#xff0c;设置gerrit地址为一个别名之类的&#xff0c;有的公司不需要&#xff09; 然后出现下面的错误&#xff0c;最后发现忘记设置git的用户名和邮箱 1. git config --globa…...

Django settings.py 文件全解析

本篇详细介绍 Django settings.py 文件各个配置项的教程&#xff0c;涵盖核心配置项的作用及最佳实践 一、基础配置 1. ​BASE_DIR BASE_DIR Path(__file__).resolve().parent.parent​作用&#xff1a;项目根目录路径&#xff0c;用于构建其他路径&#xff08;如模板、静态…...

TSB - AD 解读 — 迈向可靠、透明的 TSAD 任务

目录 一 文章动机 二 TSAD 领域内的两类缺陷 三 数据集的构建 四 实验结果及结论 项目宣传链接&#xff1a;TSB-AD 代码链接&#xff1a; TheDatumOrg/TSB-AD: TSB-AD: Towards A Reliable Time-Series Anomaly Detection Benchmark 原作者解读&#xff1a;NeurIPS 2…...

下载 CSS 文件阻塞,会阻塞构建 DOM 树吗?会阻塞页面的显示吗?

下载 CSS 文件会对页面的渲染过程产生影响&#xff0c;具体是否阻塞 DOM 树的构建和页面的显示&#xff0c;取决于浏览器的渲染机制。 1. CSS 文件下载是否会阻塞 DOM 树的构建&#xff1f; 一般情况下&#xff0c;CSS 文件下载不会阻塞 DOM 树的构建&#xff1a; DOM 树的构建…...

6个月的Go语言学习甘特图路线图 从零基础到项目实战

以下是为期6个月的Go语言学习甘特图&#xff08;2025年4月-2025年10月&#xff09;&#xff0c;包含详细阶段划分、对应资源及项目产出文档说明&#xff1a; #mermaid-svg-yQbkZCpCAXv6iXKC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fi…...

论文阅读:2023-arxiv Can AI-Generated Text be Reliably Detected?

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 文章目录 Abstract&#xff08;摘要&#xff09;1 Introduction&#xff08;引言&#xff09;Conclusion&#xff08;结论&#xff09; Can AI-Generated Text be Reliably D…...

查看IP地址/Ping 命令

目录 Windows Linux macOS Ping 命令 Windows 使用终端&#xff1a; 按下 Win R 键&#xff0c;打开“运行”对话框&#xff0c;输入 cmd 并按 Enter。 在命令提示符中输入 ipconfig&#xff0c;按 Enter。系统会显示网络适配器的详细信息&#xff0c;包括 IPv4 地址、子…...

Language Models are Few-Shot Learners,GPT-3详细讲解

GPT的训练范式&#xff1a;预训练Fine-Tuning GPT2的训练范式&#xff1a;预训练Prompt predict &#xff08;zero-shot learning&#xff09; GPT3的训练范式&#xff1a;预训练Prompt predict &#xff08;few-shot learning&#xff09; GPT2的性能太差&#xff0c;新意高&…...

鸿蒙编译框架@ohos/hvigor FileUtil用法

ohos/hvigor FileUtil用法 在鸿蒙&#xff08;HarmonyOS&#xff09;开发中&#xff0c;ohos/hvigor 的 FileUtil 是用于文件操作的实用工具类&#xff0c;提供了跨平台的文件读写、路径处理等常用方法。以下是其核心用法和示例&#xff1a; 一、核心方法说明 方法名功能描…...

Hoppscotch 开源API 开发工具

Hoppscotch 是一个开源的 API 开发工具&#xff0c;旨在为开发者提供一个轻量级、快速且功能丰富的 API 开发和调试平台。以下是对其主要特性和功能的详细介绍&#xff1a; 1. 轻量级与高效 Hoppscotch 采用简约的 UI 设计&#xff0c;注重易用性和高效性。它支持实时发送请求…...

Infura 简介

文章目录 Infura 简介Infura 的主要功能Infura 的替代方案&#xff08;类似服务&#xff09;AlchemyQuickNodeAnkrMoralisPocket Network 什么时候选择 Infura&#xff1f; Infura 简介 Infura 是一个 区块链基础设施即服务&#xff08;BaaS, Blockchain as a Service&#xf…...

【芯片验证】面试题·对深度为60的数组进行复杂约束的技巧

朋友发给我的芯片验证笔试题,觉得很有意思,和大家分享一下。 面试题目 class A中一个长度为60的随机数组rand int arr[60],如何写约束使得: 1.每个元素的值都在(0,100]之间,且互不相等; 2.最少有三个元素满足勾股数要求,比如数组中包含3,4,5三个点; 请以解约束最快…...

Manus “Less structure,More intelligence ”独行云端处理器

根据市场调研机构Statista数据显示&#xff0c;全球的AR/AR的市场规模预计目前将达到2500亿美元&#xff0c;Manus作为VR手套领域的领军企业&#xff0c;足以颠覆你的认知。本篇文章将带你解读Manus产品&#xff0c;针对用户提出的种种问题&#xff0c;Manus又将如何解决且让使…...

【再读】R1-Onevision通过跨模态形式化为复杂多模态推理任务提供了系统性解决方案

R1-Onevision:跨模态形式化驱动的多模态推理技术突破,R1-Onevision通过跨模态形式化、双阶段训练和教育级基准测试,为多模态推理树立了新标杆。其技术创新不仅提升了模型在复杂任务中的表现,更重要的是为行业提供了一种可解释、可迁移的多模态处理范式。随着形式化方法的不断…...

Mysql-经典实战案例(3): pt-archiver 实现 MySQL 千万级大表分库分表(上)

零基础实战&#xff1a;使用 pt-archiver 实现 MySQL 千万级大表的水平分表&#xff08;Hash分片&#xff09; 本文适合人群&#xff1a;MySQL新手、想低成本实践数据库分表的开发者 环境要求&#xff1a;MySQL 5.7、Linux系统&#xff08;建议CentOS/Ubuntu&#xff09; 你将学…...

使用JSON存储数据的场景

Json 作为一种通用的数据格式&#xff0c;由于其结构灵活、可拓展等特点&#xff0c;在某些场景下我们也会直接将数据以 Json 格式存储到数据库中。 本文将探讨在开发中使用 JSON 存储数据的常见场景&#xff0c;并通过具体的实例帮助大家更好地理解其应用。 1. 半结构化数据…...

文生图网站推荐(2025.3)

以下是2024-2025年期间值得推荐的文生图网站&#xff0c;综合了免费性、中文友好度、操作便捷性及功能特色&#xff0c;涵盖不同用户需求&#xff1a; 一、国内主流平台 通义万相&#xff08;阿里云&#xff09; 特点&#xff1a;每日免费50次生成&#xff0c;模型和风格多样&a…...

网页制作代码html制作一个网页模板

制作一个简单而实用的网页模板&#xff1a;HTML基础入门 在数字时代&#xff0c;网页已成为信息展示和交流的重要平台。HTML&#xff08;HyperText Markup Language&#xff09;作为网页制作的基础语言&#xff0c;为开发者提供了构建网页的基本框架。本文将带你了解如何使用H…...

AI视觉测试工具实战评测:以Applitools为例的技术解析与行业应用

在数字化转型的浪潮中&#xff0c;软件界面&#xff08;UI/UX&#xff09;的复杂性与迭代速度呈指数级增长。传统的人工视觉测试不仅耗时费力&#xff0c;且难以应对多平台、多分辨率下的界面一致性问题。AI视觉测试工具的出现&#xff0c;通过智能图像识别与自动化对比&#x…...

SSM框架——Spring面试题

Spring常见面试题 Spring框架中的单例bean是线程安全的吗 不是线程安全的 Spring框架中有一个Scope注解&#xff0c;默认的值就是singleton&#xff0c;单例的。 因为一般在spring的bean的中都是注入无状态的对象&#xff0c;没有线程安全问题&#xff0c;如果在bean中定义了可…...

华为OD机试 - 计算观看演唱会场次(Java 2023 B卷 200分)

题目描述 为了庆祝中国共产党成立100周年&#xff0c;某公园将举行多场文艺表演。由于演出分布在不同的场地&#xff0c;一个人只能同时观看一场演出&#xff0c;且不能迟到早退。连续观看的演出之间最少需要有15分钟的时间间隔。小明是一个狂热的文艺迷&#xff0c;想观看尽可…...

云原生大佬重生,记忆逐步复苏(十三:selinux模块)

目录 1&#xff1a;什么是selinux 1.1 SELinux 的作用 1.2. SELinux 的工作原理 1.3. SELinux 的运行模式 2:解析selinux文件上下文标签策略 3&#xff1a;selinux的布尔值 4:调查和解决selinux问题 1&#xff1a;什么是selinux SELinux&#xff08;Security-Enhanced L…...

Redis hyperloglog学习

背景知识 【伯努利试验】&#xff1a; 【伯努利试验】是一个概率论中的概念&#xff0c;指在相同的条件下重复进行n次独立的试验&#xff0c;每次试验只有两种可能的结果&#xff0c;且这两种结果发生的概率是固定的 抛硬币作为伯努利试验&#xff1a;在抛硬币时&#xff0c;我…...

MySQL高频八股——事务过程中Undo log、Redo log、Binlog的写入顺序(涉及两阶段提交)

大家好&#xff0c;我是钢板兽&#xff01; 在上一篇文章中&#xff0c;我分别介绍了 Undo Log、Redo Log 和 Binlog 在事务执行过程中的作用与写入机制。然而&#xff0c;实际应用中&#xff0c;这三种日志的写入是有先后顺序的。因此&#xff0c;本篇文章将深入探讨它们的写…...

二阶近似 是什么意思

二阶近似 是什么意思 一、二阶近似的概念与举例 二阶近似是数学分析中通过泰勒展开对函数进行近似的方法,保留到二阶项(即包含一阶导数和二阶导数)。在优化问题(如模型训练)中,常用于近似损失函数,帮助更精准地更新模型参数。 举例: 假设损失函数为 L ( θ ) \mathc…...

Oracle GoldenGate 全面解析

Oracle GoldenGate 全面解析 Oracle GoldenGate 是一种实时数据集成和复制解决方案,广泛应用于数据同步、数据库迁移、高可用性和灾难恢复等场景。以下将详细解答您提出的关于 Oracle GoldenGate 的一系列问题。 1. Oracle GoldenGate 的架构组成及其核心组件的作用 架构组成…...