PS 5.1 parses a BOM-less .ps1 as the system ANSI codepage, garbling the Chinese / em-dash string literals in five scripts. verify-doc-facts.ps1 failed four checks under 5.1 (CI only ran it under pwsh). Add a BOM to the five files and a CI guard that fails any non-ASCII .ps1 lacking one.
86 lines
2.6 KiB
PowerShell
86 lines
2.6 KiB
PowerShell
param(
|
|
[Parameter(Mandatory = $true)]
|
|
[string]$TargetPath,
|
|
|
|
[int]$StringsLimit = 40,
|
|
|
|
[int]$ImportsLimit = 80,
|
|
|
|
[switch]$RunAnalysis
|
|
)
|
|
|
|
# 强制当前脚本使用 UTF-8 输出,尽量减少中文标题乱码。
|
|
[Console]::InputEncoding = [System.Text.UTF8Encoding]::new($false)
|
|
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
|
$OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
|
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
. (Join-Path $PSScriptRoot '..\..\scripts\lib\ToolDiscovery.ps1')
|
|
|
|
$bootstrapScript = Join-Path $PSScriptRoot '..\..\scripts\bootstrap-reverse.ps1'
|
|
|
|
function Get-RequiredToolSpec {
|
|
param(
|
|
[Parameter(Mandatory = $true)]
|
|
[string]$Name
|
|
)
|
|
|
|
$spec = Resolve-ReverseToolSpec -Name $Name
|
|
if (-not $spec.Available) {
|
|
# Attempt auto-bootstrap
|
|
if (Test-Path -LiteralPath $bootstrapScript) {
|
|
Write-Output "INFO: $Name not found, attempting auto-bootstrap..."
|
|
& powershell.exe -NoProfile -ExecutionPolicy Bypass -File $bootstrapScript -Capability @($Name) -SkipRefresh
|
|
$spec = Resolve-ReverseToolSpec -Name $Name
|
|
}
|
|
if (-not $spec.Available) {
|
|
throw "缺少命令:$Name — 自动安装失败,请手动安装。参考: https://github.com/radareorg/radare2"
|
|
}
|
|
}
|
|
return $spec
|
|
}
|
|
|
|
function Write-Section {
|
|
param(
|
|
[Parameter(Mandatory = $true)]
|
|
[string]$Title
|
|
)
|
|
|
|
# 用固定分段标题,方便人看,也方便后续 grep。
|
|
""
|
|
"=== $Title ==="
|
|
}
|
|
|
|
$rabin2 = Get-RequiredToolSpec -Name 'rabin2'
|
|
$r2 = $null
|
|
if ($RunAnalysis) {
|
|
$r2 = Get-RequiredToolSpec -Name 'r2'
|
|
}
|
|
|
|
# 将输入路径规范化成绝对路径,避免 r2/rabin2 在相对路径下歧义解析。
|
|
$resolvedPath = Resolve-Path -LiteralPath $TargetPath
|
|
$target = $resolvedPath.Path
|
|
|
|
"目标文件: $target"
|
|
|
|
Write-Section -Title '基本信息'
|
|
& $rabin2.Command @($rabin2.PrefixArgs + @('-I', '--', $target))
|
|
|
|
Write-Section -Title '节区'
|
|
& $rabin2.Command @($rabin2.PrefixArgs + @('-S', '--', $target))
|
|
|
|
Write-Section -Title '导入'
|
|
& $rabin2.Command @($rabin2.PrefixArgs + @('-i', '--', $target)) | Select-Object -First $ImportsLimit
|
|
|
|
Write-Section -Title '导出'
|
|
& $rabin2.Command @($rabin2.PrefixArgs + @('-E', '--', $target))
|
|
|
|
Write-Section -Title '字符串'
|
|
& $rabin2.Command @($rabin2.PrefixArgs + @('-zz', '--', $target)) | Select-Object -First $StringsLimit
|
|
|
|
if ($RunAnalysis) {
|
|
Write-Section -Title '函数与入口分析'
|
|
& $r2.Command @($r2.PrefixArgs + @('-A', '-q', '-c', 's entry0;afl;iz;ii;q', '--', $target))
|
|
}
|