自从我第一次发布这个问题以来,我已经做了很多研究,我想我也搞砸了一些术语。
困境:我公司的信息安全团队已将其标记certutil.exe
为在最近一次网络钓鱼攻击后使用的潜在危险应用程序。这真的很臭,因为我们喜欢certutil.exe
将 hex 文件快速准确地转换为 ascii 文件。这些 ascii 文件必须完全按照certutil.exe -decodehex
执行进行转换,以便由另一个程序解析,以读取和解释由单独的内部程序生成的各种数据。
我有一个似乎可以非常准确地PowerShell
转换Hex
为的脚本ASCII
,但是,它似乎永远不会“完成”,就好像 while 循环可能被关闭了一样。此外,由于流的分解方式,结果文件中有太多的换行符。这些文件通常为 7 MB,大约 7-80亿个字符长,大约 11 个换行符。
我提到的脚本在下面,是对这个链接中呈现的作品的改编。我没有将数据流转换为数据的Hex
表示形式Hex
,而是将其转换为ASCII
.
$bufferSize = 65536
$ASCIIFile = "C:\FooBar.dat"
$stream = [System.IO.File]::OpenRead(
"C:\FixedOutput.dat")
while ( $stream.Position -lt $stream.Length ) {
#BEGIN CALLOUT A
$buffer = new-object Byte[] $bufferSize
$bytesRead = $stream.Read($buffer, 0, $bufferSize)
#END CALLOUT A
for ( $line = 0; $line -lt [Math]::Floor($bytesRead /
16); $line++ ) {
$slice = $buffer[($line * 16)..(($line * 16) + 15)]
$bytes=[System.Text.Encoding]::ASCII.GetString($slice)
$asc = -join($bytes-split"(..)"|?{$_}|%{[char][convert]::ToByte($_,16)})
$asc | Write-Host >> $ASCIIFile -NoNewline
}
#BEGIN CALLOUT B
if ( $bytesRead % 16 -ne 0 ) {
$slice = $buffer[($line * 16)..($bytesRead - 1)]
$output = ""
foreach ( $byte in $slice ) {
$output=[System.Text.Encoding]::ASCII.GetString($byte)
}
$output | ADD-Content $Asciifile
#END CALLOUT B
}
}
$stream.Close()
此外,除了可能以前重复的问题和答案之外,我还改编了这篇 SO 文章PowerShell
中的代码。这组代码的问题是,输出仍然需要 15 分钟左右,但输出不完全相同,因此我们内部程序无法解析信息!certutil.exe -decodehex
此外,我可以从字面上复制和粘贴原始文件中的十六进制数据,将其粘贴到十六进制编辑器中,然后将输出另存为新文件以获得我需要的内容。
问题是,我们经常同时拥有 30 - 40 个这样的文件,我们需要一个闪电般快速的解决方案。. .
我一直在寻找VB.net
(我最熟悉的第二语言)解决方案,但它们在方法上与PowerShell
我找到的方法相当,没有什么能充分获取整个文件并ASCII
相对容易或准确地放置它。
更新:
除了重新格式化问题之外,我还测试了 TheMadTechnician 下面的非常详细的答案,这让我眼中充满了光彩的泪水。如果我能穿过硅片亲吻你,我可能会的。 教科书匹配。闪电般的快。美丽的。
现在。. . . 让我们希望我的 IS 部门也不要标记这种方法并对此发出噪音。. .
我修改了-join
语句,因为我在PowerShell
从Batch
脚本中调用之前连接文件,但这也可以很好地工作PowerShell
。
最后,由于我们的 IS 部门限制了.ps1
脚本的使用,不久前,我发现了一个很棒的选项,可以将复杂的命令嵌入为 Base64 字符串,然后使用Start /MIN powershell -encodedcommand _insertEncodedCommandHere_
再一次 - 我不能感谢你!如果我crypt32.dll
通过 VB.Net 获得了使用同一个库的工作方法,我会回来并将其作为答案发布,但你已经中奖了!