记一次 .NET某收银软件 非托管泄露分析

一:背景

1. 讲故事

在我的分析之旅中,遇到过很多程序的故障和杀毒软件扯上了关系,有杀毒软件导致的程序卡死,有杀毒软件导致的程序崩溃,这一篇又出现了一个杀毒软件导致的程序非托管内存泄露,真的是分析多了什么鬼都能撞上。

前几天有位朋友找到过,我他们的程序内存在慢慢的泄露,最后程序会出现崩溃,不知道是什么导致的,让我帮忙看一下怎么回事,简单分析后发现是非托管泄露,让朋友开启了ust并在内存超出预期时抓了一个dump下来,接下来就是分析了。

二:WinDbg 分析

1. 到底是哪里的泄露

相信一直追这个系统的朋友应该知道怎么判断,很简单, 看下 MEM_COMMITHEAP 指标即可,使用 !address -summary 命令输出如下:


0:000> !address -summary

--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
Heap                                    678          93bd0000 (   2.308 GB)  65.39%   57.71%
<unknown>                              2610          3005d000 ( 768.363 MB)  21.26%   18.76%
Free                                    515          1e133000 ( 481.199 MB)           11.75%
Image                                  1526          118f8000 ( 280.969 MB)   7.77%    6.86%
Other                                    19           804e000 ( 128.305 MB)   3.55%    3.13%
Stack                                   390           4900000 (  73.000 MB)   2.02%    1.78%
TEB                                      73             49000 ( 292.000 kB)   0.01%    0.01%
PEB                                       1              1000 (   4.000 kB)   0.00%    0.00%

--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_COMMIT                             4477          c51f9000 (   3.080 GB)  87.25%   77.00%
MEM_FREE                                515          1e133000 ( 481.199 MB)           11.75%
MEM_RESERVE                             820          1ccc4000 ( 460.766 MB)  12.75%   11.25%


--- Largest Region by Usage ----------- Base Address -------- Region Size ----------
Heap                                        38be0000            fd0000 (  15.812 MB)
<unknown>                                     cc6000           7fd9000 ( 127.848 MB)
Free                                        f7590000           88bf000 ( 136.746 MB)
Image                                       5ab2c000            e41000 (  14.254 MB)
Other                                        8cee000           7fb0000 ( 127.688 MB)
Stack                                       14610000             fd000 (1012.000 kB)
TEB                                         ffe51000              1000 (   4.000 kB)
PEB                                         fffde000              1000 (   4.000 kB)

从卦中看,3G的提交内存,Heap 吃了 2.3G,也就表明是 NTHEAP 的泄露,这是一块非托管内存区域,一般都是 C/C++ 语言用 malloc 或者 new 分配的内存,接下来深挖下 NTHEAP 即可,使用 !heap -s 命令。


0:000> !heap -s
SEGMENT HEAP ERROR: failed to initialize the extention
NtGlobalFlag enables following debugging aids for new heaps:
    stack back traces
LFH Key                   : 0x7c31b93c
Termination on corruption : DISABLED
  Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast 
                    (k)     (k)    (k)     (k) length      blocks cont. heap 
-----------------------------------------------------------------------------
00200000 08000002  178304 138172 178304  42165  1747    56    0     34   LFH
    External fragmentation  30 % (1747 free blocks)
006c0000 08001002    1088    224   1088     18     8     2    0      0   LFH
00590000 08041002     256      4    256      2     1     1    0      0      
006a0000 08001002    3136   1184   3136    153    82     3    0      0   LFH
    External fragmentation  12 % (82 free blocks)
00570000 08001002    1088    224   1088     18     8     2    0      0   LFH
...   
15710000 08001002 2185152 2179432 2185152    442  1323   139    0      0   LFH
...

从卦中信息看, 15710000 吃了2.18G,也就表明它是吃内存的主力,这里简单说一下,00200000 是默认的进程堆,除了这个之外都是用非托管代码调用 Win32API 的 HeapCreate 方法创建出来的,接下来就得看下是什么代码创建的。

2. 到底是谁创建的

要想知道是谁创建的,一定要在注册表中开启 ust 选项,大家可以了解下 gflags.exe 工具,参考如下:


PS C:\Users\Administrator\Desktop> gflags /i Example_17_1_7.exe +ust
Current Registry Settings for Example_17_1_7.exe executable are: 00001000
    ust - Create user mode stack trace database

