freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

安卓逆向-从环境搭建到动态调试apk
2021-08-23 17:04:53

前言

此章节整理了Android开发、逆向工具的安装及使用,涉及到环境配置、流量抓取、静态调试和动态调试。
涉及的环境:win10、JDK、adb、ndk、android studio3.6、Android Killer、jadx-gui、smalidea-0.05.zip、IDA7.0、DDMS、雷电模拟器、一部root过后的安卓手机等
Android逆向工具下载地址:
https://www.androiddevtools.cn/

一、Android Studio动态调试

1、思路简介

Android Studio通过导入反编译出来的完整的的Smali代码!然后设置好调试所需的条件,设置断点。
断点准备好的条件后,连接模拟器运行待调试的APK的应用程序,然后执行程序的流程运行到smali代码的时候,断点处会触发一个断点会自动断下来,从而可以进一步分析和调试,整个程序会非常的清晰。

2、jdk、adb、ndk安装

安装android studio前首先需要安装jdk8、adb、ndk。

1、jdk下载地址(安装过程略过)

https://www.androiddevtools.cn/

image-20210812184812321

2、adb安装

下载

https://www.androiddevtools.cn/

image-20210812185426578

解压,配置环境变量

image-20210812185545188

验证adb安装,cmd直接执行adb

image-20210812185627813

3、安装ndk

下载

https://www.androiddevtools.cn/

image-20210812185737033

安装解压,配置环境变量

image-20210812185931763

验证安装是否成功

ndk-build

image-20210812190120344

3、安装android Studio

https://www.androiddevtools.cn/android-studio.html

请安装3.6版本的,因为接下来smalidea插件,高版本是不支持的

image-20210812204403201

双击运行安装

image-20210811005626892

image-20210811005857106

image-20210811005931113

image-20210811005957258

image-20210811010017679

一直next就可以了

点击Newproject

image-20210811010712432

image-20210811010829846

image-20210811010946036

进来之后会自动下载一些东西

image-20210811011000626

4、配置Android Studio

1、创建一个新项目

等在下载完成后,简单打开一个apk程序项目,开始设置

image-20210811015157881

选择smalidea-0.05.zip这个压缩包,点击ok

image-20210811015239564

然后重启程序即可

image-20210811015632970

2、导入一个项目

Android Killer下载地址

https://www.androiddevtools.cn/

image-20210813093632934

使用killer反编译apk,并打开反编译的文件夹

image-20210812205305698

image-20210812205337291

将project放在android studio打开

image-20210812205623430

image-20210812205650888

image-20210812205706185

一直Next,就可以了

打开之后选择project,,及时我们常见的格式了

image-20210812205807706

3、配置导入的新项目

基于smali目录root权限

image-20210812210019812

配置之后显示绿色小孔

image-20210812210120625

配置JDK版本等信息

image-20210812210150387

image-20210812210328117

设置项目启动项

image-20210812210409359

image-20210812210436789

image-20210812210603735

因为项目还没有启动安卓模拟器或者连接真机,所以不显示联调的设备

image-20210812210731512

插入真机,使用adb调试真机

查看连接的设备列表

adb devices

image-20210812211135681

获取真机的shell

adb shell

image-20210812211230263

如果有找不到设备,获取不到shell等其他异常的话,请执行以下操作

adb kill-server 
adb start-server 
adb remount
意思是重启adb

现在可以看到联调的设备了

image-20210812211457448

5、android studio 动态测试apk

1、真机安装apk

adb install E:\test.apk (尽量不要用中文)

image-20210812214154630

2、android studio联动模拟器

为了方便截图,我上安卓模拟器上操作,启动apk

image-20210812214411246

在studio界面,开始调试

点击第二个红色标记处,弹出进程框,我们看到我们运行的注册机这个apk的包名

image-20210812214510179

选择包名,点击ok。联动成功

image-20210812214814858

3、破解apk

目标

因现在apk输入任何数据都是显示无效用户名或注册码,目标是破解出有效点注册码

