* jitb00cの紹介
-(by [[K]], 2018.03.06)

** (0) はじめに
-このプログラムは面白半分で作っているだけです。実用性がないとか言って怒らないように。

** (1) これはなに?
-プログラムをコマンドラインから16進数で書いていくと、それを即座に実行することができます。
-言うまでもないですが、おかしな命令を書けばすぐに落ちます。まあCで200行くらいのプログラムでしかないので、多くを期待してはいけません。実行ファイルは5.0KBです。
-ちなみに VirtualAlloc を使っているのでWindows専用ですが、ここさえ直せばLinuxとかでも行けると思います。

-そのうちダウンロードできるようにします。

** (2) 実行例
 > がプロンプトなので、その行だけが入力行で、残りは出力です。
 
 
 → 起動直後にregsコマンドを実行してみました。
 >regs
 <regs>  eax:00000000  ecx:00000000  edx:00000000  ebx:00000000  esp:00680000  ebp:00000000  esi:00000000  edi:00000000
 <stack>
 → espレジスタ以外は0に初期化されています。スタックは何も積んでいないので表示されません。
 
 → セクション命令で機械語をメモリにおいてみます。セクション命令が代入命令の一部ではないとき、これは直ちに実行されます。
 >sec(0xb8 0x11 0x22 0x33 0x44)
 → B8はEAXへの代入命令です。
 
 → ちゃんと代入できているか確認してみます。
 >regs
 <regs>  eax:44332211  ecx:00000000  edx:00000000  ebx:00000000  esp:00680000  ebp:00000000  esi:00000000  edi:00000000
 <stack>
 → よしよし
 
 → ではスタックに積んでみましょう。
 >sec(0x50)
 → 50 は PUSH EAX です。しかし何も言わないのでうまくいっているかどうかわかりません・・・。
 
 → ということで確認です。
 >regs
 <regs>  eax:44332211  ecx:00000000  edx:00000000  ebx:00000000  esp:0067fffc  ebp:00000000  esi:00000000  edi:00000000
 <stack>  [44332211]
 → よしよし
 
 → スタックからおろしてみます。
 >sec(0x59)
 → ちなみにこれは POP ECX です。
 
 → 確認すると・・・
 >regs
 <regs>  eax:44332211  ecx:44332211  edx:00000000  ebx:00000000  esp:00680000  ebp:00000000  esi:00000000  edi:00000000
 <stack>
 → うまくいっていることが分かります。
 
 → これだけだと面白くないので、他のこともやってみます。
 >labels
 004012f0 : putdec
 → 登録済みの関数が表示されます。
 
 → この関数を使ってみます。Cで書かれた関数なので、スタックに引数を積みます。
 >sec(0x50 0xe8 rel32(0x4012f0) 0x58)
 1144201745
 → ADD ESP,4 するのが面倒だったので、 POP EAX で戻しています。
 → ちゃんと10進数表示されているようです。
 → rel32は32ビットの相対アドレスを書き込む命令です。E8はCALL命令です。

-命令secはセクションの略だったのですが、セクションを作るという発想はいまいちだったなと今は思っていますので許してください。

** (3) 見どころは?
-スタックが中途半端な状態でも、ちゃんと帰ってこられるし、続行できる。
-レジスタは全部自由に使える。
-ソースはC言語だけになっていて、インラインアセンブラも使ってない。・・・でも16進数はところどころに書いてあるけどね。

* こめんと欄
#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS