最近在练《天书夜读》,在2.3 C语言的数组与结构 章节里有如下代码(注:我用的是VS2005):
--- e:\practice\visual studio 2005\projects\reverseme\reverseme\reverseme.c ----
// ReverseMe.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
typedef struct{
int a;
int b;
int c;
}mystruct;
int myfunction(int a, int b)
{
00413570 push ebp
00413571 mov ebp,esp
00413573 sub esp,270h
00413579 push ebx
0041357A push esi
0041357B push edi
0041357C lea edi,[ebp-270h]
00413582 mov ecx,9Ch
00413587 mov eax,0CCCCCCCCh
0041358C rep stos dword ptr es:[edi]
unsigned char *buf[100];
mystruct *strs=(mystruct *)buf;
0041358E lea eax,[buf]
00413594 mov dword ptr [strs],eax
int i;
for (i=0; i<5; i++)
0041359A mov dword ptr [i],0
004135A4 jmp myfunction+45h (4135B5h)
004135A6 mov eax,dword ptr [i]
004135AC add eax,1
004135AF mov dword ptr [i],eax
004135B5 cmp dword ptr [i],5
004135BC jge myfunction+94h (413604h)
{
strs[i].a=0;
004135BE mov eax,dword ptr [i]
004135C4 imul eax,eax,0Ch
004135C7 mov ecx,dword ptr [strs]
004135CD mov dword ptr [ecx+eax],0
strs[i].b=1;
004135D4 mov eax,dword ptr [i]
004135DA imul eax,eax,0Ch
004135DD mov ecx,dword ptr [strs]
004135E3 mov dword ptr [ecx+eax+4],1
strs[i].c=2;
004135EB mov eax,dword ptr [i]
004135F1 imul eax,eax,0Ch
004135F4 mov ecx,dword ptr [strs]
004135FA mov dword ptr [ecx+eax+8],2
}
00413602 jmp myfunction+36h (4135A6h)
return 0;
00413604 xor eax,eax
}
逆向分析时发现里面有个乘法指令:
004135DA imul eax,eax,0Ch
怎么有3个操作数呢? 看着有点怪,哈哈、 天书夜读里作者说0Ch是单个元素的长度,之后用imul指令将元素下标去乘此长度.. ,然后不断的查资料..
imul eax,eax,0Ch
IMUL 用于有符号数乘法运算
0Ch(第3个操作数)是乘数,eax(第2个操作数)里存放被乘数,运算结果放入eax(第1个操作数)。
注意:乘积是16位宽的有符号数