-
-
[翻译]IDA Hex-Rays反编译器使用的一些小技巧
-
发表于:
2017-6-26 20:28
15074
-
[翻译]IDA Hex-Rays反编译器使用的一些小技巧
2017.6.20
在我的IDA系列中,我会介绍一些我在交互式反汇编程序,IDA Pro中发现的有趣又有用的东西。
我写这篇文章出于两个原因:
大部分有价值的信息都很分散,难以找到。有时候,你不得不靠自己去找寻这些信息,或是在论坛中寻求帮助。
更好的理解IDA的架构可以使你在使用它的时候少一些挫折感,也有节省大量时间。了解你的工具的不足和了解它的功能同样重要。[1]
对于这个反编译器,你需要了解的第一件事就是,它能进行反汇编并把它转化为C语言伪代码。听起来似乎有点多余,但确实很多人都没有意思到这点。例如,假设你有一个函数,它的功能是将一串flag变量与一个静态值进行比较,像这样:
Hex-Rays觉得这是一个偏移地址,因为它看起来像一个地址,但实际上它是一个标记检查代码。
在伪代码窗口中没有选项来修正它,但这个反编译器能把汇编代码映射为伪代码,我们可以通过把鼠标移至&loc_401001上,按下TAB键转到对应的反汇编代码中,把鼠标移到这个值上,按H,把它标记为一个值,而不是地址偏移。在再次按下F5进行反编译后,我们可以看到代码变成了我们想要的样子:
一些人觉得反编译给出的伪代码有错误,如果有需要,它会把分支消去,人们觉得这种做法不可靠,所以他们花了大量时间在那些没有经过优化,重复,臃肿的汇编代码上。这种做法是错误的。反编译器应该是我们的朋友,它给出了许多方式来提示你希望伪代码变成什么样。
例如,观察这个函数:
再看看汇编代码:
正如你看见的,代码中有一个cmp和jz,但反编译器只显示了第一个分支。不仅于此,再看看图形视图,我们可以发现还有更多的分支:
但为什么Hex-Rays没有反编译这块代码呢?
当第一次反编译这个函数时,我们可以看见这个警告:
它告诉我们数据引用的段会被替换为常数,例如:通过假设.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
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)