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

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

一. 前言

逆向分析中常用的分析方法有:静态分析、动态调试、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,功能是飞航的强大。

  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值