安卓逆向之----常用动态调试方法

一. 前言

逆向分析中常用的分析方法有:静态分析、动态调试、HOOK等。动态调试的好处是:1)可以在调试的过程中知道参数或者局部变量的值以及变化过程,2)可以快速履清代码运行的先后顺序,验证自己的想法是否正确。安卓中需要调试的代码有dex中代码和so中代码,对于dex层java代码调试,本人常用的是dex Java代码用JEB调试和IDEA + Smalidea调试,so层代码是用IDA附加调试。下面就这三种方法进行一一介绍。

二. 调试介绍

命令:adb jdwp 用于查看Android手机中可调式的进程。

1. JEB调试

先安装好JEB,并配置好Java环境。JEB调试并不需要事先将apk转换成smali代码,只需要打开和安装到安卓手机上对应的apk文件即可。不过前提是让想要调试的apk支持被调试,这一点对后面的两种调试方法也是要符合才行。至于怎么支持调试?1)apk的Manifest.xml文件的Application的属性中包含android:debuggable=“true” ;2)或者第一条不满足时,安卓手机的default.prop文件中ro.debuggable=1时也行,mprop工具可用于修改该属性值。用JEB调试时,得把Eclipse和Android Studio关掉,不然会占用adb端口。
做好前期准备后,下面正式进入调试环节:
(1)打开JEB,并打开一个apk文件,安卓手机打开相应的应用,并且连接好电脑:


调试时,需要在smali界面才能单步(可以发现在Java代码界面单步是无效的),但是在调试过程中可以随时切换看源码,单步时切回去即可,调试快捷键直接点击debugger查看,不同版本会有些不同。
(2)开始附加调试
点击Debugger——start,然后弹出选择附加进程界面,如下图:


(3)查看变量的值
调试时,变量的值都是地址,即使是String类型也是,所以需要将类型转成String,选中类型,然后Ctrl + 输入String,不过很不稳定,很多时候都不成功,查找变量的值在用smalidea + idea调试时很容易观察。

2.smalidea + idea调试

