返回介绍

7.2 IDA 中的注释

发布于 2024-10-11 21:05:42 字数 4147 浏览 0 评论 0 收藏 0

IDA 的另一项有用功能是它能够在数据库中嵌入注释。在分析程序时,添加注释特别有用,因为它可帮助你随时掌握分析进程。具体来说,注释有助于以一种更高级的方式描述汇编语言指令序列。例如,你可以选择使用 C 语言语句添加注释,以总结某个特殊函数的行为。在随后的函数分析过程中,这些注释有助于你迅速回忆起该函数的作用,而不需要重新分析汇编语言语句。

IDA 提供了几种不同类型的注释,每种注释适用于不同的目的。使用 Edit▶Comments 命令提供的选项,可以为反汇编代码清单中的任何一行代码添加注释。通过热键或上下文菜单,同样可以使用 IDA 的注释功能。为帮助你理解 IDA 的注释功能,我们下面以函数 bar 的反汇编代码为例:

.text:00401050 ; =============== S U B R O U T I N E ===============================  
.text:00401050  
.text:00401050 ➏; void bar(int j, int k);  
.text:00401050 ; Attributes: bp-based frame  
.text:00401050  
.text:00401050 ➐bar       proc near               ; CODE XREF: demo_stackframe+2A‚p  
.text:00401050 
.text:00401050 arg_0     = dword ptr  8  
.text:00401050 arg_4     = dword ptr  0Ch  
.text:00401050  
.text:00401050 push ebp  
.text:00401051 mov ebp, esp  
.text:00401053 sub esp, 8  
.text:00401056 ➎The next three lines test j
.text:00401056 mov eax, [ebp+arg_0]  
.text:00401059 cmp eax, [ebp+arg_4] 
.text:0040105C jge short loc_40106C ➌; Repeating comments get echoed at referencing locations  
.text:0040105E mov [esp], offset aTheSecondParam  ➍; "The second parameter is larger"  
.text:00401065 call printf  
.text:0040106A jmp short locret_40108E  ➊; jump to the end of the function  
.text:0040106C ;   ---------------------------------------------------------------------------    
.text:0040106C  
.text:0040106C loc_40106C:                             ; CODE XREF: bar+C•j  
.text:0040106C mov eax, [ebp+arg_0] ➋; Repeating comments get echoed at referencing locations  
.text:0040106F cmp eax, [ebp+arg_4]  
.text:00401072 jle short loc_401082  
.text:00401074 mov [esp], offset aTheFirstParame  ❹; "The first parameter is larger"  
.text:0040107B call printf  
.text:00401080 jmp short locret_40108E  
.text:00401082 ;   ---------------------------------------------------------------------------  
.text:00401082  
.text:00401082 loc_401082:                             ; CODE XREF: bar+22•j  
.text:00401082 mov [esp], offset aTheParametersA  ❹; "the parameters are equal"  
.text:00401089 call printf  
.text:0040108E    
.text:0040108E locret_40108E:                          ; CODE XREF: bar+1A•j  
.text:0040108E                                         ; bar+30•j  
.text:0040108E leave  
.text:0040108F retn  
.text:0040108F bar  end  

绝大多数 IDA 注释以分号为前缀,表示这一行分号以后的部分属于注释。这与许多汇编器的注释方法类似,并等同于许多脚本语言中的#式注释和 C++ 中的// 式注释。

7.2.1 常规注释

最简单直接的注释为 常规注释 。常规注释位于现有汇编代码行的尾部,如前面代码中➊处的注释。右击反汇编窗口右边缘,或者使用冒号(: )热键,可打开“输入注释”对话框,若在其中输入了多行注释,常规注释将跨越多行。每一行注释将排到反汇编窗口的右侧,并同样以分号开头,且与最第一个分号对齐。要编辑或删除一段注释,必须重新打开“输入注释”对话框,在必要时对其中的注释进行编辑或删除。默认情况下,常规注释以蓝色显示。

IDA 本身就大量使用常规注释。在分析阶段,IDA 插入常规注释说明为调用函数而压入的参数。只有当 IDA 拥有被调用函数的参数名称或类型信息时,它才会使用常规注释。通常,这些信息包含在类型库中(这些内容将在第 8 章和第 13 章讨论),也可以手动输入。

7.2.2 可重复注释

可重复注释 一旦输入,将会自动出现在反汇编窗口中的许多位置。在前面的代码段中,➋处的注释即为可重复注释。在反汇编代码清单中,可重复注释的颜色默认为蓝色,这使得我们很难将它们与常规注释区分开来。在这种情况下,行为比外观更加重要。可重复注释的行为与交叉引用的概念有关。如果一个程序位置引用了另一个包含可重复注释的位置,则该注释会在第一个位置回显。默认情况下,回显的注释以灰色文本显示,从而将这些注释与其他注释区分开来。可重复注释的热键为分号(;),因此,可重复注释与常规注释非常容易引起混淆。  

在前面的代码中,我们注意到,➌处的注释与➋处的注释完全相同。➋处的注释被重复,因为➌处的指令( jge short loc_40106C )引用了➋处的地址( 0040106C )。

如果在一个显示可重复注释的位置添加一段常规注释,则可重复注释将被常规注释覆盖,该位置将仅显示常规注释。如果在➌处输入一段常规注释,那么,从➋处继承得来的可重复注释将不再在➌处显示。如果你删除➌处的常规注释,可重复注释将再次显示。

可重复注释的一种变体与字符串有关。任何时候,如果 IDA 自动创建一个字符串变量,字符串变量所在的位置都将添加一段虚拟的可重复注释。我们称之为 虚拟 注释,因为用户无法编辑这段注释。虚拟注释的内容被设置为字符串变量的内容,并且会在整个数据库中显示,就像是一段可重复注释一样。因此,任何引用字符串变量的位置都将以重复注释的形式显示字符串变量的内容。标注为➍的 3 段注释证明,这类注释是因为引用了字符串变量才显示的。

7.2.3 在前注释和在后注释

在前注释在后注释 是出现在指定的反汇编行之前或之后的全行注释,它们是 IDA 中仅有的不以分号为前缀的注释。在上面的代码段中,➎处的注释即为一段“在前注释”。通过将与某个行相关的地址与该行之后或之前的指令进行比较,即可区分“在前”注释与“在后”注释。

7.2.4 函数注释

通过 函数注释 ,你可以为函数的反汇编代码清单顶部显示的注释分组。前面代码段中➏处显示的注释即为函数注释,其中也包含函数原型。要输入函数注释,首先应突出显示函数顶部的函数名称(➐),然后再输入一段常规注释或可重复注释。可重复函数注释将在调用该函数的任何位置回显。当使用第 8 章将介绍的 SetFunction Type 命令时,IDA 将自动生成函数原型式注释。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文