1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
long base = module.base; long tracePoint = base + 0xE2E4CL;
emulator.getBackend().hook_add_new(new com.github.unidbg.arm.backend.CodeHook() { @Override public void onAttach(UnHook unHook) {}
@Override public void detach() {}
@Override public void hook(Backend backend, long address, int size, Object user) { if (address == tracePoint) { System.out.println("\n************************************************************"); System.out.println(">>> [Critical Trace] 已越过文件读取点 (0x" + Long.toHexString(address) + ")");
UnidbgPointer x0 = emulator.getContext().getPointerArg(0); System.out.println(">>> [Context] X0 (Return Value): " + x0);
byte[] code = emulator.getBackend().mem_read(address, 200);
try (Capstone cs = new Capstone(Capstone.CS_ARCH_ARM64, Capstone.CS_MODE_ARM)) { Capstone.CsInsn[] insns = (Capstone.CsInsn[]) cs.disasm(code, address);
System.out.println(">>> [Disasm] 后续 50 条指令预览:"); for (Capstone.CsInsn insn : insns) { String addrHex = Long.toHexString(insn.getAddress()); System.out.printf(" 0x%s: %s %s%n", addrHex, insn.mnemonic, insn.opStr);
if ("svc".equals(insn.mnemonic)) { System.err.println(" [!] 警告: 发现 SVC 系统调用,可能正在计算 Checksum 或检查调试器"); } if (insn.mnemonic.startsWith("cb") || insn.mnemonic.startsWith("b.")) { System.out.println(" [?] 发现逻辑跳转,可能是校验结果的分支"); } if ("ret".equals(insn.mnemonic)) { System.out.println(" [*] 函数逻辑结束点"); break; } } } catch (Exception e) { System.err.println(">>> 反汇编失败: " + e.getMessage()); } System.out.println("************************************************************\n"); } } }, tracePoint, tracePoint, null);
|