首页 > 其他分享 >记一次 .NET某列控连锁系统 崩溃分析

记一次 .NET某列控连锁系统 崩溃分析

时间:2024-02-21 18:33:16浏览次数:27  
标签:... 093d8f90 00000000 object 003 某列控 连锁 NET Name

一:背景

1. 讲故事

过年喝了不少酒,脑子不灵光了,停了将近一个月没写博客,今天就当新年开工写一篇吧。

去年年初有位朋友找到我,说他们的系统会偶发性崩溃,在网上也发了不少帖子求助,没找到自己满意的答案,让我看看有没有什么线索,看样子这是一个牛皮藓的问题,既然对方有了dump,那就分析起来吧。

二:WinDbg分析

1.为什么会崩溃

不管是 windows 还是 linux 上的.net程序崩溃都会存在异常码,前者是ExceptionCode,后者是 SignalCode,所以先用 !analyze -v 观察看看。


0:003> !analyze -v
CONTEXT:  (.ecxr)
eax=00000008 ebx=00639498 ecx=00000001 edx=0c75e4c8 esi=0063ec88 edi=083d8f77
eip=71ecaf96 esp=1ad2fa00 ebp=1ad2fa58 iopl=0         nv up ei pl nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010202
clr!SVR::gc_heap::mark_object_simple1+0x382:
71ecaf96 f70000000080    test    dword ptr [eax],80000000h ds:002b:00000008=????????
Resetting default scope

EXCEPTION_RECORD:  (.exr -1)
ExceptionAddress: 71ecaf96 (clr!SVR::gc_heap::mark_object_simple1+0x00000382)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000001
NumberParameters: 2
   Parameter[0]: 00000000
   Parameter[1]: 00000008
Attempt to read from address 00000008

从卦中信息看,程序崩在 clr!SVR::gc_heap::mark_object_simple1 方法里,这表示当前gc触发时clr在托管堆标记对象时发现堆损坏了,那到底是不是托管堆损坏呢?可以用 !verifyheap 命令验证下,输出如下:


0:003> !verifyheap 
object 083d8f50: bad member 093D8F90 at 083D8F74
Last good object: 083D8F3C.
object 0c75e4c0: bad member 083D8F77 at 0C75E4C8
Last good object: 0C75E454.

从卦中信息看,确实存在着两个坏对象 083d8f500c75e4c0,接下来的研究重点就是为什么这两个对象会破坏?

2. 对象为什么损坏了

为了方便解读我们从 083d8f50 入手,先用 !do 观察它的布局。


0:003> !do 083d8f50
Name:        System.Windows.DependencyProperty
MethodTable: 727ebe60
EEClass:     72708570
Size:        44(0x2c) bytes
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
...
727e7f0c  40011fe       24 ....InsertionSortMap  1 instance 083d8f74 _metadataMap
...
0:003> !DumpVC /d 727e7f0c 083d8f74
Name:        MS.Utility.InsertionSortMap
MethodTable: 727e7f0c
EEClass:     72721ec8
Size:        12(0xc) bytes
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
727e7f44  40007e9        0 ...geSortedObjectMap  0 instance 093d8f90 _mapStore

0:003> !DumpObj /d 093d8f90
<Note: this object has an invalid CLASS field>
Invalid object

根据对象的布局知识,093d8f90 存放的是 mt,看样子是mt被损坏了,接下来用 dp 观察下这个地址的附近内存。


0:003> dp 093d8f90-0x20 L10
093d8f70  727e8b50 032e3750 1085da60 04a46fd9
093d8f80  00000000 727e8b50 032e3a48 08157ef0
093d8f90  03217272 00000000 727e8b50 032e353c
093d8fa0  08079f9c 02c028d2 00000000 727e8b50

0:003> !lno 093d8f90
Before:  093d8f84           20 (0x14)	MS.Internal.WeakEventTable+EventKey
After:   093d8f98           20 (0x14)	MS.Internal.WeakEventTable+EventKey
Heap local consistency confirmed.

