使用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.pswp.cn/web/72522.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72522.shtml
英文地址,請注明出處:http://en.pswp.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 模塊提供了一種強大的方法來構建多智能體協作系統。 在之前的文章中,我們探討了…