Top > 製品版のご購入 << Back

(画像提供: ISFDB)


<DCCの逆Cコンパイル手順>



    <目次>
    1. 関数やデータが正確に把握されているか
      1.1. 関数
      1.2. データ
    2. 単文(シンプルステートメント)が正確に把握されているか
    3. 多分岐文(switch)が正確に把握されているか
    4. ループ文(for-while)が正確に把握されているか
    5. 分岐文(if-else)が正確に把握されているか

 DCCで完全な逆Cコンパイルソースを出力させる上で、 主要なチェックポイントになる点について解説します。
 逆Cコンパイル作業が成功したかどうかの主要なチェックポイントは、
    [1]関数やデータが正確に把握されているか
    [2]単文(シンプルステートメント)が正確に把握されているか
    [3]多分岐文(switch)が正確に把握されているか
    [4]ループ文(for-while)が正確に把握されているか
    [5]分岐文(if-else)が正確に把握されているか
の5点です。
 逆Cコンパイル作業は、CSM(C シミュレータ)がすべて全自動で実行します。 上記の作業は、CSMの-vオプションを指定した場合に表示される、 CSM PASS 1からCSM PASS 5に、それぞれ対応します。具体的な作業は、 .dccファイルを作成して、そこにDCC コマンド(主にCSM コマンド)を羅列することです。

1.関数やデータが正確に把握されているか

1.1.関数

 CSMが把握した全関数は、CSMの-vオプションを指定した場合に、CSM PASS 1として、 メッセージファイルに詳細に出力されます。関数の範囲が不正な場合は、 pro コマンドかcpr コマンドを指定します。(pro コマンドは、 XSIM コマンドであるため、pro コマンドを指定し直した場合は、 XSIMから起動し直します。cpr コマンドの場合は、 CSMを-iオプションで再起動すれば済みます。pro コマンドとcpr コマンドの違いは、 ASMファイルに反映させるか、Cソースのみに反映させるかの違いです。)
 関数の範囲がすべて正確であれば、全関数を、cfu コマンドを用いて、関数の型、 関数の引数(parオプション)や内部データ(dynオプション)の型を指定します。 データ型を指定する際に、構造体(cst コマンド)やtypedef(cty コマンド)を指定する 場合は、cstやctyも指定します。
 外部関数(メッセージファイルにExtern Functionと表示)についても、 cfu コマンドを用いて、関数の型、関数の引数の型を指定します。
 Windowsのimport関数については、関数名が自動リネームされますので、関数名を参考 にして、やはりcfu コマンドを用いて、関数の型、関数の引数の型を指定します。 Windowsのimport関数は、すべて共通ですので、import.dccファイルに追加して おけば、CSMの実行時に自動的に参照されます。Windowsに共通な構造体(cst コマンド)や typedef(cty コマンド)も、import.dccファイルに追加します。 (PROXYAN 2.60は、import.dccに、 必要なすべてのcfu/cst/cty コマンドを、全自動で出力します。)

1.2.データ

 CSMが把握した全データは、CBRの画面出力やCGNの.hファイル出力で確認します。  データの指定は、cgl コマンドでデータの型を指定します。
データの範囲が不正な場合も、cgl コマンドで指定したサイズで、自動的にデータとして 記述されます。文字列配列の各文字列のラベル名は、一時名ですので、特にren コマンド でリネームする必要はありません。外部データの初期値は、初期値が0の場合は記述され ませんが、初期値が0でない場合は、初期値式として、記述されます。
 データの型指定が不正な場合は、このデータを参照している文の記述が不正であること からも分かります。例えば、文字列の参照が不正である場合です。
 外部データについても、cgl コマンドを用いて、データの型を指定します。
 Windowsのimportデータについては、データ名が自動リネームされますので、 データ名を参考にして、やはりcgl コマンドを用いて、データの型を指定します。 Windowsのimportデータは、すべて共通ですので、import.dccファイルに追加して おけば、CSMの実行時に自動的に参照されます。 (PROXYAN 2.60は、import.dccに、 必要なすべてのcgl/cst/cty コマンドを、全自動で出力します。)

2.単文(シンプルステートメント)が正確に把握されているか

 CSMが把握した単文の数は、CSMの-vオプションを指定した場合に、CSM PASS 2として、 表示されます。cpa コマンドで2を指定すれば、CSM PASS 2でCSMは終了しますので、 CBRの画面出力やCGNの出力から、単文がすべて正確に把握されているかを確認することが できます。また、log fil コマンドを指定すれば、ログファイル.logに、CSMの実行順に すべての単文から複文まで記述されます。
 単文が正確に把握されていなければ、複文も認識されませんから、単文が正確に記述 されているかが、Cソース記述の重要なポイントになります。
 単文が不正となるのは、 <AGNSSの逆アセンブル手順> で述べたXSIMの逆アセンブル作業が完全であれば、 関数やデータの型が不正であることが唯一の原因です。
 例えば、代入文は、実際には、eaxといったレジスタに一度保存されてから、eaxを 左辺値となるデータに代入しますが、このデータが定義されていなければ、CSMは、 このデータを左辺値とはみなさないため、単文として記述されません。
 関数やデータの型が正確に指定されていれば、単文も正確に記述されます。

3.多分岐文(switch)が正確に把握されているか

 CSMが把握した多分岐文(switch)の数は、CSMの-vオプションを指定した場合に、 CSM PASS 3として、表示されます。CSMが多分岐文とするのは、マルチジャンプ命令 (XSIMでジャンプテーブルの、jmp [ebx+label]等として記述されたもの)のみです。 Cコンパイラが、多分岐文を、マルチジャンプ命令ではなく、if-else文の羅列で コンパイルした場合は、CSMは、これを、if-else文の羅列で正確に記述します。
 マルチジャンプ命令に対応する単文は、Cの構文にはありませんが、CSM PASS 2では、 これを、'goto label[8]'という単文(マルチgoto文)として記述します。
 単文が正確に記述されていれば、多分岐文も正確に記述されます。
 CSMが記述した多分岐文を抑制/変更する場合は、csw コマンドを使用します。

4.ループ文(for-while)が正確に把握されているか

 CSMが把握したループ文(for-while)の数は、CSMの-vオプションを指定した場合に、 CSM PASS 4として、表示されます。CSMがループ文とするのは、for文やwhile文として 記述できるgotoループが検出された場合のみです。
 単文が正確に記述されていれば、ループ文も正確に記述されます。
 CSMが記述したループ文は、cfo コマンドやcwh コマンドで抑制/変更できます。
 同じループ文でも、forでもwhileでもgoto文でも記述できますから、ループ文の抑制/ 変更は、ユーザの方の好みの問題です。

5.分岐文(if-else)が正確に把握されているか

 CSMが把握した分岐文(if-else)の数は、CSMの-vオプションを指定した場合に、 CSM PASS 5として、表示されます。CSMが分岐文(if-else)とするのは、 if文やelse文として記述できるgoto分岐が検出された場合のみです。
 CSMが記述した分岐文は、cif コマンドで抑制/変更できます。
 単文が正確に記述されていれば、分岐文も正確に記述されます。
 同じ分岐文でも、ifでもelseでもgoto文でも記述できますから、分岐文の抑制/ 変更は、ユーザの方の好みの問題です。

株式会社 美利崎人 (ビリザキト)
〒201-0014 東京都狛江市東和泉1-34-19-102
TEL:03-5497-1962