Linuxでのアセンブラー開発

一般的に、Linuxでのアセンブリ言語プログラミングは広まっておらず、アセンブラーのファンがそれに取り組んでいます。 今日は、アセンブリ言語のプログラミングとツールキットについてお話します。 必要なもの:



実際、誰もが自分でツールを選択します。 私は自分でこれらを選びました。



FASMをインストールする



アーカイブをオフからダウンロードした後。 サイトを展開します。



tar zxvf fasm-1.69.11.tgz







このフォルダには、コンパイルに使用できるバイナリfasmファイルがあります。 便宜上、シンボリックリンクを作成できます:



sudo ln -s /home/username/fasm/fasm /usr/local/bin







aldとshedのインストールはこれ以上複雑ではありません。



$ ./configure

$ make

# make install








その結果、アセンブリ言語プログラミングに役立つ3つのツールが用意されます。



システムコール



他のほとんどのオペレーティングシステムと同様に、Linuxはいわゆる API-プログラマーにとって便利な機能のセット。 ほとんどの場合、80h割り込みを使用してシステム関数呼び出しが行われます。 Linuxはfastcallパラメーターの受け渡し規則を使用していることに注意してください。 それによると、パラメーターはレジスターを介して渡されます(たとえば、ウィンドウでは、パラメーターがスタックを介して渡されるstdcallが使用されます)。 呼び出された関数の数はeaxに入れられ、パラメーターはレジスターに入れられます。



パラメータ番号/レジスタ



1 / ebx

2 / ecx

3 / edx

4 / esi

5 / edi

6 / ebp



ご覧のとおり、すべてがそれほど複雑ではありません。 少なくともここで、システム関数の数、その説明、およびパラメーターを調べることができます。 例としてsys_exit



を取り上げます。 このページでわかるように、1つのパラメーターがあります-戻りコードとシリアル番号1。したがって、次のコードで呼び出すことができます。



mov eax, 1 ; 1 -

sub ebx, ebx ; ( mov ebx, 0)

int 80h ; 80h








すべてが明確であることを願っています。



Hello World!



じゃあ 何も書かない すべてが私たちのために書かれています:) fasm/examples/elfexe



には、hello.asmファイルがあり、これには次のコードが含まれています。



; fasm demonstration of writing simple ELF executable



format ELF executable 3

entry start



segment readable executable



start:



mov eax,4

mov ebx,1

mov ecx,msg

mov edx,msg_size

int 0x80



mov eax,1

xor ebx,ebx

int 0x80



segment readable writeable



msg db 'Hello world!',0xA

msg_size = $-msg








ご覧のとおり、2つのシステム関数がここで呼び出されますsys_write



(シリアル番号4)とsys_exit



です。 sys_write



は、出力ストリーム記述子(1-stdout)、文字列へのポインター、および文字列サイズの3つのパラメーターを受け入れます。 既に述べたように、関数番号自体はeaxに入れなければなりません。 すでにsys_exit



関数。 この奇跡をfasm hello.asm



ようにfasm hello.asm



できfasm hello.asm



(ただし、ソースと同じ場所にバイナリがあるため、必ずしもそうではありません)。



中身を見てみましょう



バイナリを調べる時が来たと思います。 まず、16進エディターを使用して、取得するものを確認します。 コマンドを実行します:



shed hello







画像



プログラム全体、データ、エルフヘッダーが表示されます。 悪くない? 次に、デバッガでプログラムを確認します。 コンソールに入力します:



ald hello







コマンドを入力するという提案のある行で迎えられるべきです。 helpと入力しhelp



コマンドのリストを調べるか、help commandと入力して別のコマンドでヘルプを取得できます。 disassemble



コマンド(またはそのエイリアス-" d



")を使用してプログラムを逆アセンブルできます。 プログラムの逆アセンブルされたリストが表示されます。 左側は住所、右側はチーム自体、中央はチームのオペコードです。



dump



コマンドを使用してダンプを取得できます(奇妙ですが、 help



コマンドの出力にはありません)。



画像



次に、 next



コマンドを使用してみてください。 それを実行すると、それに応じて、レジスタの値、フラグセット、次に実行されるアドレス、オペコード、逆アセンブルされたコマンドが表示されます。 コマンドを実行し、フラグとレジスタの変更を監視してください。 最初の割り込みが呼び出された後、「Hello world!」が画面に表示されます。



この記事の目的は、一般的なアセンブリ言語プログラミングではなく、Linuxでのアセンブリ言語プログラミングの基本を示すことでした。 ここから何か役に立つことを学んだことを願っています。



PS。 Habrに関する最初の記事。



便利なリンク



asm.sourceforge.net

www.int80h.org



All Articles