在 IDA 的反汇编中,您可能经常观察到乍一看奇怪且神秘的名称:sub_73906D75、loc_40721B、off_40A27C 等等。
在 IDA 的术语中,它们被称为虚拟名称。
当汇编语法需要名称但没有合适的可用名称时,例如输入文件没有调试信息(即它已被删除),或者引用调试信息中不存在的位置时,将使用它们。
这些名称实际上并不存储在数据库中,而是由 IDA 在打印列表时动态生成。
虚拟名称前缀
虚拟名称由类型相关的前缀和通常与地址相关的唯一后缀组成。
IDA 中使用以下前缀:
-
sub_,指令,子程序(函数)开始 -
locret_,返回指令 -
loc_,指令,其他类型的指令 -
off_,数据,包含一个偏移(指针)值 -
seg_,数据,包含段地址值 -
asc_, 数据,字符串文字的开头 -
byte_,数据,1 字节 -
word_,数据,2 字节,16 位 -
dword_,数据,4 字节,32 位 -
qword_,数据,8 字节,64 位 -
byte3_,数据,3 字节 -
xmmword_,数据,128 位 -
ymmword_,数据,256 位 -
packreal_,数据,packed real -
flt_,浮点数据,32 位 -
dbl_,浮点数据,64 位 -
tbyte_,浮点数据,80 位 -
stru_,结构体 -
custdata_,自定义数据类型 -
algn_,对齐指令 -
unk_,未探索(未定义、未知)字节
由于 IDA 以特殊方式处理前缀,因此它们是保留的,不能在用户定义的名称中使用。
如果您尝试使用这样的名称,您会从 IDA 收到错误:
警告:无法重命名字节,因为该名称具有保留的前缀
一种可能的解决方法是在开头添加下划线,以便前缀不同。
但如果您想删除现有名称并让 IDA 再次使用虚拟名称,只需将其删除(重命名为空字符串)即可。
名称后缀
默认后缀是虚拟名称所附加的项目的线性(也称为有效)地址。
然而,这并不是唯一的可能性。
通过使用“选项”>“名称表示...”对话框,您可以选择不同的内容。
虚拟名称表示对话框
前半部分的选项在处理分段程序(例如 16 位 DOS 软件)时特别有用;您可以看到段及其内部的偏移量,而不是全局线性地址。
因此,例如,当目标位于另一个段中时,它是显而易见的。
DOS 程序使用“段名称和距段基址的偏移量”表示。
其他前缀
除了虚拟名称之外,IDA 中还使用其他两种自动生成的名称:
-
堆栈变量 (var_) 和参数 (arg_)。 -
从文本生成的字符串文字名称(例如“Exception”的 aException)
堆栈前缀是硬编码的且不可配置,但后者可以在“选项”>“常规...”的“字符串”选项卡中进行配置。
与虚拟名称不同,这些名称存储在标记为自动生成的数据库中,因此它们的前缀不被视为保留,您可以在自定义名称中使用它们。
原文始发于微信公众号(二进制磨剑):IDA 技巧 (34)Dummy names
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论