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

使用IDA Pro动态调试Android APP

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

关于 android_server

android_server 是 IDA Pro 在 Android 设备上运行的一个调试服务器。

通过在 Android 设备上运行android_server,IDA Pro 可以远程调试 Android 应用程序,并实现断点设置、内存查看、寄存器检查等功能。

IDA Pro 通过 adb(Android Debug Bridge)将调试命令发送给 android_server,然后 android_server 在 Android 设备上执行这些命令,并将结果返回给 IDA Pro。

调试环境准备

把 IDA安装目录/dbgsrv 下的 android_server64 push 到设备 /data/local/tmp 路径下

adb push "D:\App\IDA_Pro\IDA_Pro_7.7\dbgsrv\android_server64" /data/local/tmp/as

image.png

进入 adb shell 启动 androd server

# 获取 root 权限
su
# 给 android server 增加执行权限
chmod +x /data/local/tmp/as# 通过指定端口启动 android_server,假设你要使用端口 12345
/data/local/tmp/as -p 12345

关于获取手机 root 权限和开启全局调试可以参考下面两篇文章:

  • 小米手机解除BL锁&刷机&root

  • 修改android系统ro.debuggable使全局可调试

将 adb 12345 端口转发到本地 12345 端口

adb forward tcp:12345 tcp:12345

附加到正在运行的进程

在调试器类型中选择【Remote ARM Linux/Android debugger】
image.png

调试设置 Host=127.0.0.1,Port=12345
image.png

选择你要动态调试的 app 进程
点击 Search(Alt + T) 可以通过搜索关键字查找进程
image.png

启动前附加进程

首先,通过 Androird Killer 反编译 apk ,在 AndroidManifest.xml 中搜索 android.intent.action.MAIN 找到 app 的启动入口
截图.png

或者进入 adb shell 通过下面的命令查找最近启动的 Activity

dumpsys activity activities | grep "Hist" | head -n 5* Hist #0: ActivityRecord{1088151 u0 com.cyrus.example/.MainActivity t66}keysPaused=false inHistory=true visible=true sleeping=false idle=true mStartingWindowState=STARTING_WINDOW_SHOWN
* Hist #0: ActivityRecord{3afa4ee u0 com.android.launcher3/.lineage.LineageLauncher t56}keysPaused=false inHistory=true visible=false sleeping=false idle=true mStartingWindowState=STARTING_WINDOW_NOT_SHOWN
* Hist #0: ActivityRecord{f256169 u0 com.shizhuang.duapp/.modules.home.ui.HomeActivity t58}

以调试模式启动 app

adb shell am start -D -n com.shizhuang.duapp/com.shizhuang.duapp.modules.home.ui.SplashActivity

启动DDMS(sdk\tools\monitor.bat)
截图.png

解决jdk版本过高导致的DDMS启动失败问题:

  • 下载jdk8的zip文件

  • 解压jdk到本地

  • 在 monitor.bat 前面加上下面的代码(强制使用jdk8)


- @echo off- REM 设置 JDK 路径- set JAVA_HOME=D:\App\jdk-8REM 更新 PATH 变量
set PATH=%JAVA_HOME%\bin;%PATH%REM 验证 JDK 设置
echo JAVA_HOME is set to %JAVA_HOME%
java -version

IDA 附加到你要动态调试的 app 进程
截图.png
现在你就可以做一下在 APP 启动前需要完成的一些操作了,比如在 APP 启动前 Hook 某个函数。

创建一个 jdb_connect.bat,使用 jdb 命令恢复程序执行

@echo off
REM 设置使用 JDK8
set JAVA_HOME=D:\App\jdk-8REM 更新 PATH 变量
set PATH=%JAVA_HOME%\bin;%PATH%REM 验证 JDK 设置
echo JAVA_HOME is set to %JAVA_HOME%
java -versionREM 使用 jdb 命令恢复程序执行
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

截图.png

使用Python代码调试进程

下面脚本代码是基于IDA Pro 7.7.220118,不同版本之间可能会有差异。

IDA6到IDA7 api变化对比:https://hex-rays.com/products/ida/support/ida74_idapython_no_bc695_porting_guide.shtml

1. 调用函数来列出加载的 .so 文件

File -> Script command,然后运行下面的 Python 脚本

