我正在尝试用各种信息“加水印”c ++二进制文件。在构建时包含此信息很困难,因为我无法控制构建过程。到目前为止,唯一的想法接近于我从here获得的内容,它是一个脚本,当给出一个c ++二进制文件时,会生成一个Bash脚本,如下所示。
简而言之,它在原始二进制文件中附加了一个bash if-else,用于检查第一个参数是否为“--version”(在这种情况下它是回声某些信息)或者不是(在这种情况下它只是将自身解码为文件“originalBinary”然后运行./originalBinary)。
这显然不太理想:
./originalBinary
启动,这让那些不知道发生了什么的人感到困惑我想知道的是,我是否可以做一些事情,比如用某种特殊的./originalBinary
替换exec $0
调用,我也可以告诉exec不要从一开始就读取文件,但偏移量为100个字符(或者无论开头的Bash位长度是多少)。
另一个想法是让Bash脚本自行编辑,即用sed删除前21行,调用./$0
来调用自身,然后在./$0
命令返回时追加if-else。但是,这看起来很脆弱(如果机器在调用返回之前崩溃了怎么办?)。
最后,我得到的结论是,当二进制文件是共享资源时,这会失败,因为当它尝试加载库时,链接器会被beginnig中的bash东西搞糊涂:(
或者,你能否建议任何其他方法来注释c ++二进制后构建?
我考虑准备一个包含所需信息的目标文件,而不是将其链接到给定的二进制文件中,但是这需要我以某种方式将ELF转换回进入它的目标文件,将我的目标文件添加到列表中,然后重新链接(我得到here的印象,可以使用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
答案 0 :(得分:1)
您可以使用libelf,ELFsh或其他ELF工具在二进制文件中创建自己的“部分”,并在其中放置您想要的任何内容。 This question有更多链接。如果您想要做的是 all ,那么可以更容易地使用 objcopy --add-section ,例如answered here。
答案 1 :(得分:0)
这有点像黑客,但你可以采取的方法是嵌入一个这样的字符串:
static const char *version = "<<<VERSION-INFORMATION-HERE>>>";
你的代码中的。您的程序可以根据需要打印出来。确保字符串足够长,以保存您的真实版本信息所需的所有信息。然后,您可以编辑生成的二进制文件以使用“watermark”覆盖此字符串。这是一个可以执行此操作的(不是很漂亮但功能齐全的)Perl脚本:
die "Usage $0 original-binary-file output-binary-file version-info" unless ($#ARGV == 2);
$original = $ARGV[0];
$modified = $ARGV[1];
$new_version = $ARGV[2];
$version_magic = "<<<VERSION-INFORMATION-HERE>>>";
if (length($new_version) > length($version_magic)) {
die "$0: Length of version string '$new_version' must be less than that of '$version_magic'\n"
}
$new_version .= "\0" x (length($version_magic) - length($new_version));
open(IN, $original)
or die "\nCan't open $original for reading: $!\n";
open(OUT, ">$modified")
or die "\nCan't open $modified for writing: $!\n";
binmode IN;
binmode OUT;
my $buffer;
my $size = -s $original;
read(IN, $buffer, $size)
or die "$0: Failed to read $size bytes from $original: $!\n";
$buffer =~ s/\Q$version_magic\E/$new_version/;
print OUT $buffer
or die "$0: Failed to write $size bytes to $modified: $!\n";
close IN
or die "$0: Can't close $original: $!\n";
close OUT
or die "$0: Can't close $modified: $!\n";
chmod 0755, $modified;
print "Created $modified\n";