【发布时间】:2014-01-14 15:15:43
【问题描述】:
使用 sed 修补二进制文件中的十六进制字符串。
如何使用 Sed 在 .app 中打开二进制文件,搜索唯一的十六进制值字符串,用新字符串替换它们,然后保存二进制文件并退出。? 我做了很多研究,我卡住了。
最后我想把它写成一个脚本,下面我写了一些代码作为终端命令,这些代码基本上不起作用,但代表了我想尽我所能发生的事情。
//二进制补丁脚本尝试
hexdump -ve '1/1 "%.2X"' /Users/MiRAGE/Downloads/MyApp.app/Contents/MacOS/MyApp | \
sed "s/\x48\x85\xc0\x75\x33/\x48\x85\xc0\x74\x33/g" | \
xxd -r -p > /Users/MiRAGE/Downloads/MyApp.app/Contents/MacOS/MyApp.Patched | \
cd /Users/MiRAGE/Downloads/MyApp.app/Contents/MacOS/ | \
mv /Users/MiRAGE/Downloads/MyApp.app/Contents/MacOS/MyApp.Patched /Users/MiRAGE/Downloads/MyApp.app/Contents/MacOS/MyApp | \
sudo chmod u+x /Users/MiRAGE/Downloads/MyApp.app/Contents/MacOS/MyApp
//如果字符串在文件中则返回1
xxd -p /Users/MiRAGE/Downloads/MyApp.app/Contents/MacOS/MyApp | tr -d '\n' | grep -c ‘4885c07533'
(目前脚本中没有使用它,但我对其进行了测试,如果序列存在,它确实返回 1,所以我认为在可能将这些补丁制作成小型应用程序时会很方便他们自己的。通过以下方式实现:-
'if(xxd -p /Users/MiRAGE/Downloads/MyApp.app/Contents/MacOS/MyApp | tr -d '\n' | grep -c ‘4885c07533' == 1){runTheRestOfTheScript;
else if (xxd -p /Users/MiRAGE/Downloads/MyApp.app/Contents/MacOS/MyApp | tr -d '\n' | grep -c ‘4885c07533' == 1){ThrowERROR;'
好的,回到脚本中的内容
//首先它将二进制十六进制信息转储到内存中
hexdump -ve '1/1 "%.2X"' /Users/MiRAGE/Downloads/MyApp.app/Contents/MacOS/MyApp | \
//调用 sed 查找值字符串并将其替换为新值。
sed "s/\x48\x85\xc0\x75\x33/\x48\x85\xc0\x74\x33/g" | \
//将新的补丁文件保存为 MyApp.Patched
xxd -r -p > /Users/MiRAGE/Downloads/MyApp.app/Contents/MacOS/MyApp.Patched | \
//cds到打补丁文件的目录
cd /Users/MiRAGE/Downloads/MyApp.app/Contents/MacOS/ | \
//将文件重命名为原来的可执行文件名
mv /Users/MiRAGE/Downloads/MyApp.app/Contents/MacOS/MyApp.Patched /Users/MiRAGE/Downloads/MyApp.app/Contents/MacOS/MyApp | \
//在输入密码后将新文件设置为可执行文件。
sudo chmod u+x /Users/MiRAGE/Downloads/MyApp.app/Contents/MacOS/MyApp
现在这是我的第一次尝试,我知道某些功能可能完全错误,实际上,除了它不进行修补之外,它会删除二进制文件的内容,只要重命名它就可以工作,希望概述了我需要脚本运行时如何工作。
现在我是一个真正的新手,但我真的需要完成这件事,我真的不知道该怎么做。
我需要这个脚本基本上通过等待用户将程序指向需要修补的文件的方向来工作(因为我正在修补应用程序 iv 最好它会接受将 .app 文件拖到窗口,它会自行在 macOSX 文件夹中找到二进制文件(这将在稍后出现,也可以通过各种方式完成) 然后我需要它在二进制文件中搜索字符串并在这种情况下用编辑的字符串替换它:-
original :- 4885c07533
patched:-4885c07433 {its worth re mentioning this string will always be unique but may vary in length depending on the function that needs patching}
然后,我需要使用与该脚本处理的原始文件相同的名称保存它,方法是将修补后的文件保存为附加的 .patched,然后相应地重命名它。
然后它使文件可执行并退出,使修补的 .app 准备好运行。
如果我注意到我在许多程序中都犯了错误,这种创建补丁的方法会特别有用。如果该功能是独一无二的,我可以制作一个补丁,只需按一下按钮就可以编辑二进制文件,同时只需保留与补丁相关的代码部分。
总结一下。
我正在寻找的是让这个脚本工作的某种方法,也许,如果你们中的任何人可以提供一些建议,将它变成一个小应用程序,让我的生活更轻松。
非常感谢您提供的任何和所有帮助。 我会每天检查,所以如果我需要澄清一些事情,请告诉我,我会马上处理。
幻影
【问题讨论】:
-
binary sed replacement 的可能重复项
-
iv 阅读它,据我所知,它不相关
-
我认为普通的
sed做不到。它将文件作为文本行处理。而且它内部很可能使用C字符串,所以0字节会被当作字符串终止符,会导致后面的字节丢失。 -
我该怎么做?如果 sed 不是我真的不知所措的方式,那么它接缝是一件很容易的事情。也许将整个二进制文件转换为 ascii 使用 sed 处理它并将其转换回来并保存为二进制文件? iv 看到过去做过这种修补的程序我真的很想制作一个适合我需要的程序
-
在macupdate.com/app/mac/21273/autocomplete-always-on!你可以找到一个 AppleScript 我曾经使用它修补了 WebKit 二进制文件(用
autocomplete=off覆盖网页)。它使用perl。看看它是如何工作的。
标签: macos sed hex binaryfiles monkeypatching