找回密码
 立即注册
首页 业界区 业界 记一次 .NET 某RFID标签打印客户端 崩溃分析 ...

记一次 .NET 某RFID标签打印客户端 崩溃分析

叟澡帅 前天 14:35
一:背景

1. 讲故事

去年微信上有位朋友找到我,说他们的RFID标签打印出现了偶发性崩溃,一直没找到原因,让我帮忙看下怎么回事?然后就让这位朋友用procdump抓一个崩溃dump给我,我看看就好。
二:崩溃分析

1. 为什么会崩溃

双击打开dump,windbg会自动定位到崩溃的上下文,这一点我比较喜欢,有的时候也省去了用 !analyze -v 无趣的等待,参考输出如下:
  1. This dump file has an exception of interest stored in it.
  2. The stored exception information can be accessed via .ecxr.
  3. (4120.43a0): Access violation - code c0000005 (first/second chance not available)
  4. For analysis of this file, run !analyze -v
  5. clr!WKS::gc_heap::find_first_object+0xea:
  6. 00007ffd`9eaa7ecb 833800          cmp     dword ptr [rax],0 ds:30302c30`2c302c30=????????
复制代码
从卦中的 find_first_object 来看,这是经典的 gc标记阶段,在进行深度优先遍历的时候发现了无效对象,进而引发灾难性后果,可以用 k 8 观察调用栈。
  1. 0:006> k 8
  2. # Child-SP          RetAddr               Call Site
  3. 00 0000000e`c103c4e8 00007ffd`9eaa8955     clr!WKS::gc_heap::find_first_object+0xea
  4. 01 0000000e`c103c500 00007ffd`9ea298aa     clr!WKS::GCHeap::Promote+0xc7
  5. 02 0000000e`c103c570 00007ffd`9eaf2822     clr!GcEnumObject+0x97
  6. 03 0000000e`c103c5c0 00007ffd`9ea27f68     clr!GcInfoDecoder::EnumerateLiveSlots+0x1856
  7. 04 0000000e`c103ca20 00007ffd`9ea2887f     clr!GcStackCrawlCallBack+0x2bd
  8. 05 0000000e`c103ce40 00007ffd`9eaa25d8     clr!GCToEEInterface::GcScanRoots+0x4b6
  9. 06 0000000e`c103e300 00007ffd`9eaa0e55     clr!WKS::gc_heap::mark_phase+0x1d9
  10. 07 0000000e`c103e3b0 00007ffd`9eaa0d6b     clr!WKS::gc_heap::gc1+0xef
复制代码
2. 崩溃原因是什么

既然托管堆上有坏对象,那如何找到呢?可以用 !verifyheap 识别就好,参考输出如下:
  1. 0:006> !verifyheap
  2. Could not request method table data for object 0000015A9D59B0D0 (MethodTable: 30302C302C302C30).
  3. Last good object: 0000015A9D59B048.
复制代码
从卦中可以清晰的看到,Object 0000015A9D59B0D0的 MethodTable 30302C302C302C30 是一个无效值,从形态上看很像一段字符的ascii码,有点意思,接下来我们观察对象附近的内存,使用 dp 0000015A9D59B0D0-0xa0 L30 命令观察。
  1. 0:006> dp 0000015A9D59B0D0-0xa0 L30
  2. 0000015a`9d59b030  00000000`00000002 00000000`003a002f
  3. 0000015a`9d59b040  00000000`00000000 00007ffd`9cd985e0
  4. 0000015a`9d59b050  00000000`0000001c 00000002`00000001
  5. 0000015a`9d59b060  00000000`00000008 00000000`00000000
  6. 0000015a`9d59b070  00000000`00000000 00000000`00000000
  7. 0000015a`9d59b080  00000000`00000000 00000000`00000000
  8. 0000015a`9d59b090  00000000`00000000 00000000`00000000
  9. 0000015a`9d59b0a0  00000000`00000000 65636976`6564227b
  10. 0000015a`9d59b0b0  74735f74`736f682e 30223a22`73757461
  11. 0000015a`9d59b0c0  312c302c`302c3033 2c383330`2c383132
  12. 0000015a`9d59b0d0  30302c30`2c302c30 5c302c30`2c302c30
  13. 0000015a`9d59b0e0  302c3130`306e5c72 322c312c`302c302c
  14. 0000015a`9d59b0f0  3030302c`302c362c 2c312c31`30303030
  15. 0000015a`9d59b100  306e5c72`5c313030 007d2230`2c303030
  16. 0000015a`9d59b110  0000002e`00000001 00000000`00000000
  17. 0000015a`9d59b120  00000000`00000000 00007ffd`9cd95a68
  18. 0000015a`9d59b130  0073006d`00000005 00000073`006e0074
  19. 0000015a`9d59b140  00000000`00000000 00000000`00000000
  20. 0000015a`9d59b150  0000015a`9b4ddbb0 00000000`00000000
  21. 0000015a`9d59b160  00000000`00000000 00007ffd`9cd95a68
  22. 0000015a`9d59b170  00720050`00000013 00650074`006e0069
  23. 0000015a`9d59b180  00700061`00430072 006c0069`00620061
  24. 0000015a`9d59b190  00650069`00740069 00000000`00000073
  25. 0000015a`9d59b1a0  00000000`00000000 00007ffd`9cd96878
