Board logo

标题: [文本处理] 【已解决】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 编辑
  1. rem 另存为 ANSI 编码 bat
  2. ' & cls & cscript.exe /nologo /e:vbscript "%~f0" %* & pause & exit /b
  3. Option Explicit
  4. Dim oFSO, oTextStream, oWshShell, oDOMDocument, s
  5. Const f1 = "d:\1\"    '原始文件的路径
  6. Const f2 = "d:\2\"    '解压后的路径,日志文件路径,临时文件路径
  7. Const [7z] = "C:\Program Files\7-Zip\7z.exe"    '7z的路径
  8. Set oWshShell = CreateObject("WScript.Shell")
  9. Set oFSO = CreateObject("Scripting.FileSystemObject")
  10. Set oDOMDocument = CreateObject("Msxml2.DOMDocument")
  11. oWshShell.Run "cmd.exe /c md """ & f2 & """", 0, True
  12. s = oFSO.BuildPath(f2, "日志.txt")
  13. Set oTextStream = oFSO.OpenTextFile(s, 8, True)
  14. For Each s In oFSO.GetFolder(f1).Files
  15.     Call t(s.Path)
  16. Next
  17. oTextStream.Close()
  18. wsh.Echo "ok"
  19. Sub t(ByVal f)
  20.     Dim oXMLDOMElement, oTextStream1, s, t1, t2, p
  21.     s = Now() & " 开始处理文件 " & f
  22.     wsh.Echo s
  23.     oTextStream.WriteLine s
  24.     oDOMDocument.Load f
  25.     If oDOMDocument.parseError.errorCode <> 0 Then
  26.         s = Now() & " 无法识别的文件: " & f & vbCrLf
  27.         wsh.Echo s
  28.         oTextStream.WriteLine s
  29.         Exit Sub
  30.     End If
  31.     Set oXMLDOMElement = oDOMDocument.documentElement
  32.     s = Now() & " 开始读取解压密码"
  33.     wsh.Echo s
  34.     oTextStream.WriteLine s
  35.     If IsNull(oXMLDOMElement.getAttribute("UniqueCode")) Then
  36.         p = ""
  37.         s = Now() & " 无解压密码"
  38.         wsh.Echo s
  39.         oTextStream.WriteLine s
  40.     Else
  41.         p = oXMLDOMElement.getAttributeNode("UniqueCode").value
  42.         p = base64(p)
  43.         s = Now() & " 解压密码 " & p
  44.         wsh.Echo s
  45.         oTextStream.WriteLine s
  46.     End If
  47.     t1 = oFSO.BuildPath(f2, "临时文件.base64")
  48.     Set oTextStream1 = oFSO.OpenTextFile(t1, 2, True)
  49.     t1 = """" & t1 & """"
  50.     t2 = """" & oFSO.BuildPath(f2, "临时文件.zip") & """"
  51.     s = Now() & " 开始合并密文"
  52.     wsh.Echo s
  53.     oTextStream.WriteLine s
  54.     For Each s In oXMLDOMElement.SelectNodes("//@Value")
  55.         oTextStream1.Write s.text
  56.     Next
  57.     oTextStream1.Close()
  58.     s = Now() & " 合并密文结束,开始转换为zip文件"
  59.     wsh.Echo s
  60.     oTextStream.WriteLine s
  61.     oWshShell.Run "cmd.exe /c Certutil.exe -f -decode " & t1 & " " & t2, 0, True
  62.     s = Now() & " 转换为zip文件完成,开始解压缩"
  63.     wsh.Echo s
  64.     oTextStream.WriteLine s
  65.     s = """" & oFSO.BuildPath(f2, oFSO.GetBaseName(f)) & """"
  66.     s = """" & [7z] & """ x -y " & t2 & " -o" & s & " -p" & p
  67.     oWshShell.Run s, 0, True
  68.     s = Now() & " 解压缩完成" & vbCrLf
  69.     wsh.Echo s
  70.     oTextStream.WriteLine s
  71. End Sub
  72. Function base64(ByVal s)
  73.     Dim oNode, oStream
  74.     Set oNode = CreateObject("Msxml2.DOMDocument").CreateElement("base64")
  75.     oNode.DataType = "bin.base64"
  76.     oNode.Text = s
  77.     Set oStream = CreateObject("ADODB.Stream")
  78.     oStream.Type = 1    'adTypeBinary
  79.     oStream.Mode = 3    'adModeReadWrite
  80.     oStream.Open()
  81.     oStream.Write oNode.nodeTypedValue
  82.     oStream.Position = 0
  83.     oStream.Type = 2    'adTypeText
  84.     oStream.Charset = "GB2312"    '必须与base64编码时的字符集相同
  85.     base64 = oStream.ReadText()
  86.     oStream.Close()
  87. End Function
