我们之前已经讨论过主要的伪代码格式选项,但还有一个选项可以影响输出,那就是用于打印伪代码中数字的基数。
★
在位置计数系统中,基数或底数是用于表示数字的唯一数字的数量,包括数字零。例如,对于十进制/十进制系统(今天最常用的系统),基数(底数)是十,因为它使用从0到9的十个数字。(来自维基百科)
”
自动基数
默认的基数设置是0,意味着“自动”。
自动基数
在此设置下,反编译器对检测为无符号的值使用十六进制基数,而对其他值使用十进制。例如,在下面的截图中,CContextMenuManager::AddMenu()
的参数以十六进制显示,因为函数原型指定最后一个参数类型为“unsigned int”,而LoadStringA()
的参数以十进制显示,因为反编译器使用了一个猜测的原型,类型为_DWORD
,其行为类似于有符号类型。
“好看”的数字
在某些情况下,即使是有符号数字,反编译器也可能使用十六进制,如果这样会使数字看起来“好看”。目前(截至IDA 7.7),使用以下规则:
-
匹配2n和2n-1(典型的位掩码)的值以十六进制打印。 -
64位值如果高32位不是全零或全一,则以十六进制打印,除非它们在十进制表示中以超过3个零结尾。 -
-1以十进制打印。
手动更改基数
您可以随时通过上下文菜单或热键更改伪代码中特定数字的表示形式。
要在十进制和十六进制之间切换,请使用H热键。八进制默认仅通过上下文菜单可用,但可以为动作名称hx:Oct
添加自定义热键。
设置首选基数
通过更改反编译器选项中的默认基数,您可以让反编译器始终对所有未明确设置基数的数字使用十进制(10)或十六进制(16)。请注意,在这种情况下,“好看”数字检测将被禁用。
要更改所有新数据库的默认值,请在hexrays.cfg
中设置值DEFAULT_RADIX,如上一篇文章中所述。
更多文章
立即关注【二进制磨剑】公众号
原文始发于微信公众号(二进制磨剑):IDA 技巧(83) 反编译器选项:默认基数
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论