当前位置: 首页 > news >正文

问题慢慢解决-通过android emulator调试android kernel-内核条件断点遇到的问题和临时解决方案

起因

在摸索到这个方案之后,mac m1调试aarch64 android kernel最终方案,就准备调试内核了,预备下断点的地方是

b binder_poll
b ep_ptable_queue_proc
b remove_wait_queue

但是由于是android系统,上面三个函数会被频繁的触发,不知道哪次断下的是自己提供的进程触发的,所以准备使用条件断点,只在自己的进程触发下断下。这个条件断点的首要目标是获取aarch kernel的current

观察高版本内核gdb相关代码,目标是获取SP_EL0的值

def get_current_task(cpu):task_ptr_type = task_type.get_type().pointer()if utils.is_target_arch("x86"):var_ptr = gdb.parse_and_eval("&current_task")return per_cpu(var_ptr, cpu).dereference()elif utils.is_target_arch("aarch64"):current_task_addr = gdb.parse_and_eval("$SP_EL0")if((current_task_addr >> 63) != 0):current_task = current_task_addr.cast(task_ptr_type)return current_task.dereference()

困难

狗币google,最新的android emulator使用的qemu版本还是qemu-2.10.0,无法通过gdb获取系统寄存器的值,也就是没办法获取SP_EL0

解决-重编android emulator

重编android kernel

添加CONFIG_GDB_SCRIPTS=y配置,使gdb附加上时,lx-系列命令自动可用

编译android emulator

https://android.googlesource.com/platform/external/qemu/+/emu-master-dev/android/docs/LINUX-DEV.md
https://android.googlesource.com/platform/external/qemu/+/emu-master-dev

下载android emulator并编译

# 1、环境,以及下载源码
sudo apt-get install -y git build-essential python qemu-kvm ninja-build python-pip ccachemkdir $HOME/bin
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > $HOME/bin/repo
chmod 700 $HOME/bin/repo
export PATH=$PATH:$HOME/binmkdir -p emu-master-dev && cd emu-master-dev
repo init -u https://android.googlesource.com/platform/manifest -b emu-master-dev
repo sync -j 8
cd external/qemu# 2、配置ccache# 3、编译
python3 android/build/python/cmake.py --noqtwebengine --noshowprefixforinfo --target linux_aarch64 --ccache auto

这个时候就知道android emulator使用的版本到底有多老了qemu-img -V

修改qemu - gdbstub64

https://stackoverflow.com/questions/46415059/how-to-observe-aarch64-system-registers-in-qemu
https://lists.gnu.org/archive/html/qemu-arm/2020-05/msg00703.html
https://github.com/qemu/qemu/commit/200bf5b7ffe

这里只是做测试,把x1,x2等寄存器替换为了SP_EL0,时间够,以后再改
target/arm/gdbstub64.c


int aarch64_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
{ARMCPU *cpu = ARM_CPU(cs);CPUARMState *env = &cpu->env;// 这里进行测试 beginif (n == 1 || n == 2 || n ==3) {return gdb_get_reg64(mem_buf, env->sp_el[0]);}// 这里进行测试 endif (n < 31) {/* Core integer register.  */return gdb_get_reg64(mem_buf, env->xregs[n]);}switch (n) {case 31:return gdb_get_reg64(mem_buf, env->xregs[31]);case 32:return gdb_get_reg64(mem_buf, env->pc);case 33:return gdb_get_reg32(mem_buf, pstate_read(env));}/* Unknown register.  */return 0;
}

修改完毕后,继续重编android emulator

修改android-goldfish-4.4-dev gdb相关脚本

goldfish/scripts/gdb/linux/cpus.py

task_type = utils.CachedType("struct task_struct")class LxCurrentFunc(gdb.Function):"""Return current task.$lx_current([CPU]): Return the per-cpu task variable for the given CPU
number. If CPU is omitted, the CPU of the current context is used."""def __init__(self):super(LxCurrentFunc, self).__init__("lx_current")def invoke(self, cpu=-1):task_ptr_type = task_type.get_type().pointer()# 我在gdbstub64.c中将x1替换为了SP_EL0# 后期再改,这里只实验是能获取currentcurrent_task_addr = gdb.parse_and_eval("$x1")gdb.write(str(hex(current_task_addr)))if((current_task_addr >> 63) != 0):current_task = current_task_addr.cast(task_ptr_type)return current_task.dereference()

