【问题标题】:Making a script that uses 'sed' to patch hex strings inside binaries in OSX制作一个使用'sed'来修补OSX中二进制文件中的十六进制字符串的脚本
【发布时间】: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


【解决方案1】:

关于 sed 行

sed "s/\x48\x85\xc0\x75\x33/\x48\x85\xc0\x74\x33/g"

首先,您可以使用 sed 更改任意二进制文件 - 但您应该注意换行符。 sed 处理其输入总是换行符分隔,所以如果值 \x0a 出现在您的字符串中,您将遇到问题。

下面将允许您将整个文件视为纯二进制文件。 (使用 -n 选项调用 sed 以便默认处理后不会打印出行)。

# Append the current line to the hold space
H
# On the last line the hold space contains all of the file - now swap pattern and hold space, operate on the pattern space and print the line
${
    # exchange hold and pattern space
    x
    # do substitution
    s/.../.../g
    # print out result, required due to -n option
    p
}

或者,更简洁

sed -n 'H;${x;s/.../.../g;p}'

当您附加模式空间以保留空间时,将插入新行 - 因此这可以避免新行的问题。

此外,在您的示例中,您为 sed 表达式使用了双引号。由于反斜杠的 shell 转义规则和 sed 的性质,我建议使用单引号以避免复杂化。如果您的 shell 不是这样,我们深表歉意。

关于 sed,您应该注意十六进制中包含的特殊值。 如果您在 sed 中使用 \x.. 转义字节文字,则解释的方式是首先将转义的字节文字替换为其值,然后执行该行。重要的是,如果没有转义,正则表达式特殊字符仍然会执行其操作。

例子:

sed 's/\x5e\x2f/foo/'
# becomes
substitute pattern '\x5e\x2f' for 'foo'
# becomes
substitute pattern '^/' for 'foo'
# which matches a / at the beginning of a line as opposed to ^/

所以要注意替换左侧的字符是通常的嫌疑人,并注意替换右侧的 \x26 (&)。

希望这至少能阐明 sed 在您的脚本中的潜在作用 :-)。

【讨论】:

    猜你喜欢
    • 2016-05-24
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2017-03-22
    • 2016-02-26
    • 2012-12-12
    • 2021-10-27
    相关资源
    最近更新 更多