捉虫笔记(二)之 杀软请你自重点

news2024/11/11 8:10:06

捉虫笔记(二)之 杀软请你自重点

前一篇文章介绍了如何配置符号,这一篇文章我们来个实战。

1 现象

在我们的程序中利用robocopy进行文件的复制。但是QA反馈,只要进行了备份操作,整个进程就会卡住。但是奇怪的是只有他的机器能发现。刚开始的时候我没有太重视这个问题。随着内部反馈的人多了,我开始对这个现象感兴趣了。

2 分析过程

2.1 初步猜测

首先我们是利用的python的脚本启动robocopy,下面是伪代码:

proc = subprocess.Popen("robocopy %s %s /E /MT:32 /XD .* /XF *.gmp *.zip" % (src, dst), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
_, _ = proc.communicate()

robocopy是windows自带的一个复制程序,我觉得可靠性应该是很高的。所以一开始我觉得出问题的肯定 是在我们的内部程序,我仔细检查了每个参数一无所获。

目标只能转移到robocopy本身,刚开始觉得卡住可能是因为需要复制的文件过多,导致线程卡住,但是执行了10分钟还是纹丝不动。我就意识到估计死锁或者等待某个事件。

但是需要证据,此时我让QA的同事立马生成robocopy的dump文件。

2.2 线程堆栈分析

拿到dump之后,立马使用WinDbg打开。

首先就执行了!runaway看看哪个线程跑的最欢。
在这里插入图片描述

发现0s和5s排在前面。0号线程其实是UI线程(windows中0号线程默认是UI线程),用时最长可以理解。但是仔细分析就发现5号线程其实还没有开始执行就已经卡住了。看来我们刚开始的猜测是有出入的。robocopy刚启动就被按住不动了。

即使卡住了,看看是不是有上锁了,执行!cs -l,查看发现就没有任何的锁。

在这里插入图片描述

再执行.exr -1看看是不是出现了什么异常。发现最近的异常还是断点异常。说明也没有异常。

在这里插入图片描述

思考片刻,决定还是看看每个线程的 堆栈情况如何。执行~*k,查看所有线程的堆栈,还好线程不多。

因为涉及到一些敏感信息,我把关键点使用softwareXXX来代替。

 # Child-SP          RetAddr               Call Site
00 00000092`21d3f088 00007ffb`ddfc1c4e     ntdll!NtWaitForSingleObject+0x14
01 00000092`21d3f090 00007ff7`4c9009fa     KERNELBASE!WaitForSingleObjectEx+0x8e
02 00000092`21d3f130 00007ff7`4c90296d     Robocopy!WaitMultiThreaded+0x50e
03 00000092`21d3f1b0 00007ff7`4c90f3ad     Robocopy!wmain+0x681
04 00000092`21d3f970 00007ffb`dec37344     Robocopy!__wmainCRTStartup+0x14d
05 00000092`21d3f9b0 00007ffb`e051cc91     kernel32!BaseThreadInitThunk+0x14
06 00000092`21d3f9e0 00000000`00000000     ntdll!RtlUserThreadStart+0x21
0:000> ~*k;

.  0  Id: 5bf8.4ee4 Suspend: 0 Teb: 00000092`21f62000 Unfrozen
 # Child-SP          RetAddr               Call Site
00 00000092`21d3f088 00007ffb`ddfc1c4e     ntdll!NtWaitForSingleObject+0x14
01 00000092`21d3f090 00007ff7`4c9009fa     KERNELBASE!WaitForSingleObjectEx+0x8e
02 00000092`21d3f130 00007ff7`4c90296d     Robocopy!WaitMultiThreaded+0x50e
03 00000092`21d3f1b0 00007ff7`4c90f3ad     Robocopy!wmain+0x681
04 00000092`21d3f970 00007ffb`dec37344     Robocopy!__wmainCRTStartup+0x14d
05 00000092`21d3f9b0 00007ffb`e051cc91     kernel32!BaseThreadInitThunk+0x14
06 00000092`21d3f9e0 00000000`00000000     ntdll!RtlUserThreadStart+0x21

   1  Id: 5bf8.4c68 Suspend: 0 Teb: 00000092`21f6a000 Unfrozen
 # Child-SP          RetAddr               Call Site
00 00000092`2217fca8 00007ffb`ddfc1c4e     ntdll!NtWaitForSingleObject+0x14
01 00000092`2217fcb0 00007ffb`d9776e2b     KERNELBASE!WaitForSingleObjectEx+0x8e
02 00000092`2217fd50 00007ffb`dec37344     softwareXXX+0x76e2b
03 00000092`2217fd80 00007ffb`e051cc91     kernel32!BaseThreadInitThunk+0x14
04 00000092`2217fdb0 00000000`00000000     ntdll!RtlUserThreadStart+0x21

   2  Id: 5bf8.5930 Suspend: 0 Teb: 00000092`21f6c000 Unfrozen
 # Child-SP          RetAddr               Call Site
00 00000092`221ff478 00007ffb`ddffbea0     ntdll!NtWaitForMultipleObjects+0x14
01 00000092`221ff480 00007ffb`ddffbd9e     KERNELBASE!WaitForMultipleObjectsEx+0xf0
02 00000092`221ff770 00007ffb`d977a9c0     KERNELBASE!WaitForMultipleObjects+0xe
03 00000092`221ff7b0 00007ffb`dec37344     softwareXXX+0x7a9c0
04 00000092`221ff810 00007ffb`e051cc91     kernel32!BaseThreadInitThunk+0x14
05 00000092`221ff840 00000000`00000000     ntdll!RtlUserThreadStart+0x21

   3  Id: 5bf8.5dbc Suspend: 0 Teb: 00000092`21f6e000 Unfrozen
 # Child-SP          RetAddr               Call Site
00 00000092`2227f648 00007ffb`e051d407     ntdll!NtWaitForWorkViaWorkerFactory+0x14
01 00000092`2227f650 00007ffb`dec37344     ntdll!TppWorkerThread+0x2f7
02 00000092`2227f950 00007ffb`e051cc91     kernel32!BaseThreadInitThunk+0x14
03 00000092`2227f980 00000000`00000000     ntdll!RtlUserThreadStart+0x21

   4  Id: 5bf8.7f4 Suspend: 0 Teb: 00000092`21f70000 Unfrozen
 # Child-SP          RetAddr               Call Site
00 00000092`222ff7d8 00007ffb`e051d407     ntdll!NtWaitForWorkViaWorkerFactory+0x14
01 00000092`222ff7e0 00007ffb`dec37344     ntdll!TppWorkerThread+0x2f7
02 00000092`222ffae0 00007ffb`e051cc91     kernel32!BaseThreadInitThunk+0x14
03 00000092`222ffb10 00000000`00000000     ntdll!RtlUserThreadStart+0x21

   5  Id: 5bf8.3694 Suspend: 0 Teb: 00000092`21f7a000 Unfrozen
 # Child-SP          RetAddr               Call Site
00 00000092`224fd878 00007ffb`ddfc1c4e     ntdll!NtWaitForSingleObject+0x14
01 00000092`224fd880 00007ffb`d978abed     KERNELBASE!WaitForSingleObjectEx+0x8e
02 00000092`224fd920 00007ff7`4c90c25f     softwareXXX+0x8abed
03 00000092`224fe2a0 00007ff7`4c8ff78f     Robocopy!CZEnt::CopyData+0x467
04 00000092`224ff390 00007ff7`4c90014e     Robocopy!RoboCopy+0x18b
05 00000092`224ff400 00007ffb`e0533730     Robocopy!RoboCopyWorker+0x6e
06 00000092`224ff430 00007ffb`e051d79a     ntdll!TppWorkpExecuteCallback+0x130
07 00000092`224ff480 00007ffb`dec37344     ntdll!TppWorkerThread+0x68a
08 00000092`224ff780 00007ffb`e051cc91     kernel32!BaseThreadInitThunk+0x14
09 00000092`224ff7b0 00000000`00000000     ntdll!RtlUserThreadStart+0x21

接下来就是仔细分析每个线程的堆栈情况了。可以看到0,1,2,以及5号线程都在等待某个内核对象。

3,4号线程就是windows内部的线程池,这里我们暂且不关注。

先分析0号线程,我们查了函数原型NtWaitForSingleObject,第一个参数就是需要等待的内核对象,第二个参数是否可中断,第三个参数超时时间。根据x64调用协议,前四个非浮点数且小于64位参数都是寄存器rcx,rdx,r8,r9中。

NTSTATUS NtWaitForSingleObject(
  [in] HANDLE         Handle,
  [in] BOOLEAN        Alertable,
  [in] PLARGE_INTEGER Timeout
);

我们试着找出这个参数,在WinDbg命令中执行r rcx,就是打印出rcx寄存器中的值。

找到这个值之后,我们需要验证这个值是不是内核对象。再执行!handle xxx f,此时就会打印出关于此内核对象的具体信息。
在这里插入图片描述

如法炮制,分析切换到1,2,5号线程。比如我们切换到1号线程:
在这里插入图片描述

这里需要说下2号线程调用的函数NtWaitForMultipleObjects,这个函数在微软的文档并未公布函数原型。但是我们可以到此线程的第二帧调用的函数KERNELBASE!WaitForMultipleObjectsEx,而这个函数原型是有的。

从名字可以大致猜出此函数应该是等待多个内核对象。第一个参数就是等待的个数,第二个就是类似数组里面保存了句柄,第三个和第四含义和之前是一样的。

DWORD WaitForMultipleObjects(
  [in] DWORD        nCount,
  [in] const HANDLE *lpHandles,
  [in] BOOL         bWaitAll,
  [in] DWORD        dwMilliseconds
);

我们利用WinDbg来找下句柄值。
在这里插入图片描述

一共等待两个句柄值0x128, 0x130。我们在验证下找得对不对。看如下的截图发现我们找得没有错。
在这里插入图片描述

这里我把句柄做成表格进行对比。

线程句柄信息
00x194在这里插入图片描述
1x128在这里插入图片描述
20x128, 0x130在这里插入图片描述
50x738在这里插入图片描述

从表格中我们大致可以看到等待的句柄是Event类型,以及权限,当前Event的状态信息。

2.3 陷入僵局

从上面的表格分析,此时线程中并没有出现明显的相互等待的现象。此时有点穷途末路的感觉。

我在想是不是还有蛛丝马迹被我忽略了。

对,还有3,4号线程我并没有分析。我立马着手在msdn搜索函数原型,可惜这两个函数在msdn未公布任何信息。但是我还不死心继续Google上搜索关于这个函数的信息,从网络搜索的信息也是相当的少,都是一笔带过简单的连参数信息都没有提及。

我开始深入思考,到底还有什么信息被我遗漏了 。

坐着已经让我无法思考了,需要走两步清空下大脑。

转了一圈回来之后,发现还是需要从基础的堆栈分析,一个帧一个帧过滤下。从上面的堆栈中可以看到5号线程堆栈是最长的。我们再看下5号线程的堆栈信息。

0:000> ~5k;
 # Child-SP          RetAddr               Call Site
00 00000092`224fd878 00007ffb`ddfc1c4e     ntdll!NtWaitForSingleObject+0x14
01 00000092`224fd880 00007ffb`d978abed     KERNELBASE!WaitForSingleObjectEx+0x8e
02 00000092`224fd920 00007ff7`4c90c25f     softwareXXX+0x8abed
03 00000092`224fe2a0 00007ff7`4c8ff78f     Robocopy!CZEnt::CopyData+0x467
04 00000092`224ff390 00007ff7`4c90014e     Robocopy!RoboCopy+0x18b
05 00000092`224ff400 00007ffb`e0533730     Robocopy!RoboCopyWorker+0x6e
06 00000092`224ff430 00007ffb`e051d79a     ntdll!TppWorkpExecuteCallback+0x130
07 00000092`224ff480 00007ffb`dec37344     ntdll!TppWorkerThread+0x68a
08 00000092`224ff780 00007ffb`e051cc91     kernel32!BaseThreadInitThunk+0x14
09 00000092`224ff7b0 00000000`00000000     ntdll!RtlUserThreadStart+0x21

5号线程刚开始Robocopy!CZEnt::CopyData就被按住了。我们反汇编看下Robocopy!CZEnt::CopyData代码。

反汇编的函数大概有1m A4纸那么长,该怎么看呢。

我们可以直接从02帧那里看到返回值地址00007ff74c90c25f,这个返回值就是softwareXXX+0x8abed执行完后返回到Robocopy!CZEnt::CopyData

再从Robocopy!CZEnt::CopyData反汇编的函数搜索此地址。

搜索的结果如下:
在这里插入图片描述
结果发现了点异常,上面的一条语句好像不大对劲。反汇编这里的函数是Robocopy!_imp_CopyFile2,而实际堆栈里面显示的却另外一个模块的代码。

再看softwareXXX这个模块加上了一个相当大的偏移0x8abed,这是不同寻常的,很有可能找的符号不对。

而这个模块的代码在Robocopy中根本就没有。这是从哪里来的?相当的奇怪,突然感觉有点意思。

看下这个模块的信息,在命令中执行lmvm softwareXXX,发现了端倪,原来是个杀软,把这个dll注入了robocopy中,很有可能对函数进行了拦截,导致了这个函数一直无法返回。

0:000> lmvm softwareXXX
Browse full module list
start             end                 module name
00007ffb`d9700000 00007ffb`d9a93000   softwareXXX   (no symbols)           
    Loaded symbol image file: softwareXXX.dll
    Image path: C:\Program Files\softwareXXX\softwareXXX.dll
    Image name: softwareXXX.dll
    Browse all global symbols  functions  data
    Timestamp:        Tue Mar 26 22:56:55 2024 (6602E237)
    CheckSum:         0038B6E1
    ImageSize:        00393000
    File version:     1.0.1.622
    Product version:  1.0.1.622
    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:      https://www.softwareXXX.cn/
        ProductName:      XDR
        InternalName:     softwareXXX.dll
        OriginalFilename: softwareXXX.dll
        ProductVersion:   1.0.1.622
        FileVersion:      1.0.1.622
        FileDescription:  softwareXXX 应用程序监控模块
        LegalCopyright:   Copyright (C) 2021

再回过头看上面的堆栈信息,此dll对系统的其他的关键函数也进行了拦截处理。

2.4 验证问题

接下来就是找IT部门,让他们把robocopy加入白名单,再进行测试。经过协商之后,我们在进行测试问题就解决了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NIO专题学习(一)

一、BIO/NIO/AIO介绍 1. 背景说明 在Java的软件设计开发中,通信架构是不可避免的。我们在进行不同系统或者不同进程之间的数据交互,或者在高并发的通信场景下都需要用到网络通信相关的技术。 对于一些经验丰富的程序员来说,Java早期的网络…

前端 HTML 概述

目录 1. HTML概述 1.1 超文本标记语言 1.2 标签 2. HTML 解析与编辑 2.1 解析与访问 2.2 编辑 html文件 1. HTML概述 HTML( Hyper Text Markup Language:超文本标记语言 ):主要用于网页主体结构的搭建,在网页上…

维修雅萌五代射频仪

维修雅萌五代射频仪,主板进水,看起来有点严重,看看这回能不能把它修好

MySQL--数据库索引

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 MySQL数据库--索引 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可提高数据库中特定数据的查询速度 一、索引简介 1、…

python实现小游戏——植物大战僵尸(魔改版本)

制作一款DIY的‘植物大战僵尸’游戏引起了很多人的兴趣。在这里,我将分享一个使用Python语言在PyCharm环境中开发的初始状态版本。这个版本主要应用了pygame库来完成,是一个充满创意和趣味的魔改版本。 文章目录 前言一、开发环境准备二、代码1.main方法…

Unbuntu 服务器- Anaconda安装激活 + GPU配置

一、Anaconda安装激活 1.更新 sudo apt-get update 2.安装wget、vim sudo apt-get install wget sudo apt-get install vim 3.安装Anaconda 进入这个网址:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 点这里&#x…

【每日一题】【技巧】【LeetCode热题 100】【力扣】75. 颜色分类 C++

力扣75. 颜色分类 75. 颜色分类 题目描述 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 …

永久旋转 PDF 文件的 2 种简便方法

PDF 文件通常由扫描仪创建,用于呈现文档或书籍。当您输出 PDF 作品时,打开它,会发现有几页是颠倒的。 你该怎么办? 将这些页面倒置扫描,按顺序排列,最后创建正确的 PDF 文件? 当然&#xff0…

暑假第三周任务——天气预报

暑假第三周任务——天气预报 文章目录 暑假第三周任务——天气预报前言URL与APIAPI与URL的关系 获取网络请求首页搜索界面详情界面添加功能 浏览界面总结 前言 这个天气预报主要是通过申请网络请求来获取实时数据,来实现一个天气预报的功能,在这里主要是…

对优先级队列(堆)的理解

目录: 一. 优先级队列: 二. 优先级队列的模拟实现: 三.常用接口介绍: 一. 优先级队列: 1 概念: 队列是一种先进先出的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时…

红酒与爱情:浪漫时刻的佳酿

在爱情的世界里,红酒如同一首温柔的诗篇,轻轻诉说着浪漫与甜蜜。当定制红酒洒派红酒(Bold & Generous)与爱情相遇,它们共同绘制出一幅幅令人心醉的浪漫画卷,让每一刻都充满了无尽的柔情与温暖。 一、爱…

MLOPS工具集教程-快速入门MLflow

文章目录 一、什么是 MLOps?二、MLOps 工具有什么作用?三、免费开源 MLOps 工具和平台——MLflow3.1 MLflow介绍3.2 安装MLflow3.3启动MLflow3.4 API文档3.5 训练模型演示实例 MLOps 策略越来越多地应用于机器学习模型以及构建这些模型的团队中&#xff…

webpack打包发布~

1、安装webpack(局部安装webpack)。 npm i webpack webpack-cli -D 2、安装成功之后,你会在package.json文件中看到这个。 3、新建webpack.config.js文件,里面写配置编译模式,入口出口等(这里演示的是单入…

任务管理器中的CompatTelRunner进程是做什么的?我该怎样把它关闭

一、问题描述 当我们打开电脑使用时候会发现系统反应较慢,使用起来没有那么流畅;此时我们打开任务管理器后发现是一个名为【CompatTelRunner】的进程占用大量的CPU资源导致(点击任务管理器的CPU字样即可对使用资源进行排序)&#…

【靶场实操】sql-labs通关详解----第二节:前端页面相关(Less-11-Less-17)

SQL注入攻击是一种针对Web应用程序的安全漏洞,那么自然,SQL注入攻击也和前端页面息息相关,用户输入未被正确处理、动态查询的构建、前端JavaScript代码错误,等等我问题都可能造成安全威胁。 在上一节,我们了解了基础的…

23届24届均可投!Engineering Star Program火热进行中

Hi 大家好,我是Chowley,我们组现在还有个青年工程师的HC(23-24届均可),正在寻找QA队友,有兴趣用我内推码官网投递,简历直接发我ld 我是今年校招进入的虾皮,现在full-time两个月了&a…

互联网十万个为什么之什么是负载均衡?

负载均衡是一种对流量进行按需分发的服务,通过将流量分发到不同的后端服务器来扩展应用系统的吞吐能力,并且可以消除系统中的单点故障,提升应用系统的可用性。 为什么需要负载均衡? 负载均衡的出现主要是为了解决用户在网络服务…

【Godot4自学手册】第四十三用着色器(shader)给纹理描边

这一节我们学一下用着色器(shader)描边效果。来看看最终效果: 一、进行shader初始设置 首先我们进入NPC场景,选择Sprite2D节点,在检查器中中岛CanvasItem属性,并在Material->Material后方选择下拉按钮…

如何从智联招聘网站快速抓取职位详情?两大技巧揭秘

摘要: 本文将揭秘如何利用Python爬虫技术,高效且合法地从智联招聘网站抓取职位详情信息。通过实战示例,展现两大核心技巧,助你在大数据时代抢占先机,为你的市场分析、人才研究提供强大支持。 一、引言:数据…

LLM4Decompile反编译大模型的试用实践过程梳理

LLM4Decompile 是一款开源大型语言模型,专注于反编译工作,我们将其试用过程进行介绍: 论文地址:https://arxiv.org/abs/2403.05286 代码地址:https://github.com/albertan017/LLM4Decompile 首先,找到代码位置: 1.搭建基础环境1.python3,我用的是3.12.4 …