明確なアドレス(GCC、Linux)で実行可能ファイルに「空の」スペースを作成する方法は?
-
19-09-2019 - |
質問
私が本質的にやりたいのは、実行可能ファイルが「作業」するためにこの「空きスペース」に別のプログラムを書き込むことです
アプリケーションに署名を追加してからデータを書き留めて、後で検索することを考えましたが、それはまったく正しく聞こえません...
さて、他の重要なこと...次のようなコードを使用してコード洞窟を作成することが可能であることを知っています。
void function(void) {
__asm {
nop
nop
nop
nop
};
}
次に、これでさえ実質的に同じです(それが.dataセクションにあるという事実を除いて、実行可能ではない):
const char data[3];
問題は、他のアプリケーションに書き込みする明確なアドレスがないことです。
解決
少なくともPESおよびELFの場合、プログラムに影響を与えることなく、実行可能ファイルの終わりにデータを追加できます。
標準的なアプローチは、データを実行可能ファイルに追加し、追加されたバイトの数を示す番号を追加することです。その後、実行可能ファイルは読み取りのために自らを開き、データの長さを示す最後のnバイトを見てから、次に seek
sは、その値によって、追加されたデータの先頭に逆行します。
この記事 上記の方法を使用して自己抽出実行可能なものを作成する方法について、かなり詳細に説明します。それはあなたが望むものとは少し異なりますが、実行可能ファイルに含まれるデータを読み取る原則は同じままです。
他のヒント
LDリンカースクリプトを使用して新しいセクションを作成し、ファイル画像の実際のスペースを予約します。また、シンボルを新しいデータセクションに関連付ける必要があります。おそらく、このように、代わりに短いアセンブリファイルを作成する方がさらに簡単でしょう。
.section .myresource
.align 4
.globl myres
myres:
.fill 1048576
次に、Cコードでは、このようなデータを取得するためにシンボルを使用します。
extern const int* myres;
Binutilsのドキュメントをこちらをご覧ください。http://sourceware.org/binutils/docs-2.19/
使用して尋ねたことをすることができます リンカースクリプト.
基本的に、function_name = scriptのアドレス。