數值系統#
常用的數值系統有(二進制) 、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 識別出來。