首页
社区
课程
招聘
[原创]IDA hex-rays插件的副作用
发表于: 2012-3-20 13:19 5787

[原创]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的标准,前低后高,所以不需要颠倒它们的声明顺序,真是两全齐美的办法!


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 6
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//