*
アセンブリで操作を解釈する方法は? ある種の配列操作が含まれますか?
IDA のスニペットの例では、プログラムの引数を使用しています。
mov eax, [ebp+arg_0]
mov ecx, [ebp+arg_4]
mov edx, [ecx+eax*4-4]
これは乗算です。
x86 では、1 つの命令で次の式を使用してメモリにアクセスできます。
*(base + offset*multiplier + displacement)
base と offset はレジスタで、multiplier は 1、2、4 または 8 で、displacement は定数です。
通常、これが表示されるときは、配列操作を見ています。たとえば、ecx - 4
(これはただのarg_4 - 4
であり、ここでarg_4
はポインターです) は 4 バイト整数の配列の開始である可能性が高く、eax
(これはただのarg_1
であり、ここでarg_1
は a ですsize_t
)配列へのオフセットになります。ただし、絶対に何でもかまいません。プログラムが最適化されてコンパイルされると、コンパイラはこれらの構造を使用してあらゆる種類の巧妙なトリックを引き出します。