开启之后 win32api 的 HeapAlloc 方法的内部中会到注册表中看一下是否有 ust 值,如果有就会记录分配的调用栈,这样就知道是谁创建的,抓取dump后可以用windbg的 !gflag 命令看下是否开启成功,参考输出如下:


0:000> !gflag
Current NtGlobalFlag contents: 0x00001000
    ust - Create user mode stack trace database

接下来对 Heap=15710000 进行一个 block 分组,看下是否有一些有价值的信息。


0:000> !heap -stat -h 15710000
 heap @ 15710000
group-by: TOTSIZE max-display: 20
    size     #blocks     total     ( %) (percent of total busy bytes)
    2cb dea4 - 26dd40c  (9.58)
    2d7 c778 - 23675c8  (8.72)
    d0 26d64 - 1f8e140  (7.78)
    7c5 2c50 - 1584990  (5.30)
    cb 14449 - 10125e3  (3.96)
    83c 16c2 - bb6578  (2.89)
    cf9 bc4 - 98a1a4  (2.35)
    1f51 3da - 789dfa  (1.86)
    ...

从卦中数据看没有哪个size占用的特别高,接下来就依次从高往低看,发现都是和 prthook 有关,参考输出如下:


0:000> !heap -flt s 2cb
    _HEAP @ 15710000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        1571f948 005d 0000  [00]   1571f960    002cb - (busy)
        15649d70 005d 005d  [00]   15649d88    002cb - (busy)
        ...
        3ec4b900 005d 005d  [00]   3ec4b918    002cb - (busy)
        3ec4bbe8 005d 005d  [00]   3ec4bc00    002cb - (busy)
        3ec4bed0 005d 005d  [00]   3ec4bee8    002cb - (busy)
        3ec4c1b8 005d 005d  [00]   3ec4c1d0    002cb - (busy)
        ...

0:000> !heap -flt s 2d7
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        15665550 005e 0000  [00]   15665568    002d7 - (busy)
        1566b930 005e 005e  [00]   1566b948    002d7 - (busy)
        1566df98 005e 005e  [00]   1566dfb0    002d7 - (busy)
        1566e288 005e 005e  [00]   1566e2a0    002d7 - (busy)
        ...
        39e3acc8 0061 0061  [00]   39e3ace0    002d7 - (busy)
        39e3c508 0061 0061  [00]   39e3c520    002d7 - (busy)
        39e3c810 0061 0061  [00]   39e3c828    002d7 - (busy)
        39e3cb18 0061 0061  [00]   39e3cb30    002d7 - (busy)
        39e3ce20 0061 0061  [00]   39e3ce38    002d7 - (busy)

0:000> !heap -p -a 3ec4c1b8
    address 3ec4c1b8 found in
    _HEAP @ 15710000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        3ec4c1b8 005d 0000  [00]   3ec4c1d0    002cb - (busy)
        771dd969 ntdll!RtlAllocateHeap+0x00000274
        153e7439 prthook!MyShowWindow+0x0001d1f9
        153e543c prthook!MyShowWindow+0x0001b1fc
        153476ab prthook+0x000276ab

0:000> !heap -p -a 39e3ce20
    address 39e3ce20 found in
    _HEAP @ 15710000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        39e3ce20 0061 0000  [00]   39e3ce38    002d7 - (busy)
        771dd969 ntdll!RtlAllocateHeap+0x00000274
        153e7439 prthook!MyShowWindow+0x0001d1f9
        153e543c prthook!MyShowWindow+0x0001b1fc
        153476ab prthook+0x000276ab

3. prthook 到底为何方神圣

从前一节的卦中数据看,貌似 prthook 在不断的弹框,在弹框中用 ntdll!RtlAllocateHeap 分配了非托管内存,那 prthook 到底是个啥呢?可以用 lmvm 看下。


0:000> lmvm prthook
Browse full module list
start    end        module name
15320000 155dc000   prthook    (export symbols)       prthook.dll
    Loaded symbol image file: prthook.dll
    Image path: C:\Windows\SysWOW64\prthook.dll
    Image name: prthook.dll
    Browse all global symbols  functions  data
    Timestamp:        Thu Jun 22 17:16:53 2017 (594B8B05)
    CheckSum:         001F4972
    ImageSize:        002BC000
    File version:     16.17.6.22
    Product version:  16.17.6.22
    File flags:       0 (Mask 3F)
    File OS:          40004 NT Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0804.04b0
    Information from resource tables:
        CompanyName:      Beijing VRV Software Co.,Ltd
        ProductName:      edp
        InternalName:     prthook
        OriginalFilename: prthook.dll_DB
        ProductVersion:   16, 17, 6, 22
        FileVersion:      16, 17, 6, 22
        FileDescription:  prthook_DB
        LegalCopyright:   Copyright (C) 2016 Beijing VRV Software Co.,Ltd
        Comments:         中英文版

