识别汇编指令里的C和C++代码(一)
C系列编程语言(C、C++)是应用最广泛的一类编程语言,并且无疑是Windows和Unix服务器程序使用最多的编程语言,而这两类应用程序正是逆向分析的主要对象,因此掌握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,并把其中的一个元素设为9,相应的汇编代码如下:
array dw 0,0,0,0 ...more code... mov ebx,2 mov array[ebx],9
这个例子中,我们声明了一个数组,然后通过EBX把9转移到数组中。