前言
此章节整理了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/
2、adb安装
下载
https://www.androiddevtools.cn/
解压,配置环境变量
验证adb安装,cmd直接执行adb
3、安装ndk
下载
https://www.androiddevtools.cn/
安装解压,配置环境变量
验证安装是否成功
ndk-build
3、安装android Studio
https://www.androiddevtools.cn/android-studio.html
请安装3.6版本的,因为接下来smalidea插件,高版本是不支持的
双击运行安装
一直next就可以了
点击Newproject
进来之后会自动下载一些东西
4、配置Android Studio
1、创建一个新项目
等在下载完成后,简单打开一个apk程序项目,开始设置
选择smalidea-0.05.zip这个压缩包,点击ok
然后重启程序即可
2、导入一个项目
Android Killer下载地址
https://www.androiddevtools.cn/
使用killer反编译apk,并打开反编译的文件夹
将project放在android studio打开
一直Next,就可以了
打开之后选择project,,及时我们常见的格式了
3、配置导入的新项目
基于smali目录root权限
配置之后显示绿色小孔
配置JDK版本等信息
设置项目启动项
因为项目还没有启动安卓模拟器或者连接真机,所以不显示联调的设备
插入真机,使用adb调试真机
查看连接的设备列表
adb devices
获取真机的shell
adb shell
如果有找不到设备,获取不到shell等其他异常的话,请执行以下操作
adb kill-server
adb start-server
adb remount
意思是重启adb
现在可以看到联调的设备了
5、android studio 动态测试apk
1、真机安装apk
adb install E:\test.apk (尽量不要用中文)
2、android studio联动模拟器
为了方便截图,我上安卓模拟器上操作,启动apk
在studio界面,开始调试
点击第二个红色标记处,弹出进程框,我们看到我们运行的注册机这个apk的包名
选择包名,点击ok。联动成功
3、破解apk
目标
因现在apk输入任何数据都是显示无效用户名或注册码,目标是破解出有效点注册码
首先使用adb通过静态获取当前界面调用的文件
adb shell dumpsys activity top
找到对应的文件
向下拉,我们看到了一个checkSN()方法,里面有userName
我们这里需要使用jadx这个工具,它可以将apk反编译为java代码
https://www.androiddevtools.cn/
https://github.com/skylot/jadx/releases/tag/v1.2.0
将apk包拉到jadx中,并找到对用的文件
开始分析java代码
首先看到三个变量
btn : 按钮
sn:激活码
username:用户名
接下来找我们刚刚发现的checkSN()方法,首先第一个标红地方username不能为空,第二个是username、sn长度不能为空,sn参数不能为空。
md5加密计算
与sn(注册码)对比
那我们直接在方法处开始断点,并留意equalsIgnoreCase()方法
右击57之后的空白处,出现一个红色的图标,就代表的此处放置断点
开启动联动
在apk中随便输入用户名,注册码要16位置,因为不是16为将会结束此方法。
自动断点添转到const/4 v7,0x0处
按F8或者点击按钮进行单步执行
F9:跳转到下一个断电
F8:单步执行
点击红色箭头指向的step over按钮(图中咱们按了两次让 i =1,看的明显一些),程序向下执行一行(若是当前行有方法调用,这个方法将被执行完毕返回,而后到下一行。就是说不会进入到调用的其余方法中去)。
F7:单步执行
点击红色箭头指向的step into按钮,程序向下执行一行。跟step over不一样的是:若是该行有方法调用且为自定义方法,则运行进入自定义方法(不会进入官方类库的方法)。
经过10下左右,执行到了for处,并且显示出hexstr变量的值等信息
开始for循环,遍历hexstr的值,偶数位的字符添加sb便是,hexstr共32位置,那需要执行16轮for循环(32下F8),for结束,得出sb的最终结果
根据前面java中分析得出,sb和sn进行equalsIgnoreCase()对比,sb的值就是注册码。
复制出来sb
8307f13bd2bc3010
结束调用或者暂停调试,测试以下,(这里名字不能改,因为“digest.update(userName.getBytes());”)sb是通过用户名计算到的:
4、另一种android studio 联动安卓的方法
配置启动项
查看安卓设备的进程信息
adb shell ps
PID : ID
PPID:父进程的ID
VSIZE:进程的虚拟内存大小kb单位RSS:实际占用的大小
WCHAN:进程睡眠的函数名称PC:电脑内核函数名称
Name:包名
根据PID,进行转发端口进行调试
adb forward tcp:8007 jdwp:2802
tcp:android studio配置启动项的端口
jdwp:安卓设备进程的PID
点击绿色小虫,开启联调,重复上面测试方面即可。
二、IDA安装动态调试
1、IDA安装
此次安装IDA 7.0
双击运行exe文件
填写密码
创建桌面图标
运行32位的IDA
New:打开一个新项目
Go:跳过打开项目,先进入IDA
2、IDA功能点介绍
1、打开so文件
将使用killer 将apk反编译为smali代码,打开armeabi-v7a文件夹
将文件夹下面的so文件,拉到ida打开
显示两种打开方式:ELF就是so的文件格式;Binary file是二进制文件格式
这里使用ElF去解析打开
首先可以看到IDA是递归下降的反汇编工具
地址在逐渐变大~
2、导航条
对so文件里面的数据进行解析:最顶端有颜色条
蓝色 (表示常规的指令函数)
1、深蓝:用户写的函数编译后的代码区。
2、浅蓝:编译器自己添加的函数,像启动函数,异常函数等。
黑色 (节与节之间的间隙) 禁区,不存在任何数据
银白色 (数据内容)
粉色 (表示外部导入符号) 有关输入表的一些数据信息
暗黄色 (表示IDA未识别的内容)
3、IDA主界面
图形化显示
按下空格,提示是否通过图形化显示
默认开启的六个窗口
View三种反汇编视图:文本视图、图表视图、路径视图
Hex View:十六进制窗口
Imports:导入函数窗口
Struceures:结构体窗口
Exports:导入函数窗口
Enums:枚举窗口
strings:字符串窗口
开启关闭窗口配置处
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
adb shell #获取真机shell权限
首先来到dbgsrv文件夹目录
E:\IDA7.0\dbgsrv
利用adb将android_server文件传送到真机下指定的文件目录内
adb push E:\IDA7.0\dbgsrv\android_server data/local/tmp
可以去android目录下面去看看是否成功
adb devices
adb shell
su
cd /data/local/tmp/
ls -al
赋予777权限给android_server
chmod 777 android_server
然后直接运行android_server
./android_server
安卓启动的端口是23946
开启后再次打开另外一个CMD窗口,将安卓上面的23946端口转发到win电脑上
adb forward tcp:23946 tcp:23946
接下接下来就是要调试APK安装到真机上
adb install E:\IDA7.0\test\javandk1.apk
4、Debugger调试
开始Dbugger模式调试:开始IDA32位
点击Go
选择Remote ARMLinux/Android debugger
填写hostname 和 刚刚配置的转发过来的端口
选择好后就会出现真机上的进程列表
然后运行刚刚安装的javandk1.apk
CTRL+F查询刚刚运行的包名ndk
这里查询不到是因为进程实在选择Remote ARMLinux/Android debugger之后打开的,这里重新打开一下Remote ARMLinux/Android debugger
选择进程,点击OK,将进入此进程,需要加载一会
这时还需要加载模块列表:进入Debugger options
勾选:库挂起入口点,开始接受,加载卸载!
表示程序在运行中只要涉及到进程的入口点,涉及到线程的开始和结束,涉及到库的加载和卸载都可以让程序进行debugger(断点)操作
可以开始运行动态调式,点击左上角的运行或者按F9都可以
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
开一个新窗口,将安卓下面的23946端口转发到win上
adb forward tcp:23946 tcp:23946
这里的端口转发必须和前面真机上运行的yunjian进程端口一致,如何修改端口呢
./dayu -p1~65535
这时候已经完成端口转发了,接下来进行挂起程序~
2、挂起程序
挂起程序(需要程序的包名+类名)
打开jadx查看apk的包名和类名,activity元素中有LAUNCHER代表第一个调用
android:name="com.example.javandk1.MainActivity"
挂起程序命令
adb shell am start -D -n com.example.javandk1/.MainActivity
这时候真机会出现一个窗口
3、运行DDMS
打开DDMS,找到真机运行的com.example.javandk1进程
打开后会观察到调试进程中有红色小虫子就是开启了debug调试
注意:adb和ddms版本要一致,如果不一致,启动ddms时,将会杀死刚刚adb shell进程,导致端口断开。
4、运行IDA
这里和调试debugger一样的方法打开即可
配置Debugger setup
安卓模拟器环境运行:
可能会看到这种报错,没找到原因,我们真机即可
真机选择运行
显示Running就是在运行中,完成配置IDA
5、IDA加载so
回到DDMS查看调试程序的端口号 8600
执行命令,IDA将加载so文件
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8600
可以看到红小虫变成绿小虫了
在IDA下面看到加载了so文件,libjavandk1.so
加载进来so后,在IDA右上角有个Modules,查询一下so文件
三 、总结
现在对此章节使用到的工具进行总结
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、虚拟地理坐标等等。