从卦中数据看,prthook.dll 所属公司为 Beijing VRV Software Co.,Ltd,无语的是把这个第三方的dll放在Windows的系统目录 C:\Windows\SysWOW64 下,容易让人觉得有点 鸠占鹊巢,接下来查一下百度,发现是 北信源 的,截图如下:

有了这些信息,告诉朋友让客户把这个安全软件卸载掉就可以了。

三:总结

程序的故障如果不是我们的代码造成的,你想通过排查代码找出问题是不可能的事情,追过这个系列的朋友应该深有体会,常见的外在因素有:

  • 杀毒软件
  • 电磁辐射
  • 显卡问题

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

远程如何才能完整快速的传输大文件?

随着互联网技术的迅速进步&#xff0c;远程文件传输已经成为企业间合作与交流中不可或缺的一环。然而&#xff0c;在需要传输大文件的情况下&#xff0c;传统的文件传输方式往往会面临传输速度慢、文件易损等问题。因此&#xff0c;如何实现远程大文件的快速、安全、完整传输&a…

iOS UI掉帧和卡顿优化解决方案记录

UI卡顿原理 在 VSync 信号到来后&#xff0c;系统图形服务会通过 CADisplayLink 等机制通知 App&#xff0c;App 主线程开始在 CPU 中计算显示内容&#xff0c;比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去&#xff0c;由 GPU 进行…

教你用通义千问只要五步让千年的兵马俑跳上现代的科目三?

教你用五步让千年的兵马俑跳上现代的舞蹈科目三&#xff1f; 上面这个“科目三”的视频&#xff0c;只用了一张我上月去西安拍的兵马俑照片生成的。 使用通义千问&#xff0c;只要5步就能它舞动起来&#xff0c;跳上现在流行的“科目三”舞蹈。 全民舞王 第1步 打开通义千问…

设计师们必备的神秘利器!这款设计工具不容忽视!

「即时设计」与Figma类似&#xff0c;它是一种云设计工具&#xff0c;可以与多人实时合作&#xff0c;从设计到评估、交付、团队合作和版本管理。 作为一种国内工具&#xff0c;起初我们对它不是很乐观&#xff0c;但不得不说&#xff0c;经过深入使用&#xff0c;无论是迭代速…

【量化交易实战记】小明的破晓时刻——2023下半年新能源汽车板块的成功掘金之旅

在2023年的炎炎夏日&#xff0c;小明在不断的观察分析市场的过程中&#xff0c;突然敏锐地察觉到了新能源汽车市场的风云变幻。他日复一日地研读行业报告、追踪政策动向、分析公司财报&#xff0c;以及密切关注全球市场动态。那段时间里&#xff0c;新能源汽车行业仿佛迎来了一…

C++ 有需求 需要对数字向下取整 int和 double 混淆 已解决

在项目使用中。 原本以为 直接 ceil(13/ 2) 3 但是实际是错误的。 需要 是 ceil(5.0 / 2) double 才能向上取整。结果有大佬 直接使用两种办法 能解决问题。 由于传入的参数和返回的参数都是double&#xff0c;所以需要手动转化 #include <bits/stdc.h> using name…

Docker部署的gitlab升级指南(15.11.X容器里升级PostgreSQL到13.8)

一、确定当前版本 #进入当前版本容器产看gitlab版本 docker exec -it gitlab cat /opt/gitlab/embedded/service/gitlab-rails/VERSION#显示版本如下 14.4.0二、备份数据&#xff0c;防止升级发生意外 #执行备份命令 docker exec -ti gitlab gitlab-rake gitlab:backup:creat…

Mybatis基础---------增删查改

增删改 1、新建工具类用来获取会话对象 import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.io.Resources;import java.io.IOExcept…

Spring环境搭配

概述 Spring 是一个开源框架&#xff0c;Spring 是于2003 年兴起的一个轻量级的Java 开发框架&#xff0c;由 RodJohnson 在其著作 Expert One-On-One J2EE Development and Design 中阐述的部分理念和原型衍生而来。它是 为了解决企业应用开发的复杂性而创建的。框架的主要优势…