import idaapidef list_loaded_so_files():# 获取所有段(模块)信息seg_qty = idaapi.get_segm_qty()if seg_qty == 0:print("No segments loaded.")returnprint("Loaded .so files:")# 遍历所有段,获取段信息for i in range(seg_qty):seg = idaapi.getnseg(i)if seg:seg_name = idaapi.get_segm_name(seg)# 如果段名以 .so 结尾,则打印模块信息if seg_name.endswith(".so"):seg_start = seg.start_easeg_end = seg.end_easeg_size = seg_end - seg_startprint(f"Name: {seg_name}, Base: {hex(seg_start)}, Size: {seg_size}")# 调用函数来列出加载的 .so 文件
list_loaded_so_files()

image.png

2. hook dlopen函数

Hook dlopen 函数并打印出加载的库

import idaapi
import idcclass DlopenHook(idaapi.IDB_Hooks):def __init__(self):idaapi.IDB_Hooks.__init__(self)def dbg_bpt(self, tid, ea):# 当断点被触发时,打印库信息print(f"Breakpoint hit at: {hex(ea)}")# 获取 dlopen 的参数esp = idc.get_reg_value('esp')# 假设库名称在栈上参数位置 + 4lib_name_addr = esp + 4lib_name = idc.get_strlit_contents(lib_name_addr)if lib_name:print(f"dlopen called with: {lib_name.decode('utf-8')}")else:print("dlopen called with unknown library")return 0def main():# 获取 dlopen 函数的地址dlopen_addr = idc.get_name_ea_simple("dlopen")if dlopen_addr == idc.BADADDR:print("dlopen function not found.")return# 设置断点idaapi.add_bpt(dlopen_addr)print(f"Breakpoint set at dlopen: {hex(dlopen_addr)}")# 实例化钩子并添加到 IDA Prohook = DlopenHook()hook.hook()# 运行主函数
main()

断点调试

在调试过程中,你可以使用以下命令来控制程序的执行:

  • Step Into (F7):进入当前行调用的函数内部。

  • Step Over (F8):跳过当前行,执行到下一行。

  • Run (F9):继续运行程序,直到下一个断点或程序结束。

image.png

解决端口占用问题

如果在启动 android server 时提示端口占用

/data/local/tmp/as -p 12345IDA Android 64-bit remote debug server(ST) v7.7.27. Hex-Rays (c) 2004-2022
0.0.0.0:12345: bind: Address already in use

列出占用端口的进程

lsof | grep 12345as        12679       root    3u     IPv4                          0t0     246861 TCP :12345->:0 (LISTEN)
as        12679       root    4u     IPv4                          0t0     523893 TCP :12345->:43865 (CLOSE_WAIT)

强制停止占用端口的进程

kill -9 12679

现在,重新启动 android server 就可以了

相关文章:

使用IDA Pro动态调试Android APP

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 关于 android_server android_server 是 IDA Pro 在 Android 设备上运行的一个调试服务器。 通过在 Android 设备上运行android_server,IDA Pro …...

JS中的for...in和for...of有什么区别?

你好,我是沐爸,欢迎点赞、收藏、评论和关注。 在 JavaScript 中,for...in 和 for...of 是两种用于遍历数组(或其他可迭代对象)的循环语句,但它们之间存在显著的差异。 一、遍历数组 for…in const arr …...

【C++篇】引领C++模板初体验:泛型编程的力量与妙用

文章目录 C模板编程前言第一章: 初始模板与函数模版1.1 什么是泛型编程?1.1.1 为什么要有泛型编程?1.1.1 泛型编程的优势 1.2 函数模板的基础1.2.1 什么是函数模板?1.2.2 函数模板的定义格式1.2.3 示例:通用的交换函数输出示例&am…...

在react中 使用redux

1.安装redux npm install reduxjs/toolkit react-redux 2.创建切片模块化数据 在Src目录下创建store目录,创建moude目录 创建tab.js import { createSlice } from reduxjs/toolkit; const tabSlice createSlice({name: tab,initialState: {Collapse: false,},re…...

计算机毕业设计python+spark知识图谱房价预测系统 房源推荐系统 房源数据分析 房源可视化 房源大数据大屏 大数据毕业设计 机器学习

《PythonSpark知识图谱房价预测系统》开题报告 一、研究背景与意义 随着城市化进程的加速和房地产市场的不断发展,房价成为影响人们生活质量的重要因素之一。准确预测房价不仅有助于政府制定科学的房地产政策,还能为开发商提供市场参考,同时…...

Spring-bean的生命周期-终篇

阶段8:Bean属性设置阶段 属性设置阶段分为3个小的阶段 实例化后阶段Bean属性赋值前处理Bean属性赋值 实例化后阶段 这里也有spring给我们预留了扩展,就是实现InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法,开发…...

Kotlin 枚举和 when 表达式(六)

导读大纲 1.1 表示和处理选择: Enums和when1.1.1 声明枚举类和枚举常量1.1.2 使用 when 表达式处理枚举类 1.1 表示和处理选择: Enums和when 在本节中,我们将以在 Kotlin 中声明枚举为例,介绍 when 结构 when可以被视为比 Java 中 switch 结构更强大、更常用的替代品 1.1.1 …...

数字范围按位与

优质博文:IT-BLOG-CN 题目 给你两个整数left和right,表示区间[left, right],返回此区间内所有数字 按位与 的结果(包含left、right端点)。 示例 1: 输入:left 5, right 7 输出:…...

WebRTC编译后替换libwebrtc.aar时提示找不到libjingle_peerconnection_so.so库

Loading native library: jingle_peerconnection_so 问题原因:编译的时候只编译了armeabi-v7a的版本,但是应用程序是arm64-v8a,所以无法运行 解决方法:更新编译脚本,加上arm64-v8a进行编译 ./tools_webrtc/android/bu…...

Nature Electronics |无感佩戴的纤维基电子皮肤(柔性半导体器件/柔性健康监测/电子皮肤/柔性传感/纤维器件)

英国剑桥大学Yan Yan Shery Huang课题组,在《Nature Electronics 》上发布了一篇题为“Imperceptible augmentation of living systems with organic bioelectronic fibres”的论文,第一作者为王文宇博士(Wenyu Wang),论文内容如下: 一、 摘要 利用电子技术对人类皮肤和…...

深入剖析Docker容器安全:挑战与应对策略

随着容器技术的广泛应用,Docker已成为现代应用开发和部署的核心工具。它通过轻量级虚拟化技术实现应用的隔离与封装,提高了资源利用率。然而,随着Docker的流行,其安全问题也成为关注焦点。容器化技术虽然提供了良好的资源隔离&…...

后端技术打怪升级之路

记录后端技术打怪升级之路,如下是个人总记的主要技术栈,仅供参考! 备注: 同名文章一同步发表于个人网站及微信公众号 个人网站 工藤新一的技术小窝...

Leetcode 3296. Minimum Number of Seconds to Make Mountain Height Zero

Leetcode 3296. Minimum Number of Seconds to Make Mountain Height Zero 1. 解题思路2. 代码实现 题目链接:3296. Minimum Number of Seconds to Make Mountain Height Zero 1. 解题思路 这一题的思路的话我们采用的是一个二分法的思路,找到一个最大…...

计算机毕业设计之:基于深度学习的路面检测系统(源码+部署文档+讲解)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

测试面试题:接口自动化测试流程?

1、测试用例编写:根据接口的需求和功能,编写相应的测试用例。测试用例应包括正常、边界和异常等各种情况下的测试。 2、准备测试数据:根据测试用例的要求,准备相应的测试数据。数据可以通过手动输入、数据库查询、文件导入等方式进…...

Golang面试题

在Golang(也称为Go语言)工程师的面试中,可能会遇到各种技术性和概念性的问题。 一、基础部分 Golang 中 make 和 new 的区别? 共同点:两者都用于分配内存。不同点: make 专为 slice、map 和 channel 设计,返回初始化后的(非零)值。new 分配内存并返回指向该内存的指针…...

《飞机大战游戏》实训项目(Java GUI实现)(设计模式)(简易)

目录 一、最终实现后,效果如下。 (1)简单介绍本游戏项目(待完善) (2)运行效果图(具体大家自己可以试) 初始运行情况。 手动更换背景图。 通过子弹攻击敌机,累…...

计算机毕业设计 基于 Hadoop平台的岗位推荐系统 SpringBoot+Vue 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

【数据结构与算法】LeetCode:二分查找

文章目录 二分查找二分查找搜索插入位置 (Hot 100)x 的平方根搜索二维矩阵(Hot 100)在排序数组中查找元素的第一个和最后一个位置 (Hot 100)搜索旋转排序数组 (Hot 100)寻找旋转排序…...

专题·大模型安全 | 生成式人工智能的内容安全风险与应对策略

正如一枚硬币的两面,生成式人工智能大模型(以下简称“生成式大模型”)在助力内容生成的同时也潜藏风险,成为虚假信息传播、数据隐私泄露等问题的温床,加剧了认知域风险。与传统人工智能(AI)相比…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来&#xf…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

docker 部署发现spring.profiles.active 问题

报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息&#xff0…...