标题: [文本处理] 【已解决】base64解密并解压缩的批处理 [打印本页]
作者: 304802301 时间: 2024-10-10 20:16 标题: 【已解决】base64解密并解压缩的批处理
本帖最后由 304802301 于 2024-10-11 16:43 编辑
各位大哥我这边有一个批量base64解密的需求,我描述下:
1、我这边有上万个原始文件,文件格式不固定,编码格式都是编码规范为GB2312
2、文件都可以用txt形式打开,打开后有两部分组成,上半段是明文形式,不管他。
3、下半部分是经过base64加密过的密文,需要处理
4、第一种文件,密文不分段,以<FileCont Value="开头,以"/>结尾,取中间的内容,就是密文。将密文base64解密后,转换成zip格式的压缩包,再把这个压缩包自动解压,解压后文件夹名字自动命名成原始文件的名字,就行了
5、第二种文件,密文分若干段的:
第一段以<BidFile1 Value="开头,以" />结尾;
第二段以<BidFile2 Value="开头,以" />结尾;
第三段以<BidFile3 Value="开头,以" />结尾;
等
等
等
6、以上分段,有的原始文件可能只分一段,有的可能分几十段,不一定。但每一段的固定开头标识中的数字都是1开始的连续自然数。要自动把每一段的值拼起来,就是一整段完整的密文。将密文base64解密后,转换成zip格式的压缩包,再把这个压缩包自动解压【这个压缩包是有密码的,密码=原始文件上半段明文中UniqueCode的值经过base64解密后,并且密码很长,我用7zip支持解压】,【举个例子,示例中的第二种情况.sdf这个文件,里面的明文区找UniqueCode,值是NWIzNWU1ZmFkYTMwNDM5ZTk4OTgyNzQ2OTE2ZjBkMDU1N2UxY2IwZTNjZjE0ZjIxYjZlOGI2ODQ4YzUwNDMzMGRmYjg5YmY2NDA2NTQ4Mzk5ZDBjMjI2NmY0NDA0YmY2MjYzNTk2NzkyYzNiNDMyMDk3YmEzMWRkMzhiYzA0Zjg= 然后去base64解密成5b35e5fada30439e98982746916f0d0557e1cb0e3cf14f21b6e8b6848c504330dfb89bf6406548399d0c2266f4404bf6263596792c3b432097ba31dd38bc04f8 这个就是压缩包的解压密码】解压后文件夹名字自动命名成原始文件的名字,就行了
7、bat中可以指定原始文件的路径,可以指定解压后的路径,批量操作,按顺序一个一个的解压(不要多线程,容易挂)
8、支持日志输出,记录时间及几个重要节点
XX点XX分开始处理,文件名为“第一种情况.89jjj”
XX点XX分合并密文开始
XX点XX分合并密文结束
XX点XX分经过base64解密后的密码为XXXXXXXXXX
XX点XX分解压文件开始
XX点XX分解压文件结束
XX点XX分文件夹名字修改成功,修改为“第一种情况”
9、有时候原始文件很大,可以考虑生成缓存文件或者临时文件过渡
10、有两个例子文件,可以尝试下效果。:https://pan.baidu.com/s/1fYcf2AaE1lyWnidmTOKkbQ 提取码:uni7
感谢各位大佬!
作者: czjt1234 时间: 2024-10-11 12:24
本帖最后由 czjt1234 于 2024-10-11 16:21 编辑
- rem 另存为 ANSI 编码 bat
- ' & cls & cscript.exe /nologo /e:vbscript "%~f0" %* & pause & exit /b
-
- Option Explicit
- Dim oFSO, oTextStream, oWshShell, oDOMDocument, s
-
- Const f1 = "d:\1\" '原始文件的路径
- Const f2 = "d:\2\" '解压后的路径,日志文件路径,临时文件路径
-
- Const [7z] = "C:\Program Files\7-Zip\7z.exe" '7z的路径
-
- Set oWshShell = CreateObject("WScript.Shell")
- Set oFSO = CreateObject("Scripting.FileSystemObject")
- Set oDOMDocument = CreateObject("Msxml2.DOMDocument")
- oWshShell.Run "cmd.exe /c md """ & f2 & """", 0, True
- s = oFSO.BuildPath(f2, "日志.txt")
- Set oTextStream = oFSO.OpenTextFile(s, 8, True)
- For Each s In oFSO.GetFolder(f1).Files
- Call t(s.Path)
- Next
- oTextStream.Close()
- wsh.Echo "ok"
-
- Sub t(ByVal f)
- Dim oXMLDOMElement, oTextStream1, s, t1, t2, p
- s = Now() & " 开始处理文件 " & f
- wsh.Echo s
- oTextStream.WriteLine s
- oDOMDocument.Load f
- If oDOMDocument.parseError.errorCode <> 0 Then
- s = Now() & " 无法识别的文件: " & f & vbCrLf
- wsh.Echo s
- oTextStream.WriteLine s
- Exit Sub
- End If
- Set oXMLDOMElement = oDOMDocument.documentElement
- s = Now() & " 开始读取解压密码"
- wsh.Echo s
- oTextStream.WriteLine s
- If IsNull(oXMLDOMElement.getAttribute("UniqueCode")) Then
- p = ""
- s = Now() & " 无解压密码"
- wsh.Echo s
- oTextStream.WriteLine s
- Else
- p = oXMLDOMElement.getAttributeNode("UniqueCode").value
- p = base64(p)
- s = Now() & " 解压密码 " & p
- wsh.Echo s
- oTextStream.WriteLine s
- End If
- t1 = oFSO.BuildPath(f2, "临时文件.base64")
- Set oTextStream1 = oFSO.OpenTextFile(t1, 2, True)
- t1 = """" & t1 & """"
- t2 = """" & oFSO.BuildPath(f2, "临时文件.zip") & """"
- s = Now() & " 开始合并密文"
- wsh.Echo s
- oTextStream.WriteLine s
- For Each s In oXMLDOMElement.SelectNodes("//@Value")
- oTextStream1.Write s.text
- Next
- oTextStream1.Close()
- s = Now() & " 合并密文结束,开始转换为zip文件"
- wsh.Echo s
- oTextStream.WriteLine s
- oWshShell.Run "cmd.exe /c Certutil.exe -f -decode " & t1 & " " & t2, 0, True
- s = Now() & " 转换为zip文件完成,开始解压缩"
- wsh.Echo s
- oTextStream.WriteLine s
- s = """" & oFSO.BuildPath(f2, oFSO.GetBaseName(f)) & """"
- s = """" & [7z] & """ x -y " & t2 & " -o" & s & " -p" & p
- oWshShell.Run s, 0, True
- s = Now() & " 解压缩完成" & vbCrLf
- wsh.Echo s
- oTextStream.WriteLine s
- End Sub
-
- Function base64(ByVal s)
- Dim oNode, oStream
- Set oNode = CreateObject("Msxml2.DOMDocument").CreateElement("base64")
- oNode.DataType = "bin.base64"
- oNode.Text = s
- Set oStream = CreateObject("ADODB.Stream")
- oStream.Type = 1 'adTypeBinary
- oStream.Mode = 3 'adModeReadWrite
- oStream.Open()
- oStream.Write oNode.nodeTypedValue
- oStream.Position = 0
- oStream.Type = 2 'adTypeText
- oStream.Charset = "GB2312" '必须与base64编码时的字符集相同
- base64 = oStream.ReadText()
- oStream.Close()
- End Function
复制代码
统一按标准xml文件处理
未考虑文件名含有特殊字符的情况
未考虑Value写成value的情况
win7x64测试网盘文件通过
作者: flashercs 时间: 2024-10-11 13:02
保存为1.bat,编码为ANSI;- <#*,:
- @echo off
- cd /d "%~dp0"
- set "batchfile=%~f0"
- Powershell -ExecutionPolicy Bypass -C "Set-Location -LiteralPath ([Environment]::CurrentDirectory);. ([ScriptBlock]::Create([IO.File]::ReadAllText($env:batchfile,[Text.Encoding]::GetEncoding(0) )) )"
- pause
- exit /b
- #>
- $srcDir = "." # 原始文件路径 - 文件夹
- $dstDir = ".\解压后" # 解压后路径 - 文件夹
- $7z = "7z.exe" # 解压工具 - 7z
- $log = "xml解压日志.log" # 日志文件
-
-
- $di0 = [IO.Directory]::CreateDirectory($dstDir)
- $log = [IO.Path]::GetFullPath($log)
- $xml_reader_settings = New-Object System.Xml.XmlReaderSettings
- $xml_reader_settings.IgnoreWhitespace = $true
- $buff = New-Object 'byte[]' -ArgumentList 64kb
- Get-ChildItem -Path ("$srcDir\*" -replace '[\[\]]', '`$&') | Where-Object { $_ -is [IO.FileInfo] -and $_.FullName -ne $env:batchfile -and $_.FullName -ne $log } | ForEach-Object {
- $msg = "`r`n$(Get-Date -Format 'HH:mm') 开始处理,文件名为:$($_.Name)"
- $msg
- $msg | Out-Host
- $xml_reader = [System.Xml.XmlReader]::Create($_.FullName, $xml_reader_settings)
- if (-not $?) { return }
- $null = $xml_reader.MoveToContent()
- if ($xml_reader.NodeType -eq 'Element') {
- #第一种情况
- #$xml_reader.Name|Out-Host
- if ($xml_reader.Name -eq 'ZBFile' -and $xml_reader.ReadToDescendant('FileCont') -and $xml_reader.MoveToAttribute('Value')) {
- try {
- $msg = "$(Get-Date -Format 'HH:mm') 合并密文开始"
- $msg
- $msg | Out-Host
- $zipName = [Guid]::NewGuid().ToString() + '.zip'
- $zipPath = [IO.Path]::Combine($di0.FullName, $zipName)
- $zipStream = New-Object System.IO.FileStream -ArgumentList ($zipPath, [IO.FileMode]::Create, [IO.FileAccess]::Write, [IO.FileShare]::None)
- while (($readCount = $xml_reader.ReadContentAsBase64($buff, 0, $buff.Length)) -gt 0) {
- $zipStream.Write($buff, 0, $readCount)
- }
- $zipStream.Close()
- $zipStream = $null
- $msg = "$(Get-Date -Format 'HH:mm') 合并密文结束"
- $msg
- $msg | Out-Host
- $unzipDir = [IO.Path]::Combine($di0.FullName, $_.Name)
- $msg = "$(Get-Date -Format 'HH:mm') 解压文件开始"
- $msg
- $msg | Out-Host
- & $7z x -aoa -tzip -y "-o${unzipDir}" $zipPath | Out-Host
- $msg = "$(Get-Date -Format 'HH:mm') 解压文件结束"
- $msg
- $msg | Out-Host
- cmd /c ren $unzipDir ($_.BaseName) | Out-Host
- if ($?) {
- $msg = "$(Get-Date -Format 'HH:mm') 文件夹名字修改成功,修改为$($_.BaseName)"
- } else {
- $msg = "$(Get-Date -Format 'HH:mm') 文件夹名字修改失败: ${unzipDir} -> $($_.BaseName)"
- }
- $msg
- $msg | Out-Host
- Remove-Item -LiteralPath $zipPath
- } finally {
- if ($zipStream) { $zipStream.Close(); $zipStream = $null; }
- }
- trap {}
- } elseif ($xml_reader.Name -eq 'ConstructProject' -and $xml_reader.MoveToAttribute('UniqueCode')) {
- #第二种情况
- try {
- $pw = [System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($xml_reader.ReadContentAsString()))
- $msg = "$(Get-Date -Format 'HH:mm') 经过base64解密后的密码为${pw}"
- $msg
- $msg | Out-Host
- #$null=$xml_reader.MoveToElement()
- if ($xml_reader.ReadToFollowing('BidFileTable')) {
- $msg = "$(Get-Date -Format 'HH:mm') 合并密文开始"
- $msg
- $msg | Out-Host
- $zipName = [Guid]::NewGuid().ToString() + '.zip'
- $zipPath = [IO.Path]::Combine($di0.FullName, $zipName)
- $zipStream = New-Object System.IO.FileStream -ArgumentList ($zipPath, [IO.FileMode]::Create, [IO.FileAccess]::Write, [IO.FileShare]::None)
-
- while ($xml_reader.Read()) {
- if ($xml_reader.IsStartElement() -and $xml_reader.Name -match '^BidFile\d*$' -and $xml_reader.MoveToAttribute('Value')) {
- while (($readCount = $xml_reader.ReadContentAsBase64($buff, 0, $buff.Length)) -gt 0) {
- $zipStream.Write($buff, 0, $readCount)
- }
-
- }
- }
-
- $zipStream.Close()
- $zipStream = $null
- $msg = "$(Get-Date -Format 'HH:mm') 合并密文结束"
- $msg
- $msg | Out-Host
- $unzipDir = [IO.Path]::Combine($di0.FullName, $_.Name)
- $msg = "$(Get-Date -Format 'HH:mm') 解压文件开始"
- $msg
- $msg | Out-Host
- & $7z x "-p${pw}" -aoa -tzip -y "-o${unzipDir}" $zipPath | Out-Host
- $msg = "$(Get-Date -Format 'HH:mm') 解压文件结束"
- $msg
- $msg | Out-Host
- cmd /c ren $unzipDir ($_.BaseName)
- if ($?) {
- $msg = "$(Get-Date -Format 'HH:mm') 文件夹名字修改成功,修改为$($_.BaseName)"
- } else {
- $msg = "$(Get-Date -Format 'HH:mm') 文件夹名字修改失败: ${unzipDir} -> $($_.BaseName)"
- }
- $msg
- $msg | Out-Host
- Remove-Item -LiteralPath $zipPath
- }
- } finally {
- if ($zipStream) { $zipStream.Close(); $zipStream = $null; }
- }
- }
-
- }
- $xml_reader.Close()
-
- } | Set-Content -LiteralPath $log -Encoding UTF8
复制代码
作者: 304802301 时间: 2024-10-11 15:01
回复 2# czjt1234
大佬,您好、 这段代码我试了下,日志文件有,2个临时文件有,但是没有解压出文件夹,看日志里开始解压和解压完成是同一秒,估计是没有执行成功解压
作者: 304802301 时间: 2024-10-11 15:04
本帖最后由 304802301 于 2024-10-11 16:42 编辑
回复 3# flashercs
可以了,感谢大佬!!!
作者: czjt1234 时间: 2024-10-11 15:10
回复 4# 304802301
要修改为你的7z的路径的
作者: 304802301 时间: 2024-10-11 15:18
回复 6# czjt1234
Const [7z] = "C:\Program Files\7-Zip\7z.exe" '7z的路径
我是这样配置的,也不行呢
作者: czjt1234 时间: 2024-10-11 15:23
回复 7# 304802301
你确定你的7z也是这个路径?
3楼的11行也是要改为你的路径的
作者: czjt1234 时间: 2024-10-11 15:48
- @echo off
- dir c:\7z.exe /s/b
- pause
复制代码
你运行这个看看你的7z的路径是啥
作者: 304802301 时间: 2024-10-11 16:06
回复 9# czjt1234
执行结果是这个
c:\Program Files\7-Zip\7z.exe
c:\Program Files (x86)\DBAppSecurity\EDR\7z.exe
c:\Users\Administrator\AppData\Roaming\DBeaverData\drivers\exe\7z\7z.exe
作者: czjt1234 时间: 2024-10-11 16:17
本帖最后由 czjt1234 于 2024-10-11 16:20 编辑
漏了一个参数符号
71行把 y 改成 -y
作者: 304802301 时间: 2024-10-11 16:42
回复 11# czjt1234
可以了,感谢大佬!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |