47

Hex Editor を使用するだけで、Hello World プログラムのような単純なものを作成する方法を知りたいです。アセンブラとアセンブリ言語を使用してほぼマシン レベルでこれを実行できることはわかっていますが、Hello World などのおもちゃの例で実際にマシン コードを記述して実験したいだけです。

これは、DOSBox で実行できる単純な DOS .COM ファイルである可能性があります。しかし、私の Windows PC で直接実行するための .EXE ファイルの例を誰かが提供してくれるとよいでしょう。

これは純粋な好奇心です。いいえ...バイナリマシンコードでプログラムを直接書くことは考えていません(通常、アセンブリコードを書くことさえありません。ほとんどの場合、最も低レベルのツールとしてC / C ++を使用しています)。おそらく、コンピューターの初期の頃に誰かがそれをしなければならなかったので、それが可能かどうかを知りたいだけです.

PS:このトピックについて同様の質問があることは知っていますが、実際の例を提供するものはありません。コンパイラとアセンブラが実行可能ファイルを生成する方法を理解するのに役立つように、簡単な例が必要です。つまり... 誰かが最初のプログラムで過去にこれを手作業で行ったに違いありません。また、Windows EXE フォーマットの場合、フォーマットを生成するための最初のツールと、Windows 自体がそれを読み取って実行する方法を作成した Microsoft の誰かがいたに違いありません。

4

6 に答える 6

20

corkami/wiki/PE101には非常に最小限ですが、完全に機能する (Win7 でも) exe があり、そのすべてのバイトが素敵なグラフィックで説明されています。16 進エディタですべて手動で入力できますが、パディングがあると少し面倒になる場合があります。

歴史に関しては、はい、Microsoft の誰かが exe 形式 (古い DOS MZ exe 形式) を発明し、彼 (または Microsoft の他の誰か) がそれ用のローダーとリンカを書きました。コンパイラ (「オブジェクト ファイル」) を実行可能ファイルに変換します。最初の exe プログラムは、新しいローダーをテストするためだけに作成されたものであったため、手動で作成された可能性があります (その可能性が高いとさえ言えます)。

その後、AT&T の COFF 形式は Microsoft によって PE 形式に拡張されました。PE 形式にはまだ MZ ヘッダーがあり、通常 (ただし、オプションで、corkami の例には含まれておらず、実際には何でもかまいません)、メッセージを出力するためだけの小さな DOS プログラムが含まれています。 「このプログラムは DOS モードでは実行できません。」

于 2012-07-31T16:08:08.103 に答える
8

1) .com ファイルは開始する最も簡単な場所であり、dosbox で実行されます。基本的に、プログラムはファイル内のオフセット 0x100 のような場所から開始されます。最初の 0x100 は何でもよいと思いますが、覚えていません。

2) 多くの場合、最初のプログラムは手動で作成され、マシン コードにアセンブルされますが、これは、2 つの数値を追加してそれらをメモリに保存し、残りの 1 日を休むことができることを意味します。ビデオ カードに出力する "hello world" プログラムは、はるかに複雑です。dos システム コールを使用して非常に単純なものを作成できるようになりました。

3) 2 に基づいて、1960 年代または 1970 年代にさかのぼってテストするための一度に 1 つまたはいくつかの命令よりも複雑なものはすべて、プログラムを手動で組み立てる場合でも、プログラムをアセンブラーで手動で記述し、それを機械語にアセンブルします。それをロードします。基本的に、最初にアセンブリ言語を学び、それからマシンコードを生成する方法を学び、それらのバイトを 16 進エディタに入力し始めます。当時は 1960 年代ではありません。極度の苦痛を味わわない限り、上記のことを asm で書き、アセンブラを使用してマシン コードを生成し、逆アセンブラを使用して逆アセンブルし、アセンブリ言語とマシン コードを並べて調べて大幅に改善しない限り、1960 年代ではありません。動作するプログラムを取得するのにかかる時間。オペレーティング システムや命令セットが登場する前にチップ会社で働いていた場合、マシンコードの作成方法と配置方法を理解するために、チームの他のメンバー、チップ設計者などを引き続き利用します。高レベルの言語経験だけで、成功を期待して自分ですべてを行うことはできません。

4) x86 はひどい命令セットです。アセンブリを知らない場合は、最初にアセンブリを学ばないことを強くお勧めします。x86 を持っているということは、最初に x86 を学ぶための最悪の言い訳です。あなたはすでに dosbox について言及したので、すでにエミュレート/シミュレートを計画しているので、適切な命令セットを使用してシミュレートするか、そのハードウェアを購入します (50 ドル未満でも 20 ドル未満でも、はるかに優れた命令セットを備えたボードを購入できます)。購入する場合は、最初にハードウェアと並行してシミュレート/エミュレートすることをお勧めします。本当に教育が必要な場合は、独自のシミュレーターを作成することはまったく難しくありません。おそらく、独自の命令セットを発明してください。

5) これは、コンパイラが何をするかを理解するのに役立ちません。アセンブリ言語を知ってからコンパイラの出力を逆アセンブルすることが、その知識への最善の道です。機械語は関係なく、実際にプログラムを実行する必要はありません。コンパイラは、高水準言語から低水準言語に移行します (たとえば、C から asm または C++ から asm)。次に、アセンブラが何をするかを理解してください。歴史とその他の理由により、さまざまな解決策があります。今日の典型的な解決策は、別個のコンパイラ、アセンブラ、およびリンカです (コンパイラは、指示しない限り、アセンブラとリンカを呼び出します。3 つのステップは表示されません。実際、コンパイル プロセスは複数のプログラムである可能性があります。を実行してそのタスクを完了します)。バイナリを出力するアセンブラは、プログラム全体を解決する必要があります。オブジェクトに出力するアセンブラは、リンカが埋めるために機械語コードに穴を残します。リンカがバイナリに物を配置し、スペーシング/アドレス指定を知るまで、エンコードできない別のオブジェクトの分岐やアイテムの呼び出しなどです。他のオブジェクトに存在する変数にもアクセスします。

プログラムの 16 進編集に関する実際の例を見ない可能性があります。最初は非常に広範な質問であり、単純な答えがないためです (どのオペレーティング システム、どのシステムが呼び出すのか、またはそれらを作成するのか、どのファイル形式、どの 16 進エディタなど) )。また、これは高レベルの質問と問題であるため、実際の質問は、アセンブリをどこで学ぶか、アセンブリとマシン コードの関係をどこで学ぶか、システム コール (アセンブリの問題ではなく、 asm の学習とは関係ありません。アセンブリ言語自体を学習し、高等言語を使用してシステム コールを直接実行できない場合は、システム コールを実行するためのツールとして使用することを学びます)、.com などの実行可能ファイル形式についてはどこで学習しますか.exe、coff、elf など。xyz オペレーティング システムまたは環境で実行される 16 進エディタ。これらの質問を個別に尋ねると、回答と例が見つかります。これらの回答が得られたら、マシンコードを入力する 16 進エディターを使用してプログラムを作成する方法がわかります。短い例としては、SO に投稿されたプログラムの逆アセンブルを見ると、完全なプログラムの 16 進の例が表示されます。そのうちのいくつかは 16 進で示される完全なプログラムです。ファイル形式がわかっている場合は、そのファイルを 16 進エディタに入力するだけです。それらのいくつかは、16 進数で示される完全なプログラムです。ファイル形式がわかっている場合は、そのファイルを 16 進エディタに入力するだけです。それらのいくつかは、16 進数で示される完全なプログラムです。ファイル形式がわかっている場合は、そのファイルを 16 進エディタに入力するだけです。

于 2012-08-04T05:25:04.170 に答える
5

私は手作業でバイナリを作成していますが、何も更新するのが難しい純粋な 16 進エディターよりも、アセンブリ自体の方が簡単だと思います。

  • 最も簡単なのは確かに DOS COM 形式です。これは notepadに入力することもできます。少なくとも、通常のHello Worldでも非常に簡単です。

  • EXE (非 DOS 形式) は、こちらを参照してください。

  • PE を作成しようとしている場合は、TinyPEを作成できます。

