数值系统#
常用的数值系统有(二进制) 、decimal (十进制) 和 hexadecimal (十六进制) 。
Binary(二进制)
:仅以 0 和 1 字符表示数字。
Decimal(十进制)
:使用 0~9 共 10 个字符表示数字。
Hexadecimal(十六进制)
:使用 0~9 加上 A~F 共 16 个字符表示数字。
在 Python 交互中输入 0x45, 由于开头的 0x 将会被解释为十六进制数。直接按回车可将 0x45 转换为十进制数,输出结果为 69。
如果需要将十进制转换为十六进制数,可以使用 hex () 函数。
Bin () 函数将其他进制的数字转换为二进制数。输出结果是 1000101。开头的 0b 代表这是一个二进制数,
十进制和十六进制转换为二进制数
二进制数转换为十进制和十六进制
所有直接输入的数字在按回车后会转换为十进制数输出,通过 Python 函数hex()
和bin()
可以转换为十六进制或者二进制数输出。
为了方便起见,通过菜单VIEW-CALCULATOR
, 可以打开 IDA 内置的转换器。
该转换器能够同时显示数字转换为各种进制的结果。也会显示数字对应的ASCII字符
。例如0x45
对应的字符是E
。
几乎所有逆向工作都要涉及十六进制数,那么问题是如何用 32 位十六进制表示一个负数。在一个 32 位二进制数中,第一个比特 (bit) 上的 0 用来表示正数,1 来表示负数。
在计算器中将 0x7fffffff 再加上 1, 最高位变成 1, 其他位变成了 0。
IDA 转换器在输入的时候默认都是正数,除非我们在数字前面加上 “-” 号。
最大负数 - 1 对应十六进制 0xffffffff
,最小负数 0x80000000
。如果不考虑正负,所有的数从0到0xffffffff
都是正值。考虑正负,0x0到0x7fffffff
是所有的正数,0xffffffff到0x80000000
是所有的负数。
ASCII 码字符#
http://www.asciima.com/ascii/12.html
十六进制转字符#
chr()
IDA 中的搜索功能#
- 下一条可执行指令 (NEXT CODE) : 这个功能用于搜索下一条可执行指令 (CODE) 。如果中间有一部分不是可执行指令,这部分将会被跳过。
- 下一处数据(Next data):这个功能用于搜索下一处数据。
- 下一处已探查项 (NEXT EXPLORED) : 搜索下一处可执行指令或者数据。
- 下一处未探查项 (NEXT UNEXPLORED) : 搜索下一处非执行指令且非数据。
搜索硬编码值 (SEARCH INMEDIATE) : 该功能用于搜素可执行指令以及数据项中的常量。
打开新窗口,显示搜索后的内容
搜素文本 (TEXT) : 搜索输入的文本,支持正则表达式。如果读者选择了单个搜索,还需要使用下一处文本 (NEXT TEXT) 来继续搜索。
搜索结果视图
搜索字节序列 (SEQUENCE OF BYTES) : 搜索输入的字节序列。
搜索结果视图
点击相应的搜索结果,ida 会进入到反汇编视图中。
搜索非完整函数 (NOT FUNCTION) : 搜索下一处不完整的函数。
004013D7 地址上单独的 RET 指令无法识别为函数。有时候,因为一些非法指令导致有些函数无法被 IDA 识别出来。