idea直接到官网下载一个社区版(不收费版,够我们调试用了)安装,然后下载smalidea插件(github地址:https://github.com/JesusFreke/smali/wiki/smalidea
下载地址:https://bitbucket.org/JesusFreke/smali/downloads),在IDEA界面中选择:File——Setting——Plugin——Install plugin fromdisk…,选择下载好的smalidea插件,安装即可。

环境配好了,接下来介绍调试的步骤:
(1)找到要调试的应用的相应的apk文件,可以是从手机里面导出来,高版本的系统导出来的apk可能是包含odex文件的,或者是vdex文件的,所以遇到时,得需要将这些文件转成包含dex的apk文件。
(2)通过apktool工具将apk反编译成smali文件,然后用IDEA打开smali文件所在的总目录。

(3)初次调试时,需要配置:Run——Edit Configurations,点击左上角+,然后选择remote,然后打开DDMS(ddms工具在安装好Android的Eclipse中会自带,也可网上下载),查看需要调试的包名对应的端口,替换掉8700,保存后,Run——debug unnamed,即能实现调试。



(4)查看变量的值
smali+Idea调试时,查看变量很稳定,如下:

3.IDA调试so

IDA调试so时,可以在打开相应的so文件下调试,也可以在不带so文件的情况下调试,二者都需要附加,常用的是后者,现在直接说明后者的步骤。
(1)启动IDA的调试服务

根据getprop ro.product.cpu.abi,查看CPU型号,我的是armeabi-v7a,所以选择android_server。

adb push android_server /data/local/tmp
adb shell chmod 777 /data/local/tmp/android_server
adb shell su
#:/data/local/tmp/android_server -p3000
之后另一cmd窗口中映射指定的端口:
adb forward tcp:3000 tcp:3000

上面最后一行中,5566是给服务指定的端口,默认是23946,也可以改成其它的。必须是root权限下执行这个命令,不然调试进程只会显示两个,不是所有的包名对应的进程。
(2) 打开IDA开始附加
IDA一般会有32位和64位,在经验中,64位IDA调试32位的so会出问题,32位的IDA调试64位的so目前没怎么试过,但最好是位数对应好,然后启动相应位数的IDA调试服务。
选择Debugger——Attach——Remote ARMLinux/Android Debugger;


到这里就可以下断点调试了,如下图,一般会把要调试的so用另一个IDA打开,找到代码偏移,然后加上此时调试时模块的首地址就是我们想调试的地址,下断点,然后F9便可。



下断点地址:B3D30000 + 7B04 = B3D37B04

有的时候会调试Jni_Onload这个函数,但是这个函数很早就调用了,用上面的步骤是没法调试到这个函数的,这是可以尝试先用JDB调试启动apk,然后用IDA附加,最后用JDB接管调试。JDB是java调试器 ,包含在 SDK 中。 该调试器通过 jdb 命令启动。操作步骤如下:
(1)在cmd窗口中用:adb shell am start -D -n 包名/Activity名 命令调试启动应用;
(2)启动IDA的服务,映射端口;
(3)IDA附加进程;
(4)jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
port可以换成ddsm中查看到的相应报名的端口;
(5)之后在IDA中调试同上面非启动调试一样操作了。
注意: 如果在调试 arm 32 位的代码时,代码没有调成对应的 thumb 或 arm 指令集时(Alt + G - T 1是 thumb,T 0 是 arm),可能会报错。例如以下代码运行到断点所在代码时,原本该是 thumb 指令,却是按照arm指令集反编译的,所以就报错了。

4. 怎么修改ro.debuggable的值为1

(1)通过mprop文件修改
工具下载地址:wpvsyou/mprop
使用方法:

getprop ro.product.cpu.abi #获取cpu型号,然后push对应版本的mprop到/data/local/tmp
adb push mprop /data/local/tmp
adb shell chmod 777 /data/local/tmp/mprop
# 进人adb shell,再如下操作
/data/local/tmp/mprop ro.debuggable 1
stop;start # 重启adbd 进程

该方法在手机重启后会失效。之前在nuxus手机中使用时有生效,但在pixel手机中没有生效,目前还不清楚原因。

(2)借助magisk临时修改ro.debuggable的值为1,重启会失效
magisk是一款非常强大的工具,但安装起来似乎没有太简单,不过在google原生手机中安装还是挺简单的,直接修改通过修改boot.img文件再重刷的方式即可安装,boot.img可以在对应版本的刷机包中可获取,或者另一个已经root的且内核版本相同的手机中提取。另外也可以通过三方recovery的方式安装。
安装完magisk后,原先非root手机就已经具备root功能了,然后修改ro.debuggable的方式如下:

adb shell #adb进入命令行模式
su #切换至超级用户
magisk resetprop ro.debuggable 1
stop;start; #一定要通过该方式重启,之后使用 adb jdwp 可查看到可调式的进程id

该方法在手机重启后会失效。只能说,Magisk的功能太强大了。
参考: Android修改ro.debuggable 的四种方法

三. 技术总结

(1)JEB和smalidea+IDEA用于安卓Java层调试,二者的各自优点主要如下:
1)JEB调试时方便随时看JAVA代码,不过单步时还得跳回smali代码界面;
2)smalidea+IDEA调试时相对较稳定,并且查看变量比较方便。
(2)IDA主要用于调试安卓的so文件,当然IDA也可用于调试Linux中so和Mac中so,功能是飞航的强大。

