我正在尝试使用各种信息为 c++ 二进制文件“加水印”。在构建时包含这些信息很困难,因为我不控制构建过程。到目前为止,我从这里得到的唯一想法接近我的想法,它是一个脚本,当给定一个 c++ 二进制文件时,它会生成一个如下所示的 Bash 脚本。
简而言之,它将一个 bash if-else 附加到原始二进制文件中,它检查第一个参数是否为“--version”(在这种情况下它会回显一些信息)或不是(在这种情况下它只是将自身解码为文件“originalBinary " 然后运行 ./originalBinary)。
这显然并不理想:
- 我现在有 2 个二进制副本(对于大型二进制文件可能有问题)和
- 正在运行的进程开始于
./originalBinary
这对于不知道发生了什么的人来说是令人困惑的
我想知道的是我是否可以做一些事情,比如./originalBinary
用某种特殊的替换调用exec $0
,我也可以告诉 exec 不要从头开始读取文件,但偏移量为 100 个字符(或任何开头的 Bash 位的长度是)。
另一个想法是让 Bash 脚本自己编辑,即用 sed 删除它的前 21 行,./$0
调用自身,然后在./$0
命令返回时附加 if-else。然而,这似乎很脆弱(如果机器在调用返回之前崩溃怎么办?)。
最后,我得到的印象是,当二进制文件是共享资源时,这将失败,因为链接器在尝试加载库时会被开始时的 bash 内容弄糊涂:(
或者,您能否建议任何其他方式来注释 c++ 二进制构建后?
我考虑准备一个包含所需信息的目标文件,而不是将其链接到给定的二进制文件中,但这需要我以某种方式将 ELF 转换回进入其中的目标文件,将我的目标文件添加到列表中,然后重新链接(我从这里得到的印象是可以做到这一点,objcopy
但我还没有设法让它发挥作用)。此外,这种方法的问题在于没有很好的方法来获取信息,例如使用“--version”调用二进制文件。
我想做的事是不可能的吗?我希望我能清楚地解释事情。
谢谢。
#!/bin/bash
function PrintInformation()
{
echo "various bits of information"
}
if [[ $# -eq 1 && "$1" == "--version" ]]; then
PrintInformation
exit 0
else
uudecode $0
./originalBinary
exit 0
fi
begin 755 originalBinary
M?T5,1@(!`0````````````(`/@`!````X`9```````!``````````'`1````
M`````````$``.``)`$``'@`;``8````%````0`````````!``$```````$``
M0```````^`$```````#X`0````````@``````````P````0````X`@``````
M`#@"0```````.`)````````<`````````!P``````````0`````````!````
M!0````````````````!``````````$```````*0*````````I`H`````````
M`"````````$````&````\`T```````#P#6```````/`-8```````6`(`````
M``"8`P``````````(````````@````8````@#@```````"`.8```````(`Y@
M``````#``0```````,`!````````"``````````$````!````%0"````````
M5`)```````!4`D```````$0`````````1``````````$`````````%#E=&0$
M````L`D```````"P"4```````+`)0```````-``````````T``````````0`
M````````4>5T9`8`````````````````````````````````````````````
M````````````"`````````!2Y71D!````/`-````````\`U@``````#P#6``
...............// my uuencode'd binary here
end