disassemble
disassemble
指令會從目前位置進行反組譯。如果有的話
操作說明和呼叫目的地都會加註來源行資訊:
例如:
[zxdb] disassemble
miscsvc.cc:118
▶ 0x20bc1c7aa60a mov dword ptr [rbx + 0x10c], eax
miscsvc.cc:122
0x20bc1c7aa610 movabs rax, -0x5555555555555556
0x20bc1c7aa61a mov qword ptr [rbx + 0xe8], rax
0x20bc1c7aa621 mov qword ptr [rbx + 0xe8], 0x0
0x20bc1c7aa62c mov rdi, qword ptr [rbx + 0xb0]
0x20bc1c7aa633 mov rax, qword ptr [rbx + 0xe8]
0x20bc1c7aa63a mov qword ptr [rbx + 0x20], rax
0x20bc1c7aa63e call 0x20d ➔ std::__2::size<>()
函式
如果您指定地址或符號,disassemble
指令會將其反組譯至
對應的地址或符號。如果您提供函式名稱,
反組完整函式:
[zxdb] disassemble main
miscsvc.cc:88
0x20bc1c7aa000 push rbp
0x20bc1c7aa001 mov rbp, rsp
0x20bc1c7aa004 push rbx
0x20bc1c7aa005 and rsp, -0x20
0x20bc1c7aa009 sub rsp, 0x140
0x20bc1c7aa010 mov rbx, rsp
0x20bc1c7aa013 mov rax, qword ptr fs:[0x10]
...
電腦相對偏移
在某些情況下,你可能會想要根據電腦 (程式計數器) 拆解 相對偏移值
例如,前往 $rip - 0x7
地址的 disassemble
:
[zxdb] di -- -0x7 # Disassemble at the address $rip - 0x7
350 FX_LOGS(FATAL) << "Failed to construct the cobalt app: " << app.status();
351 }
352 inspector.Health().Ok();
353 loop.Run();
0x591e76352b xor edx, edx
0x591e76352d call 0x260fae ➔ async::Loop::Run(async::Loop*, zx::time, bool)
354 FX_LOGS(INFO) << "Cobalt will now shut down.";
▶ 0x591e763532 mov edi, 0x30
0x591e763537 call 0x81ab4 ➔ fuchsia_logging::ShouldCreateLogMessage(fuchsia_logging::LogSeverity)
0x591e76353c mov byte ptr [rbp - 0x1b1], 0x0
0x591e763543 test al, 0x1
0x591e763545 jne 0x2
0x591e763547 jmp 0x74
引數
disassemble
指令可接受下列引數:
--num=<lines>
或-n <lines>
:輸出的行數或指示數。 如果位置是函式名稱,則預設值為函式名稱中的 判斷函式是否達到預期效果如果該地點是地址或符號,預設值為 16。--raw
或-r
:除瞭解碼的操作說明外,再輸出原始位元組。
逐步操作機器操作說明
如要逐步完成機器指示,您可以使用下列 zxdb 指令:
nexti
/ni
:繼續進行下一個指示,但通話時須逐步完成 以及目標架構的操作說明stepi
/si
:僅採用一個機器指令。
例如:
[zxdb] nexti
🛑 main(int, const char**) • main.cc:102
main.cc:99
▶ 0x23f711346233 mov edx, 0x20
0x23f711346238 call 0x35a3a3 ➔ __asan_memcpy
0x23f71134623d mov rdi, qword ptr [rbx + 0x258]
0x23f711346244 call 0x1677 ➔ $anon::DecodeCommandLine
[zxdb] nexti
🛑 main(int, const char**) • main.cc:102
main.cc:99
▶ 0x23f711346238 call 0x35a3a3 ➔ __asan_memcpy
0x23f71134623d mov rdi, qword ptr [rbx + 0x258]
0x23f711346244 call 0x1677 ➔ $anon::DecodeCommandLine
0x23f711346249 mov rdi, qword ptr [rbx + 0x260]
Zxdb 會維護有關最後一個指令是否為組件的資訊 並在命令提示字元中 命中次數。
如要切換至組合語言模式,請使用 disassemble
。
如要切換至原始碼模式,請使用 list
。
regs
regs
指令會顯示最常見的 CPU 暫存器。
例如:
[zxdb] regs
General Purpose Registers
rax 0xfffffffffffffffa = -6
rbx 0x50b7085b
rcx 0x0 = 0
rdx 0x2023de8c87a0
rsi 0x7fffffffffffffff
rdi 0x50b7085b
rbp 0x224bb1e0b950
rsp 0x224bb1e0b928
...
regs
指令可接受下列引數:
--all
或-a
:啟用所有暫存器類別 (而非-e
)。--debug
或-d
:顯示偵錯暫存器。--extended
或-e
:啟用更詳細的標記解碼功能。如此一來 對日常偵錯來說毫無用處的資訊。這個 包含rflags
中的系統層級旗標等資訊 註冊 x64--float
或-f
:列印專屬的浮點暫存器。大多數 若是如此,您應該改用--vector
,因為所有 64 位元 ARM 程式碼,大部分 x64 程式碼會使用向量暫存器做為浮點值。--vector
或-v
:列印向量暫存器。
在運算式中註冊
暫存器可用於變數等「運算式」中。
暫存器的正規名稱為 $reg(register name)
。
如需詳細資訊和範例,請參閱 CPU 註冊。
向量暫存器
regs --vector
指令會根據
設為目前的 vector-format
設定。
使用 get vector-format
查看目前的值。
請使用 set vector-format <new-value>
設定新的向量格式。
支援的值如下:
i8
(帶正負號) 或u8
(無正負號):8 位元整數陣列。i16
(帶正負號) 或u16
(無正負號):16 位元整數陣列。i32
(帶正負號) 或u32
(無正負號):32 位元整數陣列。i64
(帶正負號) 或u64
(無正負號):64 位元整數陣列。i128
(帶正負號) 或u128
(無正負號):128 位元整數陣列。float
:單精度浮點陣列。double
:雙精度浮點陣列。此為預設值。
這個範例會將 vector-format
設為 double
:
[zxdb] set vector-format double
以下範例會傳迴向量暫存器:
[zxdb] regs -v
Vector Registers
mxcsr 0x1fa0 = 8096
Name [3] [2] [1] [0]
ymm0 0 0 0 0
ymm1 0 0 0 3.14159
ymm2 0 0 0 0
ymm3 0 0 0 0
...
向量暫存器也可以像運算式中的陣列一樣使用。
vector-format
設定可控制每個暫存器轉換為陣列的方式
值。
舉例來說,如要顯示 32 位元的低位元數解讀為浮點值
x86 向量註冊 ymm1
:
將
vector-format
設為浮動值:[zxdb] set vector-format float
列印向量註冊器
ymm1
:[zxdb] print ymm1[0] 3.14159
轉換為陣列時,低位元會指派給索引 0,遞增 再開始遷移