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]
...
PC 相对偏移量
在某些情况下,您可能需要根据 PC(程序计数器)进行反汇编 相对偏移量。
例如,对于地址 $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
设置用于控制每个寄存器如何转换为数组
值。
例如,要显示解读为
x86 矢量寄存器 ymm1
:
将
vector-format
设置为浮点数:[zxdb] set vector-format float
输出矢量寄存器
ymm1
:[zxdb] print ymm1[0] 3.14159
转换为数组时,将低位分配给索引 0,递增 。