复制代码
从卦中可以看到 0000015A9D59B0D0 附近被一段字符串覆盖了,看样子是有域外代码将string写溢出了。。。。接下来使用 da 把这段内容给 dig 出来。
  1. 0:006> da /c100 0000015a`9d59b0a0+0x8
  2. 0000015a`9d59b0a8  "{"device.host_status":"030,0,0,1218,038,0,0,0,000,0,0,0\r\n001,0,0,0,1,2,6,0,00000001,1,001\r\n0000,0"}"
复制代码
从卦中看是一段json字符串,看样子应该是非托管代码回写string溢出了,但这个对象生前是不是string呢?这个只能在当前破坏现场寻找了,使用 !lno 观察附近的好对象。
[code]0:006> !lno 0000015a9d59b128Before:  0000015a9d59b048          136 (0x88)        System.Int32[]Current: 0000015a9d59b128           40 (0x28)        System.StringAfter:   0000015a9d59b150           24 (0x18)        FreeHeap local consistency not confirmed.0:006> !lno 0000015a9d59b150Before:  0000015a9d59b048          136 (0x88)        System.Int32[]Current: 0000015a9d59b150           24 (0x18)        FreeAfter:   0000015a9d59b168           64 (0x40)        System.StringHeap local consistency not confirmed.0:006> !mdt -e:2 0000015a9d59b0480000015a9d59b048 (System.Int32[], Elements: 28)[0] 0x1....[16] 0x0[17] 0x0[18] 0x0[19] 0x0[20] 0x6564227b[21] 0x65636976[22] 0x736f682e[23] 0x74735f74[24] 0x73757461[25] 0x30223a22[26] 0x302c3033[27] 0x312c302c0:006> !do 0000015a9d59b168Name:        System.StringMethodTable: 00007ffd9cd95a68EEClass:     00007ffd9cd72ec0Size:        64(0x40) bytesFile:        C:\WINDOWS\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dllString:      PrinterCapabilitiesFields:              MT    Field   Offset                 Type VT     Attr            Value Name00007ffd9cd98648  4000283        8         System.Int32  1 instance               19 m_stringLength00007ffd9cd968e0  4000284        c          System.Char  1 instance               50 m_firstChar00007ffd9cd95a68  4000288       e0        System.String  0   shared           static Empty                                 >> Domain:Value  0000015a9b506c70:NotInit   !do 0000015a9d59b128Name:        System.StringMethodTable: 00007ffd9cd95a68EEClass:     00007ffd9cd72ec0Size:        36(0x24) bytesFile:        C:\WINDOWS\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dllString:      mstnsFields:              MT    Field   Offset                 Type VT     Attr            Value Name00007ffd9cd98648  4000283        8         System.Int32  1 instance                5 m_stringLength00007ffd9cd968e0  4000284        c          System.Char  1 instance               6d m_firstChar00007ffd9cd95a68  4000288       e0        System.String  0   shared           static Empty                                 >> Domain:Value  0000015a9b506c70:NotInit

相关推荐

您需要登录后才可以回帖 登录 | 立即注册