SCENE RESEARCH STATION  
with my everyday
thinking-and-doctrine

LastUpdate 2004.02.24
dis assembler for Portable Executable file

dispe

dispeとは

Windows の実行ファイル及び DLL を解析することを目的に作成しているプログラムです.

単なるバイナリ単位の1ライン逆アセンブルではなく,人間が解析するように命令の流れを追ってコード領域やデータ領域を判別します.
他にも機械的に解析できる部分は解析して,人間が理解し易いように出力します.

PEのヘッダからExportやImportテーブルまで,出来るだけEXEのファイルイメージに忠実に出力するようにしているため,異常なエントリーポイントを持つような規格外の(普通の逆アセンブラでは展開することが出来ない)ファイルにも対応.
出力はNASM準拠.

最終的には C のソースを出力するのが目標です.
無謀?

実装している処理

ダウンロード

スナップショット

; subroutine ---------------------------------
; using      F0040aa5c() F00401340()
; referrer   F00401570()

F00402a80:      call    near F00401340
                mov     cl,[L0041b120]
                test    cl,cl
                jz      C00402ac7
; if {
                 test    eax,eax
                 jl      C00402ab6
;   if {
                  push    eax
                  mov     eax,[L0041afa8]
                  push    dword S00415e10
                  push    eax
C00402a9f:        call    near F0040aa5c
                  mov     ecx,dword [L0041afa8]
                  add     esp,byte +00ch
                  add     ecx,eax
                  mov     dword [L0041afa8],ecx
                  ret
;   }
C00402ab6:       mov     ecx,dword [L0041afa8]
                 neg     eax
                 push    eax
                 push    dword S00415e00
                 push    ecx
                 jmp     short C00402a9f
; }
C00402ac7:      test    eax,eax
                jl      C00402ada
; if {
                 mov     edx,dword [L0041afa4]
                 push    eax
                 push    dword S00415e10
                 push    edx
                 jmp     short C00402ae8
; }
; else {
C00402ada:       neg     eax
                 push    eax
                 mov     eax,[L0041afa4]
                 push    dword S00415e00
                 push    eax
; }
C00402ae8:      call    near F0040aa5c
                mov     ecx,dword [L0041afa4]
                add     esp,byte +00ch
                add     ecx,eax
                mov     dword [L0041afa4],ecx
                ret

                align 16,nop
dispe.exeをdispeによって逆アセンブルしたdispe.exe.asm結果の一部.
msblast.exeも逆アセンブルしてみた.両方とも再アセンブルして正常動作する模様.

旧版ダウンロード

使用法

Windows 用で拡張子が EXE,DLL のファイルをコマンドラインで渡してやるだけです.
一切パラメータを渡す必要はありません.
例えば,

>dispe c:/winnt/explorer.exe

とやれば explorer の解析結果が explorer.exe.asm というファイルに出力されます.
解析の途中記録とリソースの情報は explorer.exe.info というファイルに記録されます.

>dispe -p1024

というように実行中のプロセスIDを10進数で指定することもできます (NT/2000専用) .
プロセス ID はタスクマネージャのプロセスの PID を見てください.

-eオプションでhexdumpを無効に出来ます.
この形で出力したasmはnasmで再アセンブルが可能です(いい加減なので出来ない方が多いです).

>dispe -e foo.exe
foo.exe.asmが出力される.
>nasmw -f bin foo.exe.asm -o foo.asm.exe
foo.exe.asmをfoo.asm.exeにアセンブル.

オプション一覧

-p[PID]実行中のプロセスIDを指定することにより,そのプロセスをダンプします. ファイル名の代わりに指定してください.
-P[PNAME]実行中のプロセス名を指定することにより,そのプロセスをダンプします. ファイル名の代わりに指定してください.
-i メモリに展開されたPEイメージを指定します.
-e 16進ダンプを無効にします. nasmで再アセンブルしたい時に指定してください.
-E エントリーポイントから到達可能な部分は全てコードとして解釈します. コード領域のはずが,データ領域として認識される場合に指定してください.
-d 圧縮/暗号化されたコードを発見したら,自己展開します.
-j ジャンプ・ネスト解析を無効にします
--memdump メモリイメージをダンプします.
--debug 解析した後,dispeのデバッグ用モードに入ります.

連絡


バグ報告について.
使用したOS,dispeのバージョン,対象ファイル名,症状等を教えてもらえるとありがたいです.
もっと言うとバグるファイルを送りつけてくれると助かります.

連絡は,mnishibe at ertl.jpまで.bbsでもよいです.

関連リンク

逆アセンブラ

oldlog 99-00 00-01 01 01-02 02
newlog 2002 2003 2004 2005 2006 2007
category scene | 2ch | 麻雀

Copyright (C) 2003-2004 mitsuman(mnishibe at ertl.jp) All Rights Reserved.

750k+