HexRays Decompiler(简称HexRays)
1.生成伪代码
生成伪代码所需要的操作,在对应的目标函数,按F5键即可
2.伪代码的构成
HexRays生成的伪代码有一定的结构,每个函数反编译后,第一行都为函数的原型,然后是局部变量的声明区域,最后是函数语句
其中上部位变量的声明区域,可以通过单击“Collapse declaration”将其折叠
注意:每个局部变量后面的注释实际上代表着这个变量的所在的位置
3.修改标识符
没有意义的变量名称将严重影响分析效率!
HexRays为用户提供了更改标识符名称的功能:将光标移动到标识符上,然后按N键,弹出更改名称的对话框,在输入一个合法的名称,然后按OK即可
注意:IDA一般允许使用符合C语言语法的标识符,但是将某些前缀作为保留使用,在手动指定名称时,这样的前缀是不能被使用
4.切换数据显示
注意上图我们看到,原来的数据0x66变为十进制数105,'a’和‘A’被转化为其ASCII编码的对应十进制数97和65
HexRay没有强大到可以自动标注这些常量,但是HerxRay提供了将常量显示为各种格式的功能
将光标移动到一个常量上,然后单击右键,在弹出的快捷键菜单中选择对应的格式
- Hexadecimal:十六进制显示,快捷键H,可以将各种其他显示格式转换回数字
- Octal:八进制显示
- Char:将常量转换为形如’A’格式,快捷键为R键盘
- Enum:将常量为枚举中的一个值,快捷键为M键
- Invert sign:将常量按照补码解析为负数,快捷键为_键
- Bitwise negate:将常量按位取反,形如C语言中的~0XF0,快捷键位 ~键
以下是修改后
5.修改变量类型
伪代码对开头的一些显示格式的转换,这是程序中的字符串中间的部分内容分别以dword、qword形式存储
实际上,原来字符串的赋值操作已经变成了128位浮点赋值+64位qword赋值+32位dword赋值
HexRays因此将字符串数组识别成了3个变量:__m128i类型的v6,_int64的v7和intv8
- byte-1字节整型,8位,char ,__int8;
- word-2字节整型,16位,short,__int16;
- dword-4字节整型,32位,int,__int32;
- qword-8字节整型,64位,__int64、longlong
HexRays充分利用前面介绍过的IDA的类型分析系统,在修改类型的标识符号上按Y键,即可调出对话框来修改类型
但是我这里IDA,比较高级,反汇编自动搞好了参数识别
HexRays不只支持局部变量的类型修改,也支持修改参数类型、函数原型、全局变量类型等
实际上,HexRays不仅支持这些简单的类型,还支持结构体、枚举等C语言类型。按Shift+F1组合键,调出窗口Local Types窗口,从中可以操作C的各种类型:按Insert键,或者单机右键,弹出添加类型的对话框
从中输入符合C语言简单语法的类型后,IDA会解析并存储其中的类型
此外,按Ctrl+F9组合键或选择"File+Load File+Parse Cheaderfile"菜单命令,可以加载C语言的头文件
HexRays的类型变化一般情况下可以将一个变量的长度强行增加,但是将一个长的变量改短时往往会报警”Sorry,can not change variable type“,所以将变量加长需要谨慎,如果改错,可以删除函数,再定义函数,以重置该函数的各种信息
6.完成分析
在将伪代码调试到适合自己月的的程度后,即可以开始分析
IDA和HexRays
1.如何找到mian
在windows和Linxu下,很多可执行文件都不是从main()函数开始执行的,而是经过CRT(C语言运行时)的初始化,再转到main()
- mian函数经常在可执行的靠前位置(因为很多链接器是先处理对象文件后处理静态库)
- VC的入口点(IDA种的start函数)会直接调用main函数,在start函数中被调用的函数有3个参数,并且返回值被传入exit函数的,可以重点查看
- GCC将mian函数的地址入口传入_libc_start_main来调用main函数,查看调用的参数可以找到main函数的地址
2.手动应用FLIRT签名
IDA中,有一类函数不同:函数列表中的底色为青色,在导航条中的对应区域也会显示为青色,实际上IDA的FLIRT函数签名识别库在起作用
Shift+F5组合键,可以打开Signture列表,其中会先显示已应用的函数签名库
查看导航条可以发现,VC运行时的代码有很多没有识别
IDA没有自动为这个程序应用其他VC运行时的签名
实际上IDA完全额可以识别后面的大部分函数