ida提取hashab算法记录

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

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

#pragma pack(1)
    struct data_t
    {
        signed int v3; // [email protected]
        signed int v4; // [email protected]
        __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

时间: 2024-10-05 07:33:31

ida提取hashab算法记录的相关文章

HDU 3294 Girls&#39; research (Manacher算法 + 记录区间)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3294 题目大意:输入一个字符ch和一个字符串,问如果把ch当作'a'的话,字符串的每个字符也要做相应变化,如b aa,若b为'a',则b前面的a就为'a'前面的'z',这里是循环表示,输出字符串的最长回文子串,如果最长回文子串串长为1,输出No solution! 几乎是模板题,唯一的特别之处就是要输出回文串字符,所以要记录max(Mp[i])对应的在原串中的字符区间,根据Manacher算法的步骤

透视表提取不反复记录(3)-每组最小值

透视表提取不反复记录(3)-每组最小值 设计要点:不反复.数据透视表 秀秀:又開始得瑟. 阿金:还是告诉你吧,俺这一招最厉害了! 建立透视表.把全部字段按顺序都放在行区域,比方"物品名称"."分类"."数量"."金额"等等等,一定把要找的"数量"紧挨着"组",比方"物品名称"."分类",这样排序才管用. 秀秀:噢,然后右击"数量"

透视表提取不重复记录(1)-出现值

透视表提取不重复记录(1)-出现值 设计要点:不重复.数据透视表 阿金:其实提取不重复记录,俺还有办法. 秀秀:什么? 阿金:数据透视表. 秀秀:又是数据透视表? 阿金:对,建立一个数据透视表,把不想重复的字段都放在行区域,比如"物品名称",这样就可以得到出现过的名称的唯一值. 秀秀:噢?也挺简单,要是想找到每个物品的所有分类呢? 阿金:自己想想? 秀秀:哼!又拿一把-- 透视表提取不重复记录(1)-出现值

透视表提取不重复记录(5)-不能用于下拉选项

透视表提取不重复记录(5)-不能用于下拉选项 设计要点:不重复.数据透视表.下拉选项 秀秀:哼,透视表虽然是很强,但是有很多软肋呢! 阿金:嗯?--,你对透视表能有这么深入的了解?是你不会用吧. 秀秀:且!你看,它虽然可以自动提取出现值,但是不能把它作为下拉选项的数据源. 阿金:噢?俺看看.嗯,可能是它认为数据透视表的右下区域都有数据,所以单元格不为空,如果用counta()函数不能判断有几项. 秀秀:哎哟!透视表不是你的强项么?连这个都不了解? 阿金:啊,说明俺对透视表的了解还不够深入啊. 秀

透视表提取不重复记录(3)-每组最小值

透视表提取不重复记录(3)-每组最小值 设计要点:不重复.数据透视表 秀秀:又开始得瑟! 阿金:还是告诉你吧,俺这一招最厉害了!建立透视表,把所有字段按顺序都放在行区域,比如"物品名称"."分类"."数量"."金额"等等等,一定把要找的"数量"紧挨着"组",比如"物品名称"."分类",这样排序才管用. 秀秀:噢,然后右击"数量"

透视表提取不重复记录(2)-每个物品的所有分类

透视表提取不重复记录(2)-每个物品的所有分类 设计要点:不重复.数据透视表 阿金:接着上回说"提取不重复记录",想找到每个物品的所有分类,想出来了么? 秀秀:你就不能少得瑟一点? 阿金:还是告诉你吧,还是那句话:把不想重复的字段都放在行区域,比如"物品名称"和"分类"两个字段,你再看看? 秀秀:噢,但是还有汇总行 阿金:那就单击菜单"设计"-"分类汇总"-"不显示分类汇总"就行了.&q

透视表提取不重复记录(4)-每个物品的最大值

透视表提取不重复记录(4)-每个物品的最大值 设计要点:不重复.数据透视表 阿金:想明白了么? 秀秀:你这个方法很复杂,而且不容易理解,不怎么样! 阿金:你知道不,透视表的最大好处是自动实现!也就是说,虽然复杂一点,但是每次用的时候方便,只要刷新一下就可以了. 秀秀:嗯,这么说来还有点儿优点.哎?找每组的最大值记录是不是右击"数量"字段,"排序"-"降序"就行了? 阿金:对对对,有进步嘛,看来是真明白了点儿. 秀秀:哎哟! 不小瞧别人你就不舒服!

按照索引的细化提取骨架算法的java实现

近期研究验证码识别,也就看了一些图像识别的资料,其中一种字体细化提取骨架的算法网上没有java版的实现,所以就选取了一个python实现版本进行java代码的改写.. python版实现的地址: http://www.cnblogs.com/xianglan/archive/2011/01/01/1923779.html 由于我不是很懂python语法,也是直接去的w3c看的教程,为此还掉进了一个坑..详见: http://www.cnblogs.com/chyu/p/4335950.html

最小生成树之算法记录【prime算法+Kruskal算法】

首先说一下什么是树: 1.只含一个根节点 2.任意两个节点之间只能有一条或者没有线相连 3.任意两个节点之间都可以通过别的节点间接相连 4.除了根节点没一个节点都只有唯一的一个父节点 最小生成树就是: 在所有数据满足是一棵树的情况下一条将所有节点都连接起来且长度最短的一条路(因为任意两个节点之间有权值 (相连的两点之间权值为一个具体的数,不相连的两个点之间权值为无穷大)) 下面介绍通用的求最小生成树的两种算法: (1)prime算法: /* * 数组tree[]用来记录最小生成树的节点 * 数组