使用組合語言

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

  1. vector-format 設為浮動值:

    [zxdb] set vector-format float
    
  2. 列印向量註冊器 ymm1

    [zxdb] print ymm1[0]
    3.14159
    

轉換為陣列時,低位元會指派給索引 0,遞增 再開始遷移