2017-07-20 8 views
3

.elfファイルが特定のコードまたは他のコードからビルドされているかどうか確認したいマーカーをCコードに挿入して、それを.elfファイルに表示する方法は?

バイナリelfファイルを調べることで特定できるようにCで何かを書く方法はありますか?

+4

解決したい*実際の問題は何ですか? *なぜ*このようなことをしたいのですか? [XY問題](http://xyproblem.info/)を読んで、この質問がどのようになるかについて考えてください。 –

+0

ちょうどチェックサムがあるのはどうですか?実行可能ファイルの外側では、簡単に変更することができるためです。 –

+1

このマーカーをコピーして自分のコードに入れないようにするにはどうすればいいですか? –

答えて

1

見つかりソリューション:

static const char MARKER[] __attribute__((used)) = "A_A_A_A"; 
4

まあ、私はあなたのコードにリテラル文字列を挿入できると思います。私の作品

#include <stdio.h> 
int main(int argc, char *argv[]) { 
    char *id_string = "MARKER"; 
    if (argc < 0) { // (never true) 
    puts(id_string); 
    } 
    return 0; 
} 
+0

そうですが、 'string'コマンドを使ってマーカー文字列を確認することができます。ちょっとした考え – dlmeetei

1

あなたが実際にこの文字列を使用しない場合、コンパイラはので、おそらくあなたは、このような何かを試すことができ、最適化の際にそれを削除することを決定するかもしれませんdb(または.byte)ステートメントを使用できます。

__asm { 
    db 0x00 0x01 0x02 
} 

このコードを飛ばしてください。

2

なぜ複雑なのですか? ELFバイナリに物を挿入する方法は、グローバル変数と非静的関数を宣言することです。信頼性のないバイナリを文字列やそのようなツールで掘り起こしたり、偶然何かによって生成される可能性のあるマジックナンバーを掘り起こす必要はありません。

int this_is_my_marker; 

シンボル表にはthis_is_my_markerというシンボルが表示されます。

これは、動的ライブラリとunixyセマンティクス(これはELFによってほぼ暗示されています)を使用して比較的正常なシステムにいることを前提としています。すべてのグローバル変数/関数がデフォルトでシンボルテーブルに終わる理由は、ダイナミックライブラリがシンボルをメインプログラムから解決することが合法であるためです。これはかなり以前から行われてきたので、誰かがunixyオペレーティングシステムを開発するリスクはほとんどありません。 (gccにこれらの奇妙なフラグがある理由もあります)

関連する問題