x86アセンブリニーモニックを機械語にアセンブルするプラグイン
ATOKダイレクトでASがサポートされないから無視するなんていうのは、宝の持ち腐れにも程があるってもので、何か作ってみることにした。
しかし、作るからには誰ともかぶってなくて、ありそうでないようなものが作りたい。小一時間思案に耽ってみたところ、「x86アセンブラ」というキーワードが思い浮かんだ。
そう、今求めているのはきっとこれだ。これでいこう。
x86アセンブラと言えば、MicrosoftのMASMや、BorlandのTASM、オープンソースプロジェクトのNASM、GNUのGAS辺りが有名だと思う。こいつらを呼び出して、出力をunpackしてもいいんだけど、スクリプトでやるなら100% Pure Rubyで行きたいところだ。
検索サイトで調べてみると、Metasploitと関連深いプロジェクトにMetasmというものがあって、Rubyでアセンブラ・逆アセンブラ・リンカ・Cコンパイラ・デバッガを開発しているらしい。しかもクロスアーキテクチャ。
Metasm is a cross-architecture assembler, disassembler, compiler, linker and debugger.
It has some advanced features such as remote process manipulation, GCC-compatible preprocessor, automatic backtracking in the disassembler ("slicing"), C headers shrinking, linux/windows debugging API interface, a C compiler, a gdb-server compatible debugger, and various advanced features. It is written in pure Ruby.
http://metasm.cr0.org/
こ、これはすごい……今回の目的遂行手段にぴったりすぎる。
すぐにインストールしたけど、どうやらリファレンスマニュアルはないらしい。まだ、サンプルとソースコードがマニュアル代わりという状態のようだ。
とりあえず、サンプルを眺めながら、プラグインスクリプトをサラサラっと書き下してみた。
module Atok_plugin def run_process(req) require 'metasm-shell' {'candidate'=>[ {'hyoki'=>(req['composition_string'].gsub("$","\n").encode.unpack('H*')[0] rescue 'error')}]} end end
あまりにも簡単に書けすぎでしょう、これは・・・?動かしてみると、これはおもしろい。ちゃんとアセンブルされてる。
ということで、キットを使って固めたものはこちらから。
ダウンロードする (MediaFire)
Ruby 1.9.1で動作確認済み。ただ、普通の状態では動かなくて、動かすにはMetasm(http://metasm.cr0.org/)をインストールする必要があり。
ふとアセンブルしたくなったとき、ハンドアセンブルできなくても素早く出来る利点がステキ!って、なったらいいなぁ。なーんかそんな都合のいいシーンが思い当たらないんだけど・・・
あと、Metasm-shellのデフォルトアーキテクチャはx86になってるけど、一応MIPSとPPCもいけるらしいので、いじってそっち向けのプラグインにしてもおもしろそうだ。