前言

不牵涉到过多的逆向,主要看看抓包可能遇到的问题,Android和java一样是个大坑,我这人喜欢实践的一些东西,不喜欢空谈理论和做一些没意思的练习,就和以前一样看看b站视频写写简单的总结,写到哪算哪,有个概念,反正个人感觉万事开头难,一直观望不如直接就开始学

安卓的基本概念

Android 是一个由 Google 主导开发的 基于 Linux 内核的开源操作系统,所以调用的底层是linux接口,同时Android系统的应用层是采用Java开发的
2025_06_QQ20250621-215022-21-1

APK文件结构

apk修改为zip后缀名,进行解压就可以看到内部结构
QQ20241128-142228
初步分析分为这几类

源代码

对应classes.dex,DEX(Dalvik Executable)文件是一种专门为Android操作系统设计的可执行文件格式。它是将Java字节码(class文件)转换为Dalvik字节码的结果

资源文件

res目录 res目录存放资源文件,包括图片,字符串等等,APK的脸蛋由他的layout文件设计
resources.arsc文件 resources.arsc是编译后的二进制资源文件,它是一个映射表,映射着资源和id,通过R文件中的id就可以找到对应的资源

配置信息

AndroidMainfest.xml文件 APK的应用清单信息,它描述了应用的名字,版本,权限,引用的库文件等等信息
META-INF目录 保存应用的签名信息,在 Android 中,应用签名用于验证应用的身份和完整性。如果应用被篡改或者被恶意修改,则应用的签名将无法验证,使得应用无法被安装或者运行。

安卓四大组件

安卓和一般的桌面程序在应用场景上是相似的,所以我们大二的时候安卓和c#的wcf开发是划为一类的,可惜的是我们信安学的是wcf计科学的安卓,四大组件其实就是在对Android开放时的开发需要考虑的方面的划分

Activity(活动) 应用的一个单一界面,负责与用户进行交互,和web的前端不同,应用程序是不跨设备的所以Activity可以执行系统操作
Service(服务) 在后台运行的组件,主管后台逻辑,Service的生命周期与Activity无关。即使关闭所有Activity,Service仍然可以继续在后台运行
Broadcast Receiver(广播接收器) 用于接收并响应系统或应用发出的广播消息,实现应用程序之间,程序和系统之间的通信
Content Provider(内容提供者) 存储并检索数据以及向其他应用程序提供访问数据的接口。可以访问文件系统、SQLite 数据库、网络等数据源

ADB的使用

adb(Android Debug Bridge)是一种用于在 Android 设备和计算机之间通信的命令行工具,开发人员可以在连接到设备时运行各种命令来执行各种任务。adb 是 Android SDK(Software Development Kit)的一部分。
adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令,adbd 接收命令后解析运行。
和手机连接前需要手机打开开发者模式

1
2
3
4
5
6
adb connect 127.0.0.1:7555  #mumu模拟器开放端口,真机就是数据线连接
adb version #查看adb版本
adb devices #获取已连接的设备列表
adb -s '设备名' shell whoami
adb shell #进入shell模式
adb forward tcp:<本地端口> tcp:<设备端口> #端口转发

package manager(包管理器)

包管理器是一个系统级服务,它负责管理应用程序的安装、卸载、更新、清除和查询等操作。

1
2
3
4
5
6
7
8
adb shell pm list packages                              #列出安装在连接设备上的所有软件包
#-s 只列出系统应用程序。
#-3 只列出用户自己安装的第三方应用程序。
adb shell pm path <PACKAGE> #根据包名查看应用安装路径
adb shell pm clear <packagename> #清除应用数据与缓存
adb uninstall <PACKAGE> #卸载软件包
adb shell dumpsys package <packagename> #查看应用详细信息
adb shell dumpsys activity services [<packagename>] #查看正在运行的Services

frida-hook

Frida 是一款开源的动态插桩工具,可以插入一些代码到原生App的内存空间去动态地监视和修改其行为,可以实现Java层和Native层Hook操作。

1
2
3
frida-ps -U -a  #查看当前手机运行的进程
frida -U -f <Identifier> -l hook.js #Spawn模式
frida -U <Name> -l hook.js #attach模式

hook函数编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//方法重载
function main(){
Java.perform(function(){
var testClass = Java.use("org.owasp.goatdroid.fourgoats.activities.Login");// 定位类
//更改类的方法的实现,allFieldsCompleted为需要修改的函数名,overload是怕目标方法存在重载
testClass.test_mothiod.overload("java.lang.String", "java.lang.String").implementation = function(userName,password){
console.log("userName: " + userName + " password: " + password)
var ret_value = this.test_mothiod("admin", "password"); // 调用原来的函数获取结果并返回
return ret_value;
}
});
}
setImmediate(main);

//主动调用函数
//静态方法直接调用
var ClassName=Java.use("com.zj.wuaipojie.Demo");
ClassName.privateFunc();
//实例方法需要反射调用实例
Java.perform(function () {
Java.choose("com.zj.wuaipojie.Demo",{ //要hook的类
onMatch:function(instance){
ret=instance.privateFunc("aaaaaaa"); //调用要hook的方法
},
onComplete:function(){
// 当搜索完成后,会执行 onComplete 回调函数
}
});
})

objection

Objection是基于Frida API开发的一个工具,Objection将Frida的API封装成易于使用的命令行接口,从而降低了使用门槛,提高了效率
这个工具需要已经开启frida服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#建立连接,Objection 会重启应用并且注入Frida Agent到目标应用程序
objection -g com.zj.wuaipojie explore
#建立交互后我们就可以使用android开头的命令了
#获取activity列表
android hooking list activities
#启动某个activity,可以用于发现隐藏页面
android intent launch_activity com.zj.wuaipojie.ui.ChallengeSecond
#列出所有加载的类
android hooking list classes
# 根据关键词找类
android hooking search classes crypto
# hook对应方法的参数、返回值和调用栈
android hooking watch class_method javax.crypto.Cipher.doFinal --dump-args --dump-return --dump-backtrace
#看看类的所有方法
android hooking list class_methods com.android.internal.net.crypto.KeyGenerationUtils