首页
社区
课程
招聘
[翻译]IDA Hex-Rays反编译器使用的一些小技巧
发表于: 2017-6-26 20:28 14880

[翻译]IDA Hex-Rays反编译器使用的一些小技巧

2017-6-26 20:28
14880

    2017.6.20


这是什么?

在我的IDA系列中,我会介绍一些我在交互式反汇编程序,IDA Pro中发现的有趣又有用的东西。

我写这篇文章出于两个原因:

大部分有价值的信息都很分散,难以找到。有时候,你不得不靠自己去找寻这些信息,或是在论坛中寻求帮助。

更好的理解IDA的架构可以使你在使用它的时候少一些挫折感,也有节省大量时间。了解你的工具的不足和了解它的功能同样重要。[1]

汇编<->伪代码映射

对于这个反编译器,你需要了解的第一件事就是,它能进行反汇编并把它转化为C语言伪代码。听起来似乎有点多余,但确实很多人都没有意思到这点。例如,假设你有一个函数,它的功能是将一串flag变量与一个静态值进行比较,像这样:

wrong output

Hex-Rays觉得这是一个偏移地址,因为它看起来像一个地址,但实际上它是一个标记检查代码。

在伪代码窗口中没有选项来修正它,但这个反编译器能把汇编代码映射为伪代码,我们可以通过把鼠标移至&loc_401001上,按下TAB键转到对应的反汇编代码中,把鼠标移到这个值上,按H,把它标记为一个值,而不是地址偏移。在再次按下F5进行反编译后,我们可以看到代码变成了我们想要的样子:

okay output

反编译器没有遗漏分支

一些人觉得反编译给出的伪代码有错误,如果有需要,它会把分支消去,人们觉得这种做法不可靠,所以他们花了大量时间在那些没有经过优化,重复,臃肿的汇编代码上。这种做法是错误的。反编译器应该是我们的朋友,它给出了许多方式来提示你希望伪代码变成什么样。

例如,观察这个函数:

random function

再看看汇编代码:

disassembly

正如你看见的,代码中有一个cmp和jz,但反编译器只显示了第一个分支。不仅于此,再看看图形视图,我们可以发现还有更多的分支:

graph overview

但为什么Hex-Rays没有反编译这块代码呢?

当第一次反编译这个函数时,我们可以看见这个警告:

decompiler warning

它告诉我们数据引用的段会被替换为常数,例如:通过假设.r_data段中的数据永远不会改变,来优化输出。

现在,返回到汇编代码中:

.text:00401799                 cmp     ds:dword_40E000, 0

.text:004017A0                 jz      short loc_4017E6

这里有一个对数据的引用,dword_40E000。如果我们检查一下这个数据的位置,就可以发现它在.r_data数据段中:

.r_only:0040E000 ; Segment type: Pure data

.r_only:0040E000 ; Segment permissions: Read

.r_only:0040E000 _r_only         segment para public 'DATA' use32

.r_only:0040E000                 assume cs:_r_only

.r_only:0040E000                 ;org 40E000h

.r_only:0040E000 dword_40E000    dd 0                    ; DATA XREF: sub_401770+29

反编译器假设上述汇编代码等同于:

if (dword_40E000) {
           // ...
}

 

因为dword_40E000的值是0,而它又被识别为只读的,也就相当于上述代码是无效的,相当于:

if (0) {
            // ...
}

 

理论上来说,它什么也不做,所以在优化时就把它去除了。如果要修正它,我们可以把这个特殊的变量标记为volatile(常量/const/read-only variable的反义词),或是把整个段标记为可读写。

volatile variable

(标记变量为volatile)

segment attributes

(改变段属性)         

不仅如此,因为Hex-Rays会进行优化,它会把对程序无用的垃圾代码去除掉。

disasm
optimized pseudocode

今天就讲到这。如果你想要我讲某个主题,请在评论中列出来。



原文链接:https://qmemcpy.github.io/post/ida-series-1-hex-rays

本文章由看雪翻译小组 梦野间 翻译



[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 1
支持
分享
最新回复 (10)
雪    币: 1355
活跃值: (334)
能力值: ( LV13,RANK:920 )
在线值:
发帖
回帖
粉丝
2
谢谢分享!
2017-6-26 20:35
0
雪    币: 375
活跃值: (181)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习
2017-6-26 21:40
0
雪    币: 34
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
IDA  Pro的&lt;F5&gt;、Enums和Structures简直是黑科技,活用Python更令人艳羡。
2017-6-26 21:51
0
雪    币: 3020
活跃值: (3065)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5


这样的方式该做何解决,被截断了

2017-6-27 10:06
0
雪    币: 134
活跃值: (377)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
感谢分享
2017-7-2 23:37
0
雪    币: 3700
活跃值: (3817)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
很有用,感谢分享!
2017-7-4 01:52
0
雪    币: 6103
活跃值: (1207)
能力值: (RANK:30 )
在线值:
发帖
回帖
粉丝
8
2017-7-5 15:24
0
雪    币: 1239
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢分享,同时想知道  改变段属性  那部分  的窗口  是怎么调出来的?
2017-7-17 13:19
0
雪    币: 3757
活跃值: (1757)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
10
lllang 感谢分享,同时想知道 改变段属性 那部分 的窗口 是怎么调出来的?[em_4]
上面的view-&gt;open  subviews-&gt;segments,然后右键,编辑
应该是有快捷键的,不过我不知道
2017-7-18 20:16
0
雪    币: 1239
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
梦野间 上面的view->open subviews->segments,然后右键,编辑 应该是有快捷键的,不过我不知道
谢谢你呢~我看到了,快捷键的话是先  shift+F7  打开Program  Segmentation,然后Ctrl+E,可以编辑~
2017-7-26 14:38
0
游客
登录 | 注册 方可回帖
返回
//