unidbg console debugger 调试技巧

news2024/10/17 7:40:45

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/

打开debug日志

编辑 unidbg-android/src/test/resources/log4j.properties 把 log4j.logger.com.github.unidbg.AbstractEmulator 改为 DEBUG
截图.png

当运行报错时会自动断点,可以看到具体报错的位置、寄存器、机器码等等信息。

[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

这个命令会停止当前所有正在进行的指令、内存读取或写入跟踪。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2211760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lenovo联想 ThinkPad E14 Gen 2,E15 Gen 2 AMD(20T6,20T7,20T8,20T9)原厂Win10系统镜像下载

适用机型:【20T6、20T7、20T8、20T9】 链接:https://pan.baidu.com/s/1AVTvmiIHjafsFw8P7_jMPg?pwdzux5 提取码:zux5 联想原装WIN系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想电脑…

C#实现CRC32算法

CRC32 是一种校验和算法&#xff0c;用于检测消息是否未被修改。 它被广泛使用&#xff1a;例如&#xff0c;计算以太网发送包校验和。 public class CRC32 {private static readonly uint[] Crc32Table new uint[256];static CRC32(){uint i, j;uint crc;for (i 0; i < …

《深度学习》OpenCV 风格迁移、DNN模块 案例解析及实现

目录 一、风格迁移 1、什么是风格迁移 2、步骤 1&#xff09;训练 2&#xff09;迁移 二、DNN模块 1、什么是DNN模块 2、DNN模块特点 1&#xff09;轻量 2&#xff09;外部依赖性低 3&#xff09;方便 4&#xff09;集成 5&#xff09;通用性 3、流程图 4、图像…

软件设计之Redis(1)

软件设计之Redis(1) 路线图推荐&#xff1a; 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷Redis零基础到进阶&#xff0c;最强redis7教程&#xff0c;阳哥亲自带练&#xff08;附redis面试题&#xff09; 资料可以去尚硅谷官网免费领取 学习内容&#xff1a; Redi…

Unity3D 观察者模式

Unity3D 泛型事件系统 观察者模式 观察者模式是一种行为设计模式&#xff0c;通过订阅机制&#xff0c;可以让对象触发事件时&#xff0c;通知多个其他对象。 在游戏逻辑中&#xff0c;UI 界面通常会监听一些事件&#xff0c;当数据层发生变化时&#xff0c;通过触发事件&am…

【JavaSE基础】Java 变量

为什么需要变量 变量是程序的基本组成单位 class Test{public static void main(String[] args){int a 1; //定义一个变量&#xff0c;类型为int&#xff0c;变量名为a&#xff0c;并赋值为1int b 3; //定义另一个变量&#xff0c;类型为int&#xff0c;变量名为b&#xff0…

sqli-labs less-25 and/or绕过

来到less-25 我们可以看到下面有提示&#xff0c;Hint: Your Input is Filtered with following result: 说明本关卡有过滤&#xff0c; 构造 http://192.168.140.130/sq/Less-25/?id1’ 页面报错&#xff0c;从报错可以得知闭合方式为,所以 用注释符&#xff0c;发现注释符…

oracle数据坏块处理(一)-通过rman备份修复

表有坏块时&#xff0c;全表查询会报错&#xff1a; 这时候如果有前面正常的rman备份&#xff0c;那么我们就可以通过rman备份直接对数据文件块做恢复 先对数据文件做个逻辑检查&#xff1a; RMAN> backup check logical VALIDATE DATAFILE EXB_DATA/exb/datafile/cuteinf…

公开课 | 2024最新清华大模型公开课 第3课 神经网络与大模型基础 Part 2

本文由readlecture.cn转录总结。ReadLecture专注于音、视频转录与总结&#xff0c;2小时视频&#xff0c;5分钟阅读&#xff0c;加速内容学习与传播。 大纲 神经网络概述 神经网络的概念 神经网络的应用方式 序列建模与神经网络架构 循环神经网络&#xff08;RNN&#xff09;…

UE5模型导入面板解读

1.Skeletal Mesh&#xff1a; 是一个可以让模型动起来的选项&#xff0c;适用于需要动画的角色或生物。是否勾选&#xff1a;如果导入的是一个需要动画的角色或生物&#xff0c;就勾选 Skeletal Mesh 选项&#xff1b;如果是静态物体&#xff0c;就不勾选。 2.Build Nanite&a…

集合类HashMap,HashTable,ConcurrentHashMap区别?

1.HashMap 简单来说&#xff0c;HashMap由数组链表组成的&#xff0c;数组是HashMap的主体&#xff0c;链表则是主要为了解决哈希冲突而存在的&#xff0c;如果定位到的数组位置不含链表&#xff08;当前entry的next指向null&#xff09;,那么对于查找&#xff0c;添加等操作很…

VS中创建QT项目。

一&#xff0c;安装QT&#xff0c; 重点&#xff1a;在安装QT的时候要安装msvc201x版本的组件&#xff0c; 二 &#xff0c; 安装 qt-vs-tools Index of /development_releases/vsaddin/2.8.1 三。安装 win10sdk&#xff0c;这是因为我的当前电脑是win10的&#xff0c; 安装版…

【逗号绕过】

简介 所以为了避免逗号被过滤&#xff0c;我们来看看如何绕过叭 一、From for 绕过 我们直接看一个题目&#xff1a; id1 页面输出hello user id1 and 11%23 页面返回hello user id1 and 11%23 页面不返回数据符合盲注&#xff0c;并且是一个数字型的sql注入&#xff0c;尝…

13.梯度下降法的代码实战——举足轻重的模型优化算法

引言 通过12.梯度下降法的具体解析——举足轻重的模型优化算法-CSDN博客的学习&#xff0c;我们已经了解到了梯度下降法的整体流程与不同分类。归根结底&#xff0c;我们最终是要使用代码实现梯度下降法。 通过阅读本篇博客&#xff0c;你可以&#xff1a; 1.知晓轮次和批次…

Unity URP 如何实现遮挡显示 (全流程教程)

嗨~~&#xff01;&#xff0c;熊猫老师又来了 &#xff0c;这次为大家分享项目中非常实用的一个技术点&#xff1a;遮挡显示。 老规矩&#xff0c;上才艺&#xff1a; 实现原理 &#xff1a;对模型渲染两次。 第一次&#xff1a; 正常渲染物体&#xff0c;深度测试不通过的情况…

【工具】HTTrack:网站一键克隆下载,实现离线浏览与备份的利器

什么是 HTTrack&#xff1f; HTTrack 是一款用于复制完整网站的开源工具&#xff0c;它可以从服务器下载整个网站的内容&#xff0c;包括 HTML 文件、图像、样式表、脚本等资源。通过这种方式&#xff0c;你可以在离线状态下浏览网站&#xff0c;就像在线一样。 HTTrack 支持…

设备台账管理是什么

设备管理对企业至关重要。比如在电子加工企业&#xff0c;高效的设备管理能减少设备故障&#xff0c;提升生产效率&#xff0c;为企业赢得市场竞争优势。设备台账管理作为设备管理的一个核心部分&#xff0c;起着重要的作用。 让我们一起从本篇文章中探索设备台账管理是什么&a…

[STM32] 简单介绍 (一)

文章目录 1.STM32简介2.ARM3.STM32F103ZET6/STM32F103C8T64.STM32命名规则5.STM32最小系统板6.STM32开发方式7.STM32系统架构8.STM32时钟系统9.STM32中断系统10.STM32定时器 1.STM32简介 STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器&#xff1b; STM32常应用在嵌入式…

【最新华为OD机试E卷-支持在线评测】高矮个子排队(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

基于rk356x u-boot版本功能分析及编译相关(一)

🎏技术驱动源于热爱,祝各位学有所成。 文章目录 uboot的分支是next-dev历史版本v2017-09uboot支持DM框架uboot前级pre-loader支持及引导下级uboot分区支持uboot支持固件格式secure bootuboot编译脚本位置build.shuboot/make.shrkbin仓库uboot的分支是next-dev历史版本v2017-…