-
-
[原创]IDA hex-rays插件的副作用
-
发表于: 2012-3-20 13:19 5787
-
众所周知,IDA的F5反C代码的强大功能。汇编中若干的循环、跳转、判断对于我这个菜鸟来讲实在是难于登天。还好有了F5,让我看到了乌云上的金边。
不废话了,言规正转。不知道大家在IDA分析时,有没有把C代码直接粘贴出来在vc中编译的情况。最近分析算法,实在的没有头绪,就把它粘贴出来,从vc来调试。但是在vc下,遇到了一个问题,如下:
int __cdecl sub_44AAB0(int a1, int a2, int a3, int a4, int a5, int a6)
{
unsigned int v43;
char v44;
int v45[60];
.....
v10 = *(&v43 + v7);
v35 = *(&v43 + v7);
}
v43这个变量只有4个字节,这里v7大于4,那么v10应该是指向了v44或者v45的空间。在VC中栈变量的分配方向是先申请的变量地址是高地址,后申请的是低地址。这样,v43的地址在加上一个值,就是更高的地址,永远也不会指向低于它的v44和v45了。
这个问题怎么解决呢,最简单的办法就是反过来定义了,先定义v45 在v44 最后v43,这样,指针操作就不会出现错误。但是,又仔细一想,IDA中采用的指针操作肯定是没有空隙的。如上边的v44和v45之间肯定有3个字节的空隙,那么实际执行时指针可能又会出现错误。究竟如何解决才是最完美的呢。
定义一个一字节对齐的结构体,如下:
#pragma pack(push, 1)
struct ARRAY_STRUCT
{
unsigned int v43;
char v44;
int v45[60];
};
这样变量之间不存在对齐产生的空格,变量地址又符合IDA的标准,前低后高,所以不需要颠倒它们的声明顺序,真是两全齐美的办法!