使用

下一个断点,在自己的进程运行起来之后断下,目的:通过lx-ps查看该进程的pid

pwndbg> lx-ps
0xffffffc02a8f7000 2343 AsyncTask #1
0xffffffc02a8f3800 2345 ExecutorUtils
0xffffffc02d4dd400 2367 android_tese  <<<<<<<<<<< 

下断点,测试
我在gdbstub64.c中将x1替换为了SP_EL0,后期再改,这里只实验是能获取current

b binder_poll if ((struct task_struct)(*$x1)).pid == 2367
b ep_ptable_queue_proc if ((struct task_struct)(*$x1)).pid == 2367
b remove_wait_queue if ((struct task_struct)(*$x1)).pid == 2367

在这里插入图片描述

相关文章:

问题慢慢解决-通过android emulator调试android kernel-内核条件断点遇到的问题和临时解决方案

起因 在摸索到这个方案之后&#xff0c;mac m1调试aarch64 android kernel最终方案&#xff0c;就准备调试内核了&#xff0c;预备下断点的地方是 b binder_poll b ep_ptable_queue_proc b remove_wait_queue但是由于是android系统&#xff0c;上面三个函数会被频繁的触发&am…...

社区发现之标签传播算法(LPA)

在Graph领域,社区发现(Community detection)是一个非常热门且广泛的话题,后面会写一个系列,该问题实际上是从子图分割的问题演变而来,在真实的社交网络中,有些用户之间连接非常紧密,有些用户之间的连接较为稀疏,连接紧密的用户群体可以看做一个社区,在风控问题中,可…...

【前端素材】推荐优质后台管理系统Dashy平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…...

MFC 配置Halcon

1.新建一个MFC 工程&#xff0c;Halcon 为64位&#xff0c;所以先将工程改为x64 > VC 目录设置包含目录和库目录 包含目录 库目录 c/c ->常规 链接器 ->常规 > 链接器输入 在窗口中添加头文件 #include "HalconCpp.h" #include "Halcon.h"…...

xss-跨站脚本攻击漏洞

前备知识&#xff1a; Cookie和Session是Web开发中用于维持用户状态、跟踪用户会话的核心技术&#xff0c;它们的主要目的是在无状态的HTTP协议基础上实现有状态的用户交互。 **Cookie**&#xff1a; - Cookie是一种由服务器发送到客户端&#xff08;通常是用户的浏览器&#x…...

在MFC对话框中嵌入web网页时事件失效问题

2010-04-20 日志 在MFC对话框中嵌入web网页时&#xff0c;网页初始化中添加事件无效 document.body.onkeydown function () {//onkeydown"keydownbody()" 不能激发alert(event.keyCode);if(event.keyCode 27)//VK_ESCAPE //String.fromcharcode(A);{if (external…...

【Leetcode】235. 二叉搜索树的最近公共祖先

文章目录 题目思路代码结果 题目 题目链接 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度…...

python 基础语法及保留字

编码 默认情况下&#xff0c;Python 3 源码文件以 UTF-8 编码&#xff0c;所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码&#xff1a; # -*- coding: cp-1252 -*-上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码&#xff0c;对应适合语…...

Parade Series - NVR Stat

获取文件夹占用空间信息 DIR %NVRHOME% /W /SDIR %NVRHOME% /s | tail -n2 | sed s/,//g | awk {if(NR1){key"Used";}else{key"Free";};sum$3/(1024*1024);unit"MB";if(sum^>1024){sumsum/1024;unit"GB";}printf("{\"Ty…...

【shell脚本实战学习笔记】#2

场景描述 你负责一个Web应用的运维工作&#xff0c;该应用部署在一组Linux服务器上。你需要编写一个Shell脚本来自动化以下任务&#xff1a; 检查Web服务器进程&#xff1a; 确保Web服务器&#xff08;例如Apache或Nginx&#xff09;正常运行。如果没有运行&#xff0c;则尝试…...