【PDF密码】PDF密码,如何强制取消?

想要给PDF文件设置一个密码防止他人对文件进行编辑&#xff0c;那么我们可以对PDF文件设置限制编辑&#xff0c;设置方法很简单&#xff0c;我们在PDF编辑器中点击文件 – 属性 – 安全&#xff0c;在权限下拉框中选中【密码保护】 然后在密码保护界面中&#xff0c;我们勾选【…

一台电脑如何通过另一台联网电脑访问网络

电脑A没有连接网络&#xff0c;电脑B已经连接wifi。 电脑A如何通过访问电脑B从而连接网络&#xff1f; 1. 将这2台电脑用网线直连 2. 电脑B打开【网络和Internet设置】 3. 右键点击WLAN&#xff0c;选择属性&#xff0c;进入共享tab页面&#xff0c;勾选【允许其他网络用户通过…

统计学-R语言-4.7

文章目录 前言描述水平的统计量平均数分位数中位数四分位数 众数描述差异的统计量&#xff08;数据离散程度&#xff09;极差四分位差方差和标准差变异系数标准分数 描述分布形状的统计量偏度与偏度系数峰度与峰度系数 数据的综合描述综合描述的R函数综合描述的实例 总结 前言 …

Linux安装Rdkafka PHP 扩展(Kafka使用教程)

以是centos为例 #可以查看php版本 php -v#查看php安装的扩展库 php -m 1、首先&#xff0c;确保你已经安装了 PHP 和相关的开发工具。你可以使用以下命令来安装它们&#xff1a; sudo yum install php-devel 中间会问你是否ok&#xff0c;输入y回车&#xff0c;出现complete…

【总结】浅谈深度学习算法与硬件协同优化

写在前面 本文总结了笔者本科期间关于深度神经网络算法与硬件协同优化的思路和常用方法&#xff0c;希望能够给入门此方向的同学带来一定的启发。笔者学疏才浅&#xff0c;如有问题欢迎私信或评论区讨论交流&#xff01; 一、背景与意义 深度神经网络(Deep Neural Network, …

从理论到实践:数字孪生技术的全面应用探讨

数字孪生是一种将实际物体或系统的数字模型与其实时运行状态相结合的概念。这一概念的核心在于创建一个虚拟的、与真实世界相对应的数字副本&#xff0c;以便监测、分析和优化实体系统的性能。 简单理解&#xff0c;数字孪生就是在一个设备或系统的基础上&#xff0c;创造一个…

快速入门Torch读取自定义图像数据集

真有用读取自定义数据集 学习新技术当然首先要看官网了就这&#xff1f;&#xff1f;&#xff1f;官方提供了许多内置好的数据集&#xff0c;但是我需要自定义啊&#xff01;&#xff01;&#xff01;我是谁&#xff1f;我在哪&#xff1f;我在干什么&#xff1f;完全不知道如何…

FFMPEG命令生成各国国旗

文章目录 亚洲篇中国~待补充朝鲜~待补充韩国~待补充蒙古~待补充日本越南~待补充老挝 欧洲篇挪威~待补充瑞典~待补充芬兰~待补充冰岛~待补充丹麦~待补充爱沙尼亚拉脱维亚立陶宛白俄罗斯~待补充乌克兰摩尔多瓦~待补充俄罗斯德国 亚洲篇 中国~待补充 朝鲜~待补充 韩国~待补充 …

Ubuntu 20.04扩容磁盘命令:Ubuntu 20.04扩容系统主分区教程(PV VG LV)

前置知识&#xff1a; 磁盘 最基础的存在&#xff0c;物理磁盘 pv 物理卷&#xff08;同一磁盘 可以划分多个物理卷&#xff09; vg 卷组 &#xff08;一个到多个pv可组成一个卷组&#xff09; lv 逻辑卷 &#xff08;卷组可以划分为多个逻辑卷&#xff09;Ubuntu20.4扩容磁…

使用Python编写一个渗透测试探测工具

本篇将会涉及&#xff1a; 资源探测一个有用的字典资源第一个暴力探测器 资源探测 资源探测在渗透测试中还是属于资源的映射和信息的收集阶段。 主要有以下三个类型&#xff1a; 字典攻击暴力破解模糊测试 字典攻击&#xff0c;在破解密码或密钥的时候&#xff0c;通过自定…