読者です 読者をやめる 読者になる 読者になる

Log.i53

Themidaのアンパックを目指すブログ改め使い物になるえんじにゃを目指すブログ

diStormをPythonで使ってみる

diStorm3

diStormは軽量で扱いやすく高速なデコンポーザライブラリで、16, 32, 64ビットモードの命令を逆アセンブルすることができます。サポートされている命令セットはFPU, MMX, SSE, SSE2, SSE3, SSSE3, SSE4, 3DNow! (w/ extensions), 新しいx86-64の命令セット, VMX, AMDSVM, AVXです。
 
diStormの新しいインタフェースの出力は任意のx86命令を表す特殊な構造体であり、この構造体は表示用のテキスト形式に変換することも可能です。diStormは元々C言語で書かれていましたが、迅速な利用のためにPython/Ruby/Javaのラッパーライブラリが生成され、C言語で書かれているものと同様な機能を簡単に扱うことができます。
 
また、逆アセンブラのライブラリでもあります。ソースコードは非常に綺麗で読みやすく、他の言語への移植が容易でありプラットフォームに依存しません。(リトルエンディアンとビッグエンディアンの両方に対応しています。)
 
diStormはもっぱらCライブラリでの実装に依存しており、したがってこれは組み込みやカーネルモジュールで使用することができます。diStorm3はdiStorm64のインタフェースに下位互換性があることに注意してください。(ただし、あなたが最新のヘッダファイルを使用していることを確認して下さい。)
 
diStorm3 | Kali Linux Toolsより

Kali LinuxにあらかじめインストールされているPythonライブラリの1つです。せっかくなので使い方を覚えておこうと思います。

導入

Kali Linuxであれば最初からインストールされています。インストールされていない場合はpipでdistormのパッケージをインストールしておきます。

# pip install distorm3
...
Successfully installed distorm3-3.3.0

使い方

diStormで利用するのは基本的にDecodeメソッドだけです。引数は以下のとおりです。

引数 概要
offset バイナリコードの原点となる仮想アドレス
code バイナリコードのバッファ
mode Decode16Bits:80286デコーディング, Decode32Bits:IA-32デコーディング, Decode64Bits:AMD64デコーディング

戻り値は、逆アセンブルされた命令のタプルのリストです。各タプルは、命令ごとのオフセット、サイズ、ニーモニックの文字列、16進数値の文字列で構成されています。

注意:最初の引数であるoffsetは、コードブロックの仮想アドレスです。コード内のオフセットではありません。これはアセンブラの[org]ディレクティブと同じようなものです。

サンプルA

from distorm import Decode, Decode32Bits
l = Decode(0x400000, open("text.exe", "rb").read(), Decode32Bits)
for i in l:
    print "0x%08x (%02x) %-20s %s" % (i[0],  i[1],  i[3],  i[2])

サンプルAの出力

f:id:i53:20150427170023p:plain

サンプルB

>>> Decode(0x400000, 'b800000000'.decode('hex'), Decode32Bits)
[(4194304L, 5L, 'MOV EAX, 0x0', 'b800000000')]