docker 安装nacos 一脚shell脚本

要创建一个用于安装Nacos的Docker的Shell脚本&#xff0c;你可以按照以下步骤进行。这个脚本会执行以下操作&#xff1a; 拉取Nacos的Docker镜像。创建一个Docker容器并映射必要的端口。设置Nacos的环境变量。如果需要&#xff0c;可以持久化存储数据到本地目录。 以下是一个…...

mysql的隔离级别,和实现

参考链接 https://xiaolincoding.com/mysql/transaction/mvcc.html#%E4%BA%8B%E5%8A%A1%E7%9A%84%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB%E6%9C%89%E5%93%AA%E4%BA%9B 事务特性&#xff08;ACID&#xff09; 原子性&#xff08;Atomicity&#xff09;&#xff1a; 事务是原子的&…...

Linux的信号

Linux的信号是一种用于进程之间通信的机制。它们用于向进程发送通知&#xff0c;告知进程发生了某种事件或请求进程执行某个操作。信号可以由内核、其他进程或进程自身发送。 信号的作用有以下几个方面&#xff1a; 通知进程某个事件的发生&#xff0c;如进程的终止、挂起、恢…...

Spring数据脱敏实现

在当今的数字化时代&#xff0c;数据安全和个人隐私保护变得日益重要。为了遵守各种数据保护法规&#xff0c;如欧盟的GDPR&#xff08;通用数据保护条例&#xff09;&#xff0c;企业在处理敏感信息时需要格外小心。数据脱敏是一种常见的技术手段&#xff0c;用于隐藏敏感数据…...

Java核心-核心类与API(4)

话接上回&#xff0c;继续核心类与API的学习&#xff0c;最后介绍一下Object类以及与数学、日期/时间有关的类&#xff0c;就结束该部分的学习了&#xff0c;其他的根据需要自行了解。 一、Object类 1、概述 Object 是 Java 类库中的一个特殊类&#xff0c;也是所有类的父类…...

【C语言】详解计算机二级c语言程序题

文章目录 前言资料相关程序题 一&#xff08;字符串&#xff09;程序题 二&#xff08;数组&#xff09;程序题 三&#xff08;基础&#xff09;程序题 四&#xff08;结构体&#xff09;程序题 五&#xff08;结构体&#xff09;程序题 六&#xff08;基础&#xff09; 前言 …...

限流算法

下面对常见的限流算法进行讨论。目前&#xff0c;常用的限流算法主要有三种&#xff1a;计数器法、滑动窗口算法、漏桶算法和令牌桶算法。下面分别介绍其原理。 1. 计数器法 计数器法是通过计数对到来的请求进行选择性处理。如系统限制一秒内最多有X个请求&#xff0c;则在该…...

备战蓝桥杯 Day10(背包dp)

01背包问题 1267&#xff1a;【例9.11】01背包问题 【题目描述】 一个旅行者有一个最多能装 M&#xfffd; 公斤的背包&#xff0c;现在有 n&#xfffd; 件物品&#xff0c;它们的重量分别是W1&#xff0c;W2&#xff0c;...,Wn&#xfffd;1&#xff0c;&#xfffd;2&#…...

Sora 使用教程,新手小白可用

Sora 使用教程&#xff0c;新手小白可用 参考文章&#xff1a;Sora 使用教程&#xff0c;OpenAI 的文生视频模型 为了在激烈的行业竞争中保持领先地位&#xff0c;OpenAI 在 2024 年 2 月 15 日发布了其革命性的文本至视频转换模型——Sora。这个先进的工具能够将文本描述转化…...

【洛谷千题详解】P1031 均分纸牌

目录 题目描述 思路点拨 AC代码 题目描述 题目网址&#xff1a;[NOIP2002 提高组] 均分纸牌 - 洛谷 有 N 堆纸牌&#xff0c;编号分别为 1,2,……,N。每堆上有若干张&#xff0c;但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌&#xff0c;然后移动。 移牌规则为&a…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...