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)
理想情况下,我宁愿在执行以下操作的批处理作业中执行此操作:
我可以制作一些对我有用的东西(使用Python),但这对其他没有Python的人来说无济于事(是的,我知道它很容易获得和安装,但仍然如此)。同样,有一个免费软件声称可以做到这一点,但我不想在我的电脑上运行随机的.exe,我认为其他人也不应该。出于这个原因,我想提出一个批处理文件,人们可以检查,如果他们对它的作用感到满意,那就自己运行。
谢谢你的帮助!
[1] CLI: Write byte at address (hexedit/modify binary from the command line)
[2] http://forums.steampowered.com/forums/showthread.php?t=1597746
[edit]修复了Python脚本,因为我发现它不能正常工作(file.read()返回一个不可变对象,所以你不能只更新其中一个值。)
答案 0 :(得分: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"
请注意,必须启用未签名的PowerShell脚本:
以管理员身份启动PowerShell
运行此命令:
Set-ExecutionPolicy RemoteSigned
您也可以使用VBScript,但脚本会有点长,因为它不是为读取二进制文件而设计的(您必须使用ADODB.Stream
个对象)。
以下是辅助函数的汇编:http://www.motobit.com/tips/detpg_read-write-binary-files/
答案 1 :(得分:1)
如何将原始文件拆分为三个,然后在中间与替换字节合并?将二进制文件拆分为三个部分(start - > target-1 / target / target + 1 - > end),然后使用COPY将开始和结束块与中间的新字节合并。
我从来没有能够让DOS(或任何Windows命令提示符)本地拆分文件,但免费的SPLITS.EXE实用程序非常好,可以包含在您的解决方案中。 COPY当然是一个本地命令。
我现在找不到该实用程序的链接,但谷歌搜索'免费dos文件拆分实用程序'会产生很多点击...
答案 2 :(得分:1)
fc
或certutil
或十进制加上comp
。一种从“ Windows命令行”修补文件字节4的解决方案:
echo Dim fso : Set fso = CreateObject("Scripting.FileSystemObject") > tmp.vbs
echo Set file = fso.OpenTextFile("PLAYER_A.DAT") >> tmp.vbs
echo set fsize = fso.GetFile("PLAYER_A.DAT") >> tmp.vbs
echo Dim out : Set out = fso.CreateTextFile("GTA.exe", true) >> tmp.vbs
echo data = file.Read(3) : out.write(data) : file.Skip(1) >> tmp.vbs
echo data = "06" : out.write chr("&H" ^& data) >> tmp.vbs
echo data = file.Read(fsize.Size) : out.write(data) >> tmp.vbs
echo file.Close >> tmp.vbs
echo out.Close >> tmp.vbs
cscript //nologo tmp.vbs & del tmp.vbs
start /b cmd /c GTA.exe
在Win10 CMD中测试