Top > 製品版のご購入 | << Back |
![]() (画像提供: ISFDB) |
<DCCの逆Cコンパイル手順>
|
|
DCCで完全な逆Cコンパイルソースを出力させる上で、 主要なチェックポイントになる点について解説します。 |
逆Cコンパイル作業が成功したかどうかの主要なチェックポイントは、
[2]単文(シンプルステートメント)が正確に把握されているか [3]多分岐文(switch)が正確に把握されているか [4]ループ文(for-while)が正確に把握されているか [5]分岐文(if-else)が正確に把握されているか 逆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 |