安卓逆向分析中常用动态调试方法总结相关推荐

  1. [系统安全] 二十三.逆向分析之OllyDbg动态调试复习及TraceMe案例分析

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  2. 安卓逆向_13 --- AndroidStudio + Smalidea 动态调试 smali 代码【APK可调试】、gradle 配置

    教我兄弟学Android逆向04 动态调试smali代码:https://www.52pojie.cn/thread-658865-1-1.html From:Android Studio 3.6 调 ...

  3. 统计计量 | 统计学中常用的数据分析方法汇总

    来源:数据Seminar本文约10500字,建议阅读15+分钟 统计学中常用的数据分析方法汇总. Part1描述统计 描述统计是通过图表或数学方法,对数据资料进行整理.分析,并对数据的分布状态.数字特 ...

  4. [安卓逆向]android adb常用命令及使用案例

    [安卓逆向]android adb常用命令 一.调试相关 1.开启adb服务 adb start-server 2.关闭adb服务 adb stop-server 3.列出所有连接的设备 adb de ...

  5. 逆向路由器固件之动态调试

    原文地址:http://xdxd.love/2016/09/20/逆向路由器固件之动态调试/ 本文根据devttyS0的教程Exploiting Embedded Systems – Part 2和E ...

  6. linux性能监控工具perf,Linux性能分析中常用的工具perf介绍

    今天小编要跟大家分享的文章是关于Linux性能分析中常用的工具perf介绍.系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化.性能剖析的目标是寻找性能瓶 ...

  7. 20145307陈俊达_安卓逆向分析_Xposed的hook技术研究

    20145307陈俊达_安卓逆向分析_Xposed的hook技术研究 引言 其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌 ...

  8. 光滑噪声数据常用的方法_数据挖掘中常用的数据清洗方法

    是新朋友吗?记得先点蓝字关注我哦- 数据挖掘中 常用的数据清洗方法 在数据挖掘过程中,数据清洗主要根据探索性分析后得到的一些结论入手,然后主要对四类异常数据进行处理,分别是缺失值(missing va ...

  9. X猫免费小说安卓逆向分析

    x猫免费小说安卓逆向分析 难度(♥) 文章目录 x猫免费小说安卓逆向分析 难度(♥) 1. 查壳 2. 抓包分析 3. sign 1. Frida-rpc 1. 查壳 我这边使用的是ApkTool, ...

最新文章

  1. type=file的未选择任何文件修改_PDF文件怎样输入到CAD图纸中?懂得这个功能可以快速实现...
  2. svg做自定义折线图表
  3. Google Gears 体验(2):本机 web 服务器
  4. 十天冲刺---Day8
  5. 以撩妹为例,5分钟让你秒懂深度学习!
  6. python repair修复功能_详解Python修复遥感影像条带的两种方式
  7. mysql删除端口配置文件_完美解决phpstudy安装后mysql无法启动(无需删除原数据库,无需更改任何配置,无需更改端口)直接共存...
  8. 电脑登录斗鱼显示无法连接服务器,斗鱼电脑版登录不了怎么办
  9. 86年版五笔和98年版五笔区别
  10. 基于AFD驱动的进程流量控制
  11. mysql的建表赋权_mysql创建用户并赋权
  12. 香港中大完成全球首个多专科单孔微创机械人手术临床研究
  13. 学术英语理工(第二版)Unit3课文翻译
  14. HTML-内嵌框架-00
  15. TextOut 字符串输出
  16. 数字化转型——技术转型推动业务转型(第一次讨论稿)
  17. 程序猿的困惑:这一切都是技术惹的祸?
  18. KVO实现机制 如何自己动手实现 KVO
  19. c语言输入函数 scanf 详解 - 解决常见输入问题
  20. 丹纳赫集团在中国本土研发并生产的首台流式细胞分选仪正式交付

热门文章

  1. Java用户输入圆半径求圆面积
  2. 二进制 正负数加减法 计算INT_MIN - 1=INT_MAX
  3. 声明中AutoEventWireup、Codebehind、Inherits分别表示什么意思?
  4. C++知识整理系列(三)—— constexpr常量表达式
  5. 基于Python3+Scapy的数据包流量特征批量分析工具
  6. VC++分别使用WinExec、CreateProcess、ShellExecute和ShellExecuteEx来启动程序(附源码)
  7. 前端入门: 前端开发主要有哪些层? 语言和功能分别是什么
  8. 音乐之声——midi制作原理
  9. 运算放大器---增益带宽积(GBW)
  10. 《京东大鼓——庄子扇坟》(董湘昆)(唱词文本)