是否可以使用Windows命令行编辑二进制文件?

sam*_*sam 5 windows cmd binaryfiles edit

Windows中是否有一种方法可以从命令行编辑二进制文件?即可以写入批处理文件的方式?

我希望能够在现有文件中编辑已知位置的单个字节.

这个现有问题[1]已经解决,但这是一个Linux解决方案.我正在为Windows寻找类似的东西.

背景

从Steam下载时,GTA 1中存在一个错误,即保存游戏数据文件在退出时会损坏.结果,游戏可以在第一时间播放,但随后崩溃.事实证明,这可以通过将文件中的第5个字节(即地址0x04处的字节)从x00更改为x06 [2]来解决.

我可以轻松地在Python中执行此操作,例如:

with open("PLAYER_A.DAT", "rb") as f:
    bytes = f.read()
bytes = bytes[:4] + '\x06' + bytes[5:]
with open("PLAYER_A.DAT", "wb") as g:
    for b in bytes: g.write(b)
Run Code Online (Sandbox Code Playgroud)

理想情况下,我宁愿在执行以下操作的批处理作业中执行此操作:

  • 修复数据文件
  • 推出GTA

我可以做的东西,对我来说(使用Python)的作品,但不会帮助没有的Python谁随机其他人(是的,我知道这是很容易得到和安装,但仍然).同样,有一个免费软件声称可以做到这一点,但我不想在我的电脑上运行随机的.exe,我认为其他人也不应该.出于这个原因,我想提出一个批处理文件,人们可以检查,并且 - 如果他们对它的作用感到满意 - 那就自己运行.

谢谢你的帮助!

[1] CLI:在地址写入字节(来自命令行的hexedit/modify binary)

[2] http://forums.steampowered.com/forums/showthread.php?t=1597746

[edit]修复了Python脚本,因为我发现它不能正常工作(file.read()返回一个不可变对象,所以你不能只更新其中一个值).

Com*_*eek 9

我认为PowerShell是完成这项任务的完美工具.它适用于XP或更高版本,自Windows 7起自动发货:

只需*.ps使用以下内容创建一个文件:

$bytes = [System.IO.File]::ReadAllBytes("PLAYER_A.DAT");
$bytes[4] = 0x06;

[System.IO.File]::WriteAllBytes("PLAYER_A.DAT", $bytes);
& "C:\Path-To-GTA1-Exe-File.exe"
Run Code Online (Sandbox Code Playgroud)

请注意,必须启用未签名的PowerShell脚本:

  1. 以管理员身份启动PowerShell

  2. 运行此命令: Set-ExecutionPolicy RemoteSigned


您也可以使用VBScript,但脚本会更长一些,因为它不是为读取二进制文件而设计的(您必须使用ADODB.Stream对象).

以下是帮助函数的汇编:http://www.motobit.com/tips/detpg_read-write-binary-files/


Eig*_*uru 1

将原始文件分成三个,然后与中间的替代字节合并怎么样?将二进制文件分成三部分(start -> target-1 / target / target+1 -> end),然后使用 COPY 将开始和结束块与中间的新字节合并。

我从来没有能够让 DOS(或任何 Windows 命令提示符)来本地分割文件,但是免费的 SPLITS.EXE 实用程序非常好,可以包含在您的解决方案中。COPY 当然是本机命令。

我现在找不到该实用程序的链接,但在谷歌上搜索“免费的 dos 文件分割实用程序”会产生很多点击...