4

さまざまな情報を含む C++ バイナリに「透かし」を入れようとしています。私はビルド プロセスを制御していないため、ビルド時にこの情報を含めることは困難です。これまでのところ、私がここから得た心に近い唯一のアイデアは、c++ バイナリを指定すると、以下のような Bash スクリプトを生成するスクリプトです。

つまり、元のバイナリに bash if-else を追加します。これは、最初の引数が「--version」(この場合、何らかの情報をエコーする) であるかどうか (この場合、それ自体をファイル「originalBinary」に単純にデコードする) をチェックします。 " 次に、./originalBinary を実行します)。

これは明らかに理想的ではありません:

  • 現在、バイナリのコピーが 2 つあり (大きなバイナリの場合は問題になる可能性があります)、
  • 実行中のプロセスは、./originalBinary何が起こっているのかわからない人にとって混乱を招くことによって開始されました

私が疑問に思っているのは、./originalBinary呼び出しをある種の特別なものに置き換えるようなことができるかどうかです.execexec $0に最初からファイルを読み取らないように指示することもできますが、オフセットは100文字です(または先頭の Bash ビットの長さは ) です。

もう 1 つのアイデアは、Bash スクリプト自体を編集させることでした。つまり、最初の 21 行を sed で削除し、それ自体を呼び出して、コマンドが返さ./$0れたときに if-else を追加します。./$0ただし、これは脆弱に思えます (呼び出しが戻る前にマシンがクラッシュした場合はどうなるでしょうか?)。

最後に、バイナリが共有リソースである場合、これは失敗するという印象を受けます.

あるいは、ビルド後の 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
4

2 に答える 2

1

libelf、ELFsh、またはその他の ELF ツールを使用して、バイナリに独自の「セクション」を作成し、その中に必要なものを入れることができます。 この質問にはさらにいくつかのリンクがあります。データのブロブをバイナリに追加するだけの場合は、ここで回答したように objcopy --add-sectionを使用する方が簡単かもしれませ

于 2012-11-19T17:48:59.530 に答える
0

ちょっとしたハックですが、次のような文字列を埋め込むことができます。

static const char *version = "<<<VERSION-INFORMATION-HERE>>>";

あなたのコードで。プログラムは、必要に応じてこれを印刷できます。文字列が、実際のバージョン情報に必要なすべての情報を保持するのに十分な長さであることを確認してください。次に、結果のバイナリファイルを編集して、この文字列を「透かし」で上書きできます。これを実行できる(あまりきれいではありませんが機能的な)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";
于 2012-11-19T18:09:16.037 に答える