image-20210812215123922

首先使用adb通过静态获取当前界面调用的文件

adb shell dumpsys activity top

image-20210812220431950

找到对应的文件

image-20210812220504815

向下拉,我们看到了一个checkSN()方法,里面有userName

image-20210812220705346

我们这里需要使用jadx这个工具,它可以将apk反编译为java代码

https://www.androiddevtools.cn/
https://github.com/skylot/jadx/releases/tag/v1.2.0

image-20210812221017805

image-20210812221050081

将apk包拉到jadx中,并找到对用的文件

image-20210812221204145

开始分析java代码

首先看到三个变量

btn : 按钮
sn:激活码
username:用户名

image-20210812221403633

接下来找我们刚刚发现的checkSN()方法,首先第一个标红地方username不能为空,第二个是username、sn长度不能为空,sn参数不能为空。

image-20210812221656847

md5加密计算

image-20210812223541598

与sn(注册码)对比

image-20210812223619666

那我们直接在方法处开始断点,并留意equalsIgnoreCase()方法

右击57之后的空白处,出现一个红色的图标,就代表的此处放置断点

image-20210813010208448

开启动联动

image-20210813011551224

image-20210813011609241

在apk中随便输入用户名,注册码要16位置,因为不是16为将会结束此方法。

image-20210813011702165

自动断点添转到const/4 v7,0x0处

image-20210813012031279

按F8或者点击按钮进行单步执行

F9:跳转到下一个断电
F8:单步执行
点击红色箭头指向的step over按钮(图中咱们按了两次让 i =1,看的明显一些),程序向下执行一行(若是当前行有方法调用,这个方法将被执行完毕返回,而后到下一行。就是说不会进入到调用的其余方法中去)。
F7:单步执行
点击红色箭头指向的step into按钮,程序向下执行一行。跟step over不一样的是:若是该行有方法调用且为自定义方法,则运行进入自定义方法(不会进入官方类库的方法)。

image-20210813012619809

经过10下左右,执行到了for处,并且显示出hexstr变量的值等信息

image-20210813012947019

开始for循环,遍历hexstr的值,偶数位的字符添加sb便是,hexstr共32位置,那需要执行16轮for循环(32下F8),for结束,得出sb的最终结果

image-20210813014245429

根据前面java中分析得出,sb和sn进行equalsIgnoreCase()对比,sb的值就是注册码。

复制出来sb

8307f13bd2bc3010

image-20210813014858780

结束调用或者暂停调试,测试以下,(这里名字不能改,因为“digest.update(userName.getBytes());”)sb是通过用户名计算到的:

image-20210813015135310

4、另一种android studio 联动安卓的方法

配置启动项

image-20210813015450929

查看安卓设备的进程信息

adb shell ps

PID : ID
PPID:父进程的ID
VSIZE:进程的虚拟内存大小kb单位RSS:实际占用的大小
WCHAN:进程睡眠的函数名称PC:电脑内核函数名称
Name:包名

image-20210813015644453

根据PID,进行转发端口进行调试

adb forward tcp:8007 jdwp:2802

tcp:android studio配置启动项的端口
jdwp:安卓设备进程的PID

image-20210813015951244

点击绿色小虫,开启联调,重复上面测试方面即可。

image-20210813020042434

二、IDA安装动态调试

1、IDA安装

此次安装IDA 7.0

双击运行exe文件

image-20210814002317725

填写密码

image-20210814002301587

创建桌面图标

image-20210814002423558

image-20210814002438910

运行32位的IDA

image-20210814154214955

New:打开一个新项目

Go:跳过打开项目,先进入IDA

2、IDA功能点介绍

1、打开so文件

将使用killer 将apk反编译为smali代码,打开armeabi-v7a文件夹

image-20210814013954374

将文件夹下面的so文件,拉到ida打开

显示两种打开方式:ELF就是so的文件格式;Binary file是二进制文件格式

