码迷,mamicode.com
首页 > 编程语言 > 详细

ida提取hashab算法记录

时间:2014-10-27 19:28:27      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:blog   http   os   ar   使用   sp   数据   on   问题   

      话说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

ida提取hashab算法记录

标签:blog   http   os   ar   使用   sp   数据   on   问题   

原文地址:http://www.cnblogs.com/xiaoshame/p/4054827.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!