ほとんどのバイナリは、 PEEXE 、および COMとして利用できるはずです。

于 2012-09-01T15:21:45.037 に答える
4

正確ではありませんが、このチュートリアルでは、アセンブリがどのようにマシンコード(x86 ELF)にマップされるかについてのより良い洞察が得られるはずです:http://timelessname.com/elfbin/ 特にページの下半分を見てください)

このページは[...]UbuntuLinuxでHelloWorldと言って実行される最小のx86ELFバイナリを作成する試みについてです。最初の試みはCで始まり、次にx86アセンブリ、最後に16進エディタに進みました。

アセンブリとマシンコード間のマッピングを見つけやすくなるため、このような非常に小さな実行可能ファイルを分析するのは素晴らしいことです。これは、このテーマに関する非常に興味深い記事でもあります(ただし、あなたの質問とは正確には関連していません):http ://www.phreedom.org/research/tinype/ (x86 PE)

于 2012-07-31T15:37:03.540 に答える
3

コマンド プロンプトで ECHO を使用するだけで、実行可能な DOS バイナリ ファイルを作成する方法について記事を書きました。サードパーティの HEX ユーティリティや x86 IDE は必要ありません。

この技術は、OPCODES を MSDOS で直接読み取り可能なバイナリ形式に変換するキーパッド - ALT ASCII コードの組み合わせを使用します。出力は、完全に実行可能なバイナリ *.com ファイルです。

http://colinord.blogspot.co.uk/2015/02/extreme-programming-hand-coded.html

抜粋: DOS プロンプトで、左 ALT を押しながら次のキー コマンドを入力します。

c:\>Echo LALT-178 LALT-36 LALT-180 LALT-2 LALT-205 LALT-33 LALT-205 LALT-32 > $.com

上記のコードは、実際にはドル記号を画面に出力する X86 アセンブリ プログラムを記述する opcode 値です。

完了すると、プロンプトは次のようになります。Enter キーを押してビルドします。

c:\>Echo ▓$┤☻═!═  > $.com

ファイル「$.com」を実行すると、画面に 1 つのドル記号 ($) が表示されます。

c:\>$.com
$
c:\> 

おめでとう!$.com という最初の手でコード化された実行可能ファイルを作成しました。

于 2015-02-05T11:21:47.940 に答える
2

逆アセンブルを実行して、アセンブラで使用するオペコードのマシン コードを見つけてみてください。

例えば

org 0x100
mov dx,msg
mov ah,0x09
int 0x21
ret
msg db 'hello$'

nasm -fbin ./a.asm -o ./a.com でコンパイルすると、ndisasm a.com が次の逆アセンブリを提供します。

00000000  BA0801            mov dx,0x108
00000003  B409              mov ah,0x9
00000005  CD21              int 0x21
00000007  C3                ret
00000008  68656C            push word 0x6c65
0000000B  6C                insb
0000000C  6F                outsw
0000000D  24                db 0x24

00000000 to 00000007 are the instructions

16 進エディタを使用して ba0801 マシン コードを操作し、ba0901 に変更してみてください。「ello」のみが出力されます。16 進エディタをいじって、マシンでは 0x90 である NOP をパディングします。コード、例:

00000000:  ba 50 01 90 90 90 90 90  90 90 90 90 90 90 90 90  .@..............
00000010:  b4 09 90 90 90 90 90 90  90 90 90 90 90 90 90 90  ................
00000020:  cd 21 90 90 90 90 90 90  90 90 90 90 90 90 90 90  .!..............
00000030:  c3 90 90 90 90 90 90 90  90 90 90 90 90 90 90 90  ................
00000040:  71 77 65 72 74 79 75 69  61 73 64 66 67 68 6a 24  qwertyuiasdfghj$
00000050:  61 73 64 66 67 68 6a 6b  61 73 64 66 67 68 6a 24  asdfghjkasdfghj$
00000060:  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  ----------------

これを拡張子 .com で保存すると、DosBox で実行できます。

于 2014-09-27T19:27:39.357 に答える