这里使用ElF去解析打开

image-20210814014056414

首先可以看到IDA是递归下降的反汇编工具

image-20210814014348896

地址在逐渐变大~

2、导航条

对so文件里面的数据进行解析:最顶端有颜色条

image-20210814014534941

蓝色	(表示常规的指令函数)
1、深蓝:用户写的函数编译后的代码区。
2、浅蓝:编译器自己添加的函数,像启动函数,异常函数等。

黑色 (节与节之间的间隙) 禁区,不存在任何数据

银白色	(数据内容)

粉色	(表示外部导入符号)	有关输入表的一些数据信息

暗黄色	(表示IDA未识别的内容)

3、IDA主界面

图形化显示

按下空格,提示是否通过图形化显示

image-20210814015224172

image-20210814154621366

默认开启的六个窗口

image-20210814015416054

View三种反汇编视图:文本视图、图表视图、路径视图
Hex View:十六进制窗口
Imports:导入函数窗口
Struceures:结构体窗口
Exports:导入函数窗口
Enums:枚举窗口
strings:字符串窗口

开启关闭窗口配置处

image-20210814015835058

4、常用功能及快捷键

空格键:切换文本视图与图表视图
ESC:返回上一个操作地址
G:搜索地址和符号
N:对符号进行重命名
冒号:常规注释
分号:可重复注释
Alt+M:添加注释
Ctrl+M:添加标签
Ctrl+S:查查看段的信息

代码数据切换
C	代码
D	数据
A	ascii字符串
U	解析成未定义的内容
X	查看交叉应用
F5	查看伪代码
Alt+T	搜索文本
Alt+B	搜索十六进制

C无法识别栈堆是否已经平衡,所以无法识别函数结束

3、环境安装调试

首先插入真机,使用adb查看设备列表

adb devices

image-20210814154739015

adb shell #获取真机shell权限

image-20210814154804148

首先来到dbgsrv文件夹目录

E:\IDA7.0\dbgsrv

image-20210814155214554

利用adb将android_server文件传送到真机下指定的文件目录内

adb push E:\IDA7.0\dbgsrv\android_server data/local/tmp

image-20210814155335583

可以去android目录下面去看看是否成功

adb devices
adb shell
su
cd /data/local/tmp/
ls -al

image-20210814155601486

赋予777权限给android_server

chmod 777 android_server

image-20210814155659807

然后直接运行android_server

./android_server

image-20210814155741801

安卓启动的端口是23946

开启后再次打开另外一个CMD窗口,将安卓上面的23946端口转发到win电脑上

adb forward tcp:23946 tcp:23946

image-20210814160750956

接下接下来就是要调试APK安装到真机上

adb install E:\IDA7.0\test\javandk1.apk

image-20210814161526810

image-20210814161655114

4、Debugger调试

开始Dbugger模式调试:开始IDA32位

点击Go

image-20210814161806828

选择Remote ARMLinux/Android debugger

image-20210814161925959

填写hostname 和 刚刚配置的转发过来的端口

image-20210814162006947

选择好后就会出现真机上的进程列表

image-20210814162106722

然后运行刚刚安装的javandk1.apk

image-20210814162157897

CTRL+F查询刚刚运行的包名ndk

image-20210814162259187

这里查询不到是因为进程实在选择Remote ARMLinux/Android debugger之后打开的,这里重新打开一下Remote ARMLinux/Android debugger

image-20210814162427486

选择进程,点击OK,将进入此进程,需要加载一会

image-20210814162512897

image-20210814162546482

这时还需要加载模块列表:进入Debugger options

image-20210814162726407

勾选:库挂起入口点,开始接受,加载卸载!

表示程序在运行中只要涉及到进程的入口点,涉及到线程的开始和结束,涉及到库的加载和卸载都可以让程序进行debugger(断点)操作

image-20210814163006267

可以开始运行动态调式,点击左上角的运行或者按F9都可以

image-20210814163132493

5、普通调式模式(真机环境)

