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
ida提取hashab算法记录相关推荐
- 透视表提取不反复记录(3)-每组最小值
透视表提取不反复记录(3)-每组最小值 设计要点:不反复.数据透视表 秀秀:又開始得瑟. 阿金:还是告诉你吧,俺这一招最厉害了! 建立透视表.把全部字段按顺序都放在行区域,比方"物品名称&q ...
- 文本分类和提取关键词算法_文本内容之间的关键词提取和相似度计算
文本分类和提取关键词算法 背景 Web应用程序变得越来越智能. 从网站上使用服务的日子已经一去不复返了,用户不得不填写一个巨大的表格. 假设您有一个适合书迷的网站. 在Web 2.0之前,像这样的网站 ...
- 正六边形C语言输出算法记录
正六边形C语言输出算法记录 要求:输入一个正整数n,输出一个边长为n的六边形. #include<stdio.h> int n,re=-1; void print(int *bealoon ...
- 2020年面试后端必会算法记录
2020年面试后端必会算法记录 C++面试集合 十大排序算法 数组排序&&链表排序 快速排序的递归实现 快速排序的非递归实现 两个栈实现一个队列(虾皮笔试) 两个队列实现一个栈 二叉树 ...
- 算法记录 牛客网 leetcode刷题记录
算法记录 & 牛客网 & leetcode刷题记录 解题思路 STL容器 常用算法模板 堆排序 插入排序 快速排序 BFS层序遍历 二叉树 JZ55 二叉树的深度 BST(binary ...
- python处理分组_Python在groupby分组后提取指定位置记录方法
在进行数据分析.数据建模时,我们首先要做的就是对数据进行处理,提取我们需要的信息.下面为大家介绍一些groupby的用法,以便能够更加方便地进行数据处理. 我们往往在使用groupby进行信息提取时, ...
- vibe前景提取改进算法
// improveVibeAlgorithm.h #ifndef IMPROVED_VIBE_ALGORITHM_H #define IMPROVED_VIBE_ALGORITHM_H#includ ...
- 0.IDA的反汇编算法方式
1.线性扫描 原理: 一条指令结束,另一条指令开始 关键: 确定起始位置 流程: 从起始,逐条反汇编指令,直到完成整个代码段 优点: 可覆盖程序的所有代码段 缺陷: 如果代 ...
- 计算机视觉CV中特征点提取SURF算法的学习笔记
1 致谢 感谢网友tongle.Wang的帮助, 链接如下: https://blog.csdn.net/ecnu18918079120/article/details/78195792 2 SURF ...
最新文章
- Day 30: Play Framework —— Java开发者的梦想框架
- 宝塔nginx文件服务器,宝塔面板nginx编译webdav模块 – 建立webdav服务器
- 学习React的一知半解
- 藏不住了,这就是阿里 AI 的真正实力!
- 服务器的数据库 mysql 开放远程连接
- java----Servlet的生命周期
- 技术人生:立志、勤学、改过、责善
- MySQL多表查询,SQL,笛卡尔积等值连接自连接外连接,SQL99新特性,完整详细可收藏
- Python基础-计算时间差,时间和,精确到秒,微秒,毫秒
- 华为盒子EC6108V9/V9U/V92/V97-HI3798MV100(免拆机-通刷固件)卡刷固件及教程
- 拼多多登录不上是什么原因 怎么解决拼多多登录失败
- 永洪bi mysql连接配置_永洪BI 如果不同步数据是做的数据库直连吗?
- 【无标题】【光纤光缆小知识】多模光纤的分类及应用
- web前端学习路线图
- MySQL的索引是如何实现的
- matlab颜色图 热力图 等高线图 色卡 色阶 颜色映像 colormap
- Dubbo流程及源码分析(一)
- Html单选按钮自定义样式
- C++11标准模板(STL)- 算法(std::nth_element)
- c++dll导入导出宏定义,出现“无法定义dllimport 实体”和“不允许dllimport 静态数据成员的定义”的问题