unidbg console debugger 调试技巧
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/
打开debug日志
编辑 unidbg-android/src/test/resources/log4j.properties 把 log4j.logger.com.github.unidbg.AbstractEmulator 改为 DEBUG
当运行报错时会自动断点,可以看到具体报错的位置、寄存器、机器码等等信息。
[03:20:11 438] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:364) - emulate RX@0x121daa74[libc.so]0x1aa74 started sp=unidbg@0xe4fff700
[03:20:11 457] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:402) - emulate RX@0x121daa74[libc.so]0x1aa74 finished sp=unidbg@0xe4fff700, offset=18ms
[03:20:11 458] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:364) - emulate RX@0x121daa98[libc.so]0x1aa98 started sp=unidbg@0xe4fff700
[03:20:11 458] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:402) - emulate RX@0x121daa98[libc.so]0x1aa98 finished sp=unidbg@0xe4fff700, offset=0ms
[03:20:11 458] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:364) - emulate RX@0x121daaac[libc.so]0x1aaac started sp=unidbg@0xe4fff700
[03:20:11 459] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:402) - emulate RX@0x121daaac[libc.so]0x1aaac finished sp=unidbg@0xe4fff700, offset=0ms
[03:20:11 459] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:364) - emulate RX@0x121daae8[libc.so]0x1aae8 started sp=unidbg@0xe4fff700
[03:20:11 459] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:402) - emulate RX@0x121daae8[libc.so]0x1aae8 finished sp=unidbg@0xe4fff700, offset=0ms
[03:20:11 460] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:364) - emulate RX@0x121dab24[libc.so]0x1ab24 started sp=unidbg@0xe4fff700
[03:20:11 460] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:402) - emulate RX@0x121dab24[libc.so]0x1ab24 finished sp=unidbg@0xe4fff700, offset=0ms
[03:20:11 460] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:364) - emulate RX@0x121dab60[libc.so]0x1ab60 started sp=unidbg@0xe4fff700
[03:20:11 460] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:402) - emulate RX@0x121dab60[libc.so]0x1ab60 finished sp=unidbg@0xe4fff700, offset=0ms
[03:20:11 460] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:364) - emulate RX@0x121dab74[libc.so]0x1ab74 started sp=unidbg@0xe4fff700
[03:20:11 460] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:402) - emulate RX@0x121dab74[libc.so]0x1ab74 finished sp=unidbg@0xe4fff700, offset=0ms
[03:20:11 461] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:364) - emulate RX@0x121dab88[libc.so]0x1ab88 started sp=unidbg@0xe4fff700
[03:20:11 461] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:402) - emulate RX@0x121dab88[libc.so]0x1ab88 finished sp=unidbg@0xe4fff700, offset=0ms
[03:20:11 461] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:364) - emulate RX@0x121dabc4[libc.so]0x1abc4 started sp=unidbg@0xe4fff700
[03:20:11 461] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:402) - emulate RX@0x121dabc4[libc.so]0x1abc4 finished sp=unidbg@0xe4fff700, offset=0ms
[03:20:11 462] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:364) - emulate RX@0x121dabd8[libc.so]0x1abd8 started sp=unidbg@0xe4fff700
[03:20:11 462] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:402) - emulate RX@0x121dabd8[libc.so]0x1abd8 finished sp=unidbg@0xe4fff700, offset=0ms
[03:20:11 462] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:364) - emulate RX@0x121dabec[libc.so]0x1abec started sp=unidbg@0xe4fff700
[03:20:11 478] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:402) - emulate RX@0x121dabec[libc.so]0x1abec finished sp=unidbg@0xe4fff700, offset=16ms
[03:20:11 479] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:364) - emulate RX@0x120de110[libc++.so]0x3e110 started sp=unidbg@0xe4fff700
[03:20:11 485] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:402) - emulate RX@0x120de110[libc++.so]0x3e110 finished sp=unidbg@0xe4fff700, offset=6ms
[03:20:11 485] DEBUG [com.github.unidbg.AbstractEmulator] (AbstractEmulator:364) - emulate RX@0x1201bd68[libGameVMP.so]0x1bd68 started sp=unidbg@0xe4fff700
[03:20:11 485] WARN [com.github.unidbg.arm.AbstractARM64Emulator] (AbstractARM64Emulator$1:66) - Read memory failed: address=0x10a2, size=8, value=0x0
debugger break at: 0x1201bd68 @ Runnable|Function64 address=0x1201bd68, arguments=[]
>>> x0=0x0 x1=0x1229e9b8 x2=0x1 x3=0x1 x4=0x0 x5=0x1 x6=0x0 x7=0x0 x8=0xe2 x9=0x3002 x10=0x0 x11=0x1 x12=0x3 x13=0x12071018 x14=0x12071028
>>> x15=0x1 x16=0x12298910 x17=0x0 x18=0x17 x19=0x0 x20=0x0 x21=0x0 x22=0x0 x23=0x0 x24=0x0 x25=0x0 x26=0x0 x27=0x0 x28=0x0 fp=0x0
>>> q0=0x0(0.0) q1=0x0(0.0) q2=0x363038353620323120323938(5.540897692487247E-48, 4.491697924E-315) q3=0x0(0.0) q4=0x0(0.0) q5=0x40100401401004014010040140100401(4.003911019303815, 4.003911019303815) q6=0x0(0.0) q7=0x1f100000000000001f1(2.456E-321, 2.456E-321) q8=0x0(0.0) q9=0x0(0.0) q10=0x0(0.0) q11=0x0(0.0) q12=0x0(0.0) q13=0x0(0.0) q14=0x0(0.0) q15=0x0(0.0)
>>> q16=0x51f100000000000041f1(8.3403E-320, 1.0364E-319) q17=0x0(0.0) q18=0x51f100000000000041f1(8.3403E-320, 1.0364E-319) q19=0x0(0.0) q20=0x0(0.0) q21=0x0(0.0) q22=0x0(0.0) q23=0x0(0.0) q24=0x0(0.0) q25=0x0(0.0) q26=0x0(0.0) q27=0x0(0.0) q28=0x0(0.0) q29=0x0(0.0) q30=0x0(0.0) q31=0x0(0.0)
LR=unidbg@0x7ffff0000
SP=0xe4fff700
PC=RX@0x1201bd68[libGameVMP.so]0x1bd68
nzcv: N=0, Z=0, C=1, V=0, EL0, use SP_EL0
[libGameVMP.so 0x1bd64] [880200f0] 0x1201bd64: "adrp x8, #0x1206e000"
=> *[libGameVMP.so*0x1bd68]*[08e147f9]*0x1201bd68:*"ldr x8, [x8, #0xfc0]" [0x10a2] => mem_read address=0x10a0, size=8
[libGameVMP.so 0x1bd6c] [890200f0] 0x1201bd6c: "adrp x9, #0x1206e000"
[libGameVMP.so 0x1bd70] [29d947f9] 0x1201bd70: "ldr x9, [x9, #0xfb0]"
[libGameVMP.so 0x1bd74] [ea071f32] 0x1201bd74: "orr w10, wzr, #6"
[libGameVMP.so 0x1bd78] [ab035cf8] 0x1201bd78: "ldur x11, [x29, #-0x40]"
[libGameVMP.so 0x1bd7c] [6a0100b9] 0x1201bd7c: "str w10, [x11]"
[libGameVMP.so 0x1bd80] [2a0140b9] 0x1201bd80: "ldr w10, [x9]"
[libGameVMP.so 0x1bd84] [0c0140b9] 0x1201bd84: "ldr w12, [x8]"
[libGameVMP.so 0x1bd88] [4d050051] 0x1201bd88: "sub w13, w10, #1"
[libGameVMP.so 0x1bd8c] [4d7d0d1b] 0x1201bd8c: "mul w13, w10, w13"
[libGameVMP.so 0x1bd90] [ee030032] 0x1201bd90: "orr w14, wzr, #1"
[libGameVMP.so 0x1bd94] [ad010e0a] 0x1201bd94: "and w13, w13, w14"
[libGameVMP.so 0x1bd98] [bf010071] 0x1201bd98: "cmp w13, #0"
[libGameVMP.so 0x1bd9c] [ed179f1a] 0x1201bd9c: "cset w13, eq"
[libGameVMP.so 0x1bda0] [9f290071] 0x1201bda0: "cmp w12, #0xa"
[libGameVMP.so 0x1bda4] [eea79f1a] 0x1201bda4: "cset w14, lt"
基本调试操作
- c: 继续执行,直到遇到下一个断点。
- n: 单步跳过,即执行当前指令并停在下一条指令处。
- s 或 si: 单步进入,执行当前指令并进入函数调用内部。
- bt: 显示当前的堆栈回溯信息。
如果你想执行指定数量的指令(比如 5 条),可以使用 s5
如果你想执行汇编指令,直到遇到某个 BL 或 BLR 调用指令,可以使用 s(bl)
执行汇编直到特定位置,可以设置断点(b 命令),设置一个临时断点,执行直到 0x120038c4
b0x120038c4
c
内存
1. 读取内存
读取 0x1206e000 开始的 8 个字节内存
m0x1206e000 8
2. 修改内存中的一个字节
假设你想修改地址 0x1000 处的字节为 0xFF
wb0x1000 0xFF
3. 修改内存中的一个短整型(2字节)
假设你想将地址 0x1002 处的短整型值修改为 0x1234
ws0x1002 0x1234
4. 修改内存中的一个整型(4字节)
假设你想将地址 0x1004 处的整型值修改为 0xABCDEF12
wi0x1004 0xABCDEF12
5. 修改内存中的一个长整型(8字节)
假设你想将地址 0x1008 处的长整型值修改为 0x1234567890ABCDEF
wl0x1008 0x1234567890ABCDEF
6. 修改内存中的bytes
如果你想将地址 0x1010 处的内容修改为字节数组 0x01 0x02 0x03 0x04,可以使用 wx 命令
wx0x1010 01020304
7. 反汇编
在指定地址 0x1201bd68 进行反汇编
d0x1201bd68
寄存器
1. 写寄存器
修改寄存器 x8 的值为 0x1206e000
wx8 0x1206e000
2. 读寄存器
查看寄存器 x8 的值
mx8
打补丁
使用 p 命令在当前程序计数器(PC)处执行汇编指令。 假设你想在当前 PC 地址处执行一条 MOV X0, #1 的指令
p mov x0, #1
这条指令会修改寄存器 X0 的值为 1。补丁指令是立即执行的。
trace
trace 命令用于跟踪程序执行的汇编指令或内存的读取与写入操作。它可以帮助你调试程序,查看执行了哪些指令或者对哪些内存地址进行了操作。
1. trace [begin end]
这个命令用于跟踪从指定开始地址到结束地址之间的指令执行情况。当你设置这个范围后,所有在该范围内执行的指令都会被跟踪并输出。
假设你想跟踪从地址 0x1000 到 0x2000 之间的指令执行
trace 0x1000 0x2000
执行程序后,所有在该范围内的指令都会被输出到控制台。
2. traceRead [begin end]
traceRead 用于跟踪指定范围内的内存读取操作。当程序访问该范围内的内存时,读取的内存地址和内容都会被跟踪并输出。
假设你想跟踪内存地址范围 0x3000 到 0x4000 的读取操作
traceRead 0x3000 0x4000
当程序访问这些地址时,你会看到读取的地址和读取的内容。
3. traceWrite [begin end]
traceWrite 用于跟踪指定范围内的内存写入操作。类似 traceRead,但它跟踪的是写操作,包括写入的内存地址和写入的内容。
跟踪从 0x5000 到 0x6000 范围内的写操作
traceWrite 0x5000 0x6000
每当程序写入这个地址范围的内存时,会输出写入的地址和写入的值。
4. 停止 trace
要停止任何 trace 跟踪,可以在控制台中执行 stop 命令。
stop
这个命令会停止当前所有正在进行的指令、内存读取或写入跟踪。