0:003> !do 093d8f84
Name:        MS.Internal.WeakEventTable+EventKey
MethodTable: 727e8b50
EEClass:     727076c4
Size:        20(0x14) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_MSIL\WindowsBase\v4.0_4.0.0.0__31bf3856ad364e35\WindowsBase.dll
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
727ec0f4  4001a28        4 ....WeakEventManager  0 instance 032e3a48 _manager
7112dbd4  4001a29        8        System.Object  0 instance 08157ef0 _source
7112f6bc  4001a2a        c         System.Int32  1 instance 52523634 _hashcode

从卦中信息看 mt=03217272 肯定是不对的,但奇怪的是这附近的内存并没有损坏,它是EventKey._hashcode的16进制表示,我去,这就奇葩了。。。一下子陷入了迷茫。

3. 内存为什么没坏

说实话分析了这么多的dump,这种情况还是第一次遇见,根据上一节的分析,现在可以怀疑 093d8f90 这个地址本身就是错的,接下来观察它的所属地址 083d8f74 附近的内存。


0:003> dp 083d8f74 -0x40 L20
083d8f34  00000003 00000000 727e72c9 083d8ba4
083d8f44  083d8ec8 775e7de3 00000000 727ebe61
083d8f54  083d8ba4 0ec9e934 083d8ec8 083d8f20
083d8f64  00000000 00000000 00000000 00020368
083d8f74  093d8f90 00000000 727ee329 083d8ec8
083d8f84  0ec9eaf4 000000e0 00000000 727e7f45
083d8f94  083d8fa4 00000001 000000e0 00000000
083d8fa4  727e7fb1 00000002 083d8f04 000000e0

如果你仔细观察卦中的区域内存地址,你会发现一个有意思的现象,它附近的对象都是 083 开头的,凭什么它是 093 开头的?对他产生了怀疑之后,我们观察下托管堆中 mt=727e7f44 下是否存在 093d8f90 的实例,截图如下:

从卦中可以清晰的看到确实不存在 093d8f90 对象,但存在一个将 9 -> 8 之隔的 083d8f90,有经验的朋友应该知道,这又是一例经典的bit位翻转导致的程序崩溃,可以用 .formats 命令观察下二进制的布局:

4. 另一个坏对象也是如此吗

刚才的 093d8f90 我们搞明白了是由于bit位翻转导致,那 083d8f77 也是如此吗?有了刚才的经验这个就比较好验证了,可以查一下 mt=727ee328 下是否有这个实例。


0:003> !do 0c75e4c0
Name:        System.Windows.Media.Pen
MethodTable: 6f38a110
EEClass:     6f1568b4
Size:        40(0x28) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_32\PresentationCore\v4.0_4.0.0.0__31bf3856ad364e35\PresentationCore.dll
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
...
727ee328  40011dc        8 ...endencyObjectType  0 instance 083d8f77 _dType
...

0:003> !dumpheap -mt 727ee328
 Address       MT     Size
...
083d8db0 727ee328       20     
083d8f7c 727ee328       20     
...

又是一个无语的结论,原来 083d8f7c 被错赋成了 083d8f77,用 .formats 命令观察之后发现有 3个bit的翻转。截图如下:

三:总结

有丰富经验的朋友肯定知道,bit翻转大多是辐射导致计算机数字信号偶发的紊乱,这也是为什么医院要加个铅版来阻隔,而这个程序所处的环境刚好是辐射比较多的高铁系。

所以分析完之后,非我等调试师能为之,远离辐射。。。

图片名称

标签:...,093d8f90,00000000,object,003,某列控,连锁,NET,Name
From: https://www.cnblogs.com/huangxincheng/p/18025970