复制代码
统一按标准xml文件处理
未考虑文件名含有特殊字符的情况
未考虑Value写成value的情况

win7x64测试网盘文件通过
作者: flashercs    时间: 2024-10-11 13:02

保存为1.bat,编码为ANSI;
  1. <#*,:
  2. @echo off
  3. cd /d "%~dp0"
  4. set "batchfile=%~f0"
  5. Powershell -ExecutionPolicy Bypass -C "Set-Location -LiteralPath ([Environment]::CurrentDirectory);. ([ScriptBlock]::Create([IO.File]::ReadAllText($env:batchfile,[Text.Encoding]::GetEncoding(0) )) )"
  6. pause
  7. exit /b
  8. #>
  9. $srcDir = "." # 原始文件路径 - 文件夹
  10. $dstDir = ".\解压后" # 解压后路径 - 文件夹
  11. $7z = "7z.exe" # 解压工具 - 7z
  12. $log = "xml解压日志.log" # 日志文件
  13. $di0 = [IO.Directory]::CreateDirectory($dstDir)
  14. $log = [IO.Path]::GetFullPath($log)
  15. $xml_reader_settings = New-Object System.Xml.XmlReaderSettings
  16. $xml_reader_settings.IgnoreWhitespace = $true
  17. $buff = New-Object 'byte[]' -ArgumentList 64kb
  18. Get-ChildItem -Path ("$srcDir\*" -replace '[\[\]]', '`$&') | Where-Object { $_ -is [IO.FileInfo] -and $_.FullName -ne $env:batchfile -and $_.FullName -ne $log } | ForEach-Object {
  19.   $msg = "`r`n$(Get-Date -Format 'HH:mm') 开始处理,文件名为:$($_.Name)"
  20.   $msg
  21.   $msg | Out-Host
  22.   $xml_reader = [System.Xml.XmlReader]::Create($_.FullName, $xml_reader_settings)
  23.   if (-not $?) { return }
  24.   $null = $xml_reader.MoveToContent()
  25.   if ($xml_reader.NodeType -eq 'Element') {
  26.     #第一种情况
  27.     #$xml_reader.Name|Out-Host
  28.     if ($xml_reader.Name -eq 'ZBFile' -and $xml_reader.ReadToDescendant('FileCont') -and $xml_reader.MoveToAttribute('Value')) {
  29.       try {
  30.         $msg = "$(Get-Date -Format 'HH:mm') 合并密文开始"
  31.         $msg
  32.         $msg | Out-Host
  33.         $zipName = [Guid]::NewGuid().ToString() + '.zip'
  34.         $zipPath = [IO.Path]::Combine($di0.FullName, $zipName)
  35.         $zipStream = New-Object System.IO.FileStream -ArgumentList ($zipPath, [IO.FileMode]::Create, [IO.FileAccess]::Write, [IO.FileShare]::None)
  36.         while (($readCount = $xml_reader.ReadContentAsBase64($buff, 0, $buff.Length)) -gt 0) {
  37.           $zipStream.Write($buff, 0, $readCount)
  38.         }
  39.         $zipStream.Close()
  40.         $zipStream = $null
  41.         $msg = "$(Get-Date -Format 'HH:mm') 合并密文结束"
  42.         $msg
  43.         $msg | Out-Host
  44.         $unzipDir = [IO.Path]::Combine($di0.FullName, $_.Name)
  45.         $msg = "$(Get-Date -Format 'HH:mm') 解压文件开始"
  46.         $msg
  47.         $msg | Out-Host
  48.         & $7z x -aoa -tzip -y "-o${unzipDir}" $zipPath | Out-Host
  49.         $msg = "$(Get-Date -Format 'HH:mm') 解压文件结束"
  50.         $msg
  51.         $msg | Out-Host
  52.         cmd /c ren $unzipDir ($_.BaseName) | Out-Host
  53.         if ($?) {
  54.           $msg = "$(Get-Date -Format 'HH:mm') 文件夹名字修改成功,修改为$($_.BaseName)"
  55.         } else {
  56.           $msg = "$(Get-Date -Format 'HH:mm') 文件夹名字修改失败: ${unzipDir} -> $($_.BaseName)"
  57.         }
  58.         $msg
  59.         $msg | Out-Host
  60.         Remove-Item -LiteralPath $zipPath
  61.       } finally {
  62.         if ($zipStream) { $zipStream.Close(); $zipStream = $null; }
  63.       }
  64.       trap {}
  65.     } elseif ($xml_reader.Name -eq 'ConstructProject' -and $xml_reader.MoveToAttribute('UniqueCode')) {
  66.       #第二种情况
  67.       try {
  68.         $pw = [System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($xml_reader.ReadContentAsString()))
  69.         $msg = "$(Get-Date -Format 'HH:mm') 经过base64解密后的密码为${pw}"
  70.         $msg
  71.         $msg | Out-Host
  72.         #$null=$xml_reader.MoveToElement()
  73.         if ($xml_reader.ReadToFollowing('BidFileTable')) {
  74.           $msg = "$(Get-Date -Format 'HH:mm') 合并密文开始"
  75.           $msg
  76.           $msg | Out-Host
  77.           $zipName = [Guid]::NewGuid().ToString() + '.zip'
  78.           $zipPath = [IO.Path]::Combine($di0.FullName, $zipName)
  79.           $zipStream = New-Object System.IO.FileStream -ArgumentList ($zipPath, [IO.FileMode]::Create, [IO.FileAccess]::Write, [IO.FileShare]::None)
  80.           while ($xml_reader.Read()) {
  81.             if ($xml_reader.IsStartElement() -and $xml_reader.Name -match '^BidFile\d*$' -and $xml_reader.MoveToAttribute('Value')) {
  82.               while (($readCount = $xml_reader.ReadContentAsBase64($buff, 0, $buff.Length)) -gt 0) {
  83.                 $zipStream.Write($buff, 0, $readCount)
  84.               }
  85.             }
  86.           }
  87.           $zipStream.Close()
  88.           $zipStream = $null
  89.           $msg = "$(Get-Date -Format 'HH:mm') 合并密文结束"
  90.           $msg
  91.           $msg | Out-Host
  92.           $unzipDir = [IO.Path]::Combine($di0.FullName, $_.Name)
  93.           $msg = "$(Get-Date -Format 'HH:mm') 解压文件开始"
  94.           $msg
  95.           $msg | Out-Host
  96.           & $7z x "-p${pw}" -aoa -tzip -y "-o${unzipDir}" $zipPath | Out-Host
  97.           $msg = "$(Get-Date -Format 'HH:mm') 解压文件结束"
  98.           $msg
  99.           $msg | Out-Host
  100.           cmd /c ren $unzipDir ($_.BaseName)
  101.           if ($?) {
  102.             $msg = "$(Get-Date -Format 'HH:mm') 文件夹名字修改成功,修改为$($_.BaseName)"
  103.           } else {
  104.             $msg = "$(Get-Date -Format 'HH:mm') 文件夹名字修改失败: ${unzipDir} -> $($_.BaseName)"
  105.           }
  106.           $msg
  107.           $msg | Out-Host
  108.           Remove-Item -LiteralPath $zipPath
  109.         }
  110.       } finally {
  111.         if ($zipStream) { $zipStream.Close(); $zipStream = $null; }
  112.       }
  113.     }
  114.   }
  115.   $xml_reader.Close()
  116. } | 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

  1. @echo off
  2. dir c:\7z.exe /s/b
  3. 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://bathome.net./) Powered by Discuz! 7.2