Windows系统下替换EXE文件部分内容并运行的最优方案
Windows下实现多行内容替换并运行EXE的最优方案
首选方案:PowerShell脚本
PowerShell是Windows原生的现代化脚本环境,功能强大,处理多行文本/二进制替换的逻辑清晰,思路和Unix Shell脚本接近,是这类需求的最优选择。
场景1:处理文本格式的可执行文件(如脚本打包的EXE)
以下脚本完成复制文件→替换指定多行内容→运行修改后文件的完整流程:
# 复制原EXE到副本,避免修改源文件 Copy-Item -Path "program.exe" -Destination "program_modified.exe" -Force # 定义需要替换的原内容块和新内容块 $originalContent = @" bb ccc dddd "@ $newContent = @" xxx yyy "@ # 读取副本内容,替换指定块后写回 (Get-Content "program_modified.exe" -Raw) -replace [regex]::Escape($originalContent), $newContent | Set-Content "program_modified.exe" -Force # 运行修改后的程序 .\program_modified.exe
- 说明:
-Raw参数将文件内容作为完整字符串读取,确保多行内容能被正确匹配[regex]::Escape()转义原内容中的特殊字符,避免正则表达式解析出错-Force参数强制覆盖已存在的副本文件
场景2:处理二进制格式的原生EXE
如果是原生二进制EXE,需要直接操作字节序列,示例脚本如下:
# 复制原文件到副本 Copy-Item "program.exe" "program_modified.exe" -Force # 定义原字节序列和新字节序列(示例用ASCII编码,实际需根据目标字节调整) $originalBytes = [System.Text.Encoding]::ASCII.GetBytes("bb`nccc`ndddd`n") $newBytes = [System.Text.Encoding]::ASCII.GetBytes("xxx`nyyy`n") # 读取文件所有字节 $fileBytes = [System.IO.File]::ReadAllBytes("program_modified.exe") # 查找原字节序列在文件中的位置 $matchIndex = -1 for ($i = 0; $i -le $fileBytes.Length - $originalBytes.Length; $i++) { $isMatch = $true for ($j = 0; $j -lt $originalBytes.Length; $j++) { if ($fileBytes[$i + $j] -ne $originalBytes[$j]) { $isMatch = $false break } } if ($isMatch) { $matchIndex = $i break } } # 找到匹配则替换字节并写回文件 if ($matchIndex -ne -1) { [System.Array]::Copy($newBytes, 0, $fileBytes, $matchIndex, $newBytes.Length) [System.IO.File]::WriteAllBytes("program_modified.exe", $fileBytes) } # 运行修改后的程序 .\program_modified.exe
注意事项
- 如果原EXE带有数字签名,修改后签名会失效,运行时可能被Windows安全软件拦截,需提前处理签名问题
- 二进制替换时,需确保原字节序列和新字节序列的匹配准确性,避免破坏EXE结构导致程序无法运行
内容的提问来源于stack exchange,提问作者Piodo
相关产品推荐
相关产品推荐

