アセンブリ命令のCとC++コードを識別する(一)

2523 ワード

Cシリーズプログラミング言語(C、C++)は最も広く応用されているプログラミング言語であり、WindowsとUnixサーバプログラムが最も多く使用しているプログラミング言語であることは間違いないが、この2つのアプリケーションは逆分析の主な対象であるため、C言語を把握することは逆分析にとって極めて重要である.
C言語の理解に加えて,C言語が対応するアセンブリ命令にどのようにコンパイルされるかを熟知し,C変数,ポインタ,関数,メモリ割り当てなどをアセンブリ形式で表す方法を理解する.
まず、C++でカウント用の整数を宣言する方法を見てみましょう.
int number;
...more code...
number++;

対応するアセンブリコードは次のとおりです.
number dw 0
。。。more code。。。
mov eax,number
inc eax
mov number,eax

ここでの例では、まずDW命令で整数numberを定義し、次にそれをEAXに入れ、EAXに1を加えてからEAXをnumberに再入れます.
簡単なC++if文を見てみましょう.
int number;
if (number<0)
{
  ...more...
}

次はこのif文に対応するアセンブリコードです.
number dw 0
mov eax,number
or eax,eax
jge label
<no>
label :<yes>

この例では、DW命令でnumberを定義し、numberに格納されている値をEAXに移動し、numberが0以上であればJGEを実行してlableにジャンプする.
次に、配列を使用する例を見てみましょう.
int array[4];
...more code...
array[2]=9;

この例では、4つの要素を持つ配列arrayを定義し、そのうちの1つの要素を9に設定します.対応するアセンブリコードは次のとおりです.
array dw 0,0,0,0
...more code...
mov ebx,2
mov array[ebx],9

この例では,配列を宣言し,EBXを介して9を配列に移行する.