ida提取hashab算法记录

      话说ida f5功能确实很强大,以后还会使用到f5进行提取代码,记录下这次提取代码过程中的想法。

      首先需要注意f5生成的伪代码函数内的局部变量都是以1字节对齐的,f5把一个函数使用的堆栈中的地址都对应到了一个变量上。ida生成的伪代码中会经常在某个变量的基础上对后面的数据进行赋值和拷贝。可以使用下面的方法进行解决。然后使用全部替换,在所有的变量前都加上data.。

#pragma pack(1)
    struct data_t
    {
        signed int v3; // esi@1
        signed int v4; // esi@3
        __int16 v6; // [sp+8h] [bp-198h]@1
        char v7; // [sp+Ah] [bp-196h]@1
        int v8; // [sp+Ch] [bp-194h]@1
        __int16 v9; // [sp+10h] [bp-190h]@1
        char v10; // [sp+12h] [bp-18Eh]@1
        int v11; // [sp+14h] [bp-18Ch]@1
        int v12; // [sp+18h] [bp-188h]@1
        int v13; // [sp+1Ch] [bp-184h]@1
        char v14; // [sp+20h] [bp-180h]@1
        char v15; // [sp+24h] [bp-17Ch]@1
        char v16; // [sp+25h] [bp-17Bh]@1
        int v17; // [sp+26h] [bp-17Ah]@1
        int v18; // [sp+2Ah] [bp-176h]@1
        int v19; // [sp+2Eh] [bp-172h]@1
        char v20; // [sp+32h] [bp-16Eh]@1
        __int16 v21; // [sp+33h] [bp-16Dh]@1
        char v22; // [sp+35h] [bp-16Bh]@1
        int v23; // [sp+36h] [bp-16Ah]@1
        __int16 v24; // [sp+3Ah] [bp-166h]@1
        char v25; // [sp+3Ch] [bp-164h]@1
        char v26[31]; // [sp+3Dh] [bp-163h]@3
        char v27; // [sp+5Ch] [bp-144h]@5
    }data;
#pragma pack()

2.需要注意的是生成的伪代码的局部变量中有些变量的大小有误,在这次提取算法过程中在这点上吃足了苦头。

比如说在上面的代码中f5生成的伪代码最后的两个局部变量很可能是:

       char v26; // [sp+3Dh] [bp-163h]@3
       char v27; // [sp+5Ch] [bp-144h]@5

一般都需要对局部变量的大小进行校验,比较好的一点是ida生成的伪代码后面有注释,会告诉我们变量的大小是多少,上面的代码应该修改为

       char v26[31]; // [sp+3Dh] [bp-163h]@3
       char v27; // [sp+5Ch] [bp-144h]@5

如果把局部变量的地址对齐和变量的大小都修改完成后,提取的函数基本就没有什么大的问题了。

3. 需要注意的是ida生成的伪代码会有一些宏需要自己进行补充

#define _HIDWORD(x) (((_DWORD*)&x)[1])
#define _LODWORD(x) (((_DWORD*)&x)[0])
#define _HIWORD(x) (((_WORD*)&x)[1])
#define _LOWORD(x) (((_WORD*)&x)[0])
//#define __PAIR__(x,y) (((unsigned long long)(x) << 32) + (y))
#define _LOBYTE(x) (((_BYTE*)&x)[0])
#define BYTE1(x) (((_BYTE*)&x)[1])
#define BYTE2(x) (((_BYTE*)&x)[2])
#define BYTE3(x) (((_BYTE*)&x)[3])

这些都需要自己进行补齐

4.ida生成的伪代码有部分会出现问题,主要体现在 a * ( b / c)这样的表达式写成a * b / c,这样的问题需要进行具体的跟踪比对才能发现,有这样的问题就会比较耗时间,其实我不想说我在这个问题上被坑了好多时间进去了。

大体上在使用ida提取算法的时候注意以上几点,就会节省很多时间。

最后把我使用ida提取的hashab算法共享上来,我把代码中计算偏移地址的偏移数据删除了,如果某位需要使用就要自己计算下获取偏移地址时使用的偏移数据,不多只需要改一行代码。

 http://files.cnblogs.com/xiaoshame/hashab.zip

转载于:https://www.cnblogs.com/xiaoshame/p/4054827.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值