1、服务上传+端口转发

这里将android_server改名为yunjian,为什么要改名

因为在调试的时候,apk等安全机制会对android_server等关键名称进行检测,最好修改一下

adb push E:\IDA7.0\dbgsrv\android_server data/local/tmp
adb shell
su
cd /data/local/tmp/
mv android_server yunjian
chmod 777 yunjian
./yunjian

image-20210814163754917

开一个新窗口,将安卓下面的23946端口转发到win上

adb forward tcp:23946 tcp:23946

image-20210814164146160

这里的端口转发必须和前面真机上运行的yunjian进程端口一致,如何修改端口呢

./dayu -p1~65535

这时候已经完成端口转发了,接下来进行挂起程序~

2、挂起程序

挂起程序(需要程序的包名+类名)

打开jadx查看apk的包名和类名,activity元素中有LAUNCHER代表第一个调用

android:name="com.example.javandk1.MainActivity"

image-20210814164727143

挂起程序命令

adb shell am start -D -n com.example.javandk1/.MainActivity

image-20210814174654727

这时候真机会出现一个窗口

3、运行DDMS

打开DDMS,找到真机运行的com.example.javandk1进程

image-20210814165208105

image-20210814172046525

打开后会观察到调试进程中有红色小虫子就是开启了debug调试

注意:adb和ddms版本要一致,如果不一致,启动ddms时,将会杀死刚刚adb shell进程,导致端口断开。

4、运行IDA

这里和调试debugger一样的方法打开即可

image-20210814165742831

image-20210814182433625

配置Debugger setup

image-20210814182512879

安卓模拟器环境运行:

image-20210814182556747

可能会看到这种报错,没找到原因,我们真机即可

真机选择运行

image-20210814182740236

显示Running就是在运行中,完成配置IDA

5、IDA加载so

回到DDMS查看调试程序的端口号 8600

image-20210814183142190

执行命令,IDA将加载so文件

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8600

image-20210814183300014

可以看到红小虫变成绿小虫了

在IDA下面看到加载了so文件,libjavandk1.so

image-20210814183514528

加载进来so后,在IDA右上角有个Modules,查询一下so文件

image-20210814183705446

三 、总结

现在对此章节使用到的工具进行总结

JDK:需使用jDK1.8B版本的,JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。
adb:全称为Android Debug Bridge,就是起到调试桥的作用。通过adb我们可以在Eclipse中方便通过DDMS来调试Android程序,说白了就是debug工具。
ndk:是Android的一种开发工具包,快速开发C、 C++的动态库,并自动将so和应用一起打包成 APK即可通过 NDK在 Android中 使用 JNI与本地代码(如C、C++)交互。
android studio:是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的Android 开发工具用于开发和调试。(此处安装的为3.6版本)
Android Killer:集Apk反编译、Apk打包、Apk签名,编码互转,ADB通信(应用安装-卸载-运行-设备文件管理)等特色功能于一 身,支持logcat日志输出,语法高亮,基于关键字(支持单行代码或多行代码段)项目内搜索,可自定义外部工具;吸收融汇多种工具功能与特点,打造一站 式逆向工具操作体验,大大简化了用户在安卓应用/游戏修改过程中的各类繁琐工作。
jadx-gui:是一款JAVA反编译工具。一个简单轻巧的 DEX 到 Java 反编译器,可让您导入 DEX,APK,JAR 或 CLASS 文件并将其快速导出为 DEX 格式。如果您是 Android 开发人员,您可能会理解,没有适当的软件帮助,就无法构建,测试或调试应用程序。幸运的是,如今有大量的产品可以帮助您实现快速,便捷的结果。
smalidea-0.05:,Android Studio插件,用来给 smali 下断点,单步调试。	
IDA:安卓逆向工具
DDMS:全称是Dalvik Debug Monitor Service,它为我们提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、接收SMS、虚拟地理坐标等等。
# android安全 # Android # IDA # DeBug # Smali
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录