x86アセンブリニーモニックを機械語にアセンブルするプラグイン

ATOKダイレクトでASがサポートされないから無視するなんていうのは、宝の持ち腐れにも程があるってもので、何か作ってみることにした。
しかし、作るからには誰ともかぶってなくて、ありそうでないようなものが作りたい。小一時間思案に耽ってみたところ、「x86アセンブラ」というキーワードが思い浮かんだ。
そう、今求めているのはきっとこれだ。これでいこう。
x86アセンブラと言えば、MicrosoftMASMや、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になってるけど、一応MIPSPPCもいけるらしいので、いじってそっち向けのプラグインにしてもおもしろそうだ。