3

私が本質的にやりたいのは、実行可能ファイルが「動作」するために、別のプログラムにこの「空のスペース」にデータを書き込んでもらうことです。

アプリケーションに署名を追加してからデータを書き込んで後で検索することを考えましたが、それは正しく聞こえません...

さて、他の重要なこと...私は次のようなコードを使用してコード洞窟を作成することが可能であるはずだと知っています:

void function(void) {
__asm {
nop
nop
nop
nop
};
}

次に、これでも実質的に同じです(.dataセクションにあるため、実行可能ではないという事実を除けば)。

const char data[3];

問題は、他のアプリケーションに書き込むための明確なアドレスがないことです。

4

3 に答える 3

7

少なくともPEとELFの場合、プログラムにまったく影響を与えることなく、実行可能ファイルの最後にデータを追加できます。

標準的なアプローチは、データを実行可能ファイルに追加してから、追加されたバイト数を示す数値を追加することです。次に、実行可能ファイルは読み取り用に自分自身を開き、データ長を示す最後のNバイトを調べ、seekその値だけ逆方向に追加されたデータの先頭まで戻ります。

この記事では、上記の方法を使用して自己解凍型の実行可能ファイルを作成する方法について詳しく説明します。これはあなたが望むものとは少し異なりますが、実行可能ファイルに含まれるデータを読み取る原理は同じです。

于 2009-10-01T16:58:53.040 に答える
3

ldリンカースクリプトを使用して、新しいセクションを作成し、ファイルイメージの実際のスペースを予約します。また、シンボルを新しいデータセクションに関連付ける必要があります。おそらく、次のように、代わりに短いアセンブリファイルを作成する方が簡単です。

.section .myresource
.align 4
.globl myres
myres:
.fill 1048576

次に、Cコードで、次のようにシンボルを使用してデータを取得します。

extern const int* myres;

ここでbinutilsのドキュメントをチェックしてください: http ://sourceware.org/binutils/docs-2.19/

于 2009-10-01T17:06:59.920 に答える
0

リンカスクリプトを使用して、要求したことを実行できます。

基本的に、function_name=スクリプト内のアドレス。

于 2009-10-01T18:00:56.013 に答える