相关文章

  • 如何让.NET Core支持GB2312和GBK
    在.NETCore中,默认是不支持GB2312和GBK编码的。若果强制使用Encoding.GetEncoding(“GB2312”)的时候会抛出异常。所以在.NETCore中如果我们要使用GB2312和GBK编码,需要给项目引入一个Nuget包:包安装可以使用以下方法来添加System.Text.Encoding.CodePages:VisualStudio......
  • Rust 编译报 spurious network error (1 tries remaining): [7] Couldn't connect to
    现象:当执行 cargobuild时报类似错误:warning:spuriousnetworkerror(3triesremaining):[7]Couldn'tconnecttoserver(Failedtoconnectto127.0.0.1port8899after2040ms:Couldn'tconnecttoserver);class=Net(12)warning:spuriousnetworkerror......
  • 全流程点云机器学习(二)使用PaddlePaddle进行PointNet的机器学习训练和评估
    前言这不是高支模项目需要嘛,他们用传统算法切那个横杆竖杆流程复杂耗时很长,所以想能不能用机器学习完成这些工作,所以我就来整这个工作了。基于上文的数据集切分,现在来对切分好的数据来进行正式的训练。本系列文章所用的核心骨干网络代码主要来自点云处理:实现PointNet点云分割......
  • 使用NSSM 把 .net core 开发的控制台程序部署成windows 服务
    0.背景应工作需要需要写个对指定网站附件进行监控,发现有新附件时需要程序进行自动下载,程序设计使用技术如下:开发语言:.net8C# 定时任务:Quartzhttp请求和下载:HttpClienthtml解析:HtmlAgilityPack服务部署工具:NSSM 1.什么是NSSM在windows平台NSSM可以把bat、exe等文件......
  • NETGEAR WNDR4300路由器tftp方式 刷机
    1、使用网线将路由器的lan口(黑色)和hostpc的网口相连。2、将路由器断电,用曲别针或其他工具,一直按住路由器背面的reset口。3、打开路由器电源开关,观察电源指示灯(此时保持按住reset按钮不要松手),直到电源灯由橙色闪烁状态变到绿色闪烁状态(说明设备已经进入到了TFTP修复模式)。4、......
  • Multi-behavior Recommendation with Graph Convolutional Networks论文阅读笔记
    Abstract传统的推荐模型通常只是要一种类型的用户-项目交互,但是却有着严重的数据稀疏或者冷启动问题。使用多种类型的用户-项目交互的多行为推荐,如点击和收藏,可以作为一种有效的解决方案。早期队多行为推荐的努力未能捕捉到行为对目标行为的不同影响强度。它们还忽略了多行为数据......
  • .NET 9 预览版:打造云原生及人工智能 AI 平台
    前言微软发布了.NET9首个预览版,分享.NET团队对.NET9的初步愿景,该愿景将于今年年底在.NETConf2024上发布。重点关注针对云原生和人工智能领域的应用程序开发以及在性能、生产力和安全性方面投入大量资源,将.NET9打造成云原生开发平台和工具。 云原生.NET团队......
  • 云原生周刊:在 Kubernetes 集群中使用通配符证书 | 2024.2.19
    开源项目推荐kube-fledgedkube-fledged是一个KubernetesOperator,用于直接在Kubernetes集群的工作节点上创建和管理容器映像的缓存。它允许用户定义图像列表以及这些图像应缓存(即拉取)到哪些工作节点上。因此,应用程序Pod几乎立即启动,因为不需要从注册表中提取映像。kube-f......
  • 界面控件DevExpress ASP.NET Spreadsheet组件 - 轻松集成电子表格功能!(二)
    DevExpressASP.NETSpreadsheet组件允许您轻松地将电子表格功能合并到任意ASP.NET应用程序,它可以加载、转换和保存工作簿到XLS-XLSx二进制文件格式,还可以导出和导入XLSX、CSV和TXT文件。在上文中(点击这里回顾>>),主要为大家介绍了DevExpressASP.NETSpreadsheet组件的Excel兼容......
  • ControNet基础学习
    1.使用背景AI绘画虽然能够利用图生图的方式,生成类似图片风格特征的一种新图片,但是,大体上还是无法精准控制整体图片的细节特征,如果用于自娱自乐的倒也可以,但是在更专业的场景上,精准控制出图成为了AI绘画的一个重大难题。2.基础原理在控制原理上ControNet和LoRA是有很多相似的......