前言

好久没写博客了,最近研究了nacos写了一点项目,本想写上博客了,实在是太懒了,最近,研究了怎么破解某电商app,因为用的工具和方法实在不熟悉,所以还是写上记录上吧!

准备环境

安装frida

frida是hook用的超吊的工具类,不过是python工具包,怎么安装python的就不演示了,直接安装

1
pip install frida

安装frida工具包

1
pip install frida-tools

查看版本,验证是否安装成功,记住这个版本非常重要

1
2
C:\Users\12736>frida --version
15.1.12

好了,工具安装完成,接下来需要安装安卓frida驱动

安装安卓环境

因为,我们是hook安卓手机,所以安卓手机需要安装一个驱动,并执行,主要安卓手机必须root。我们去githup下载–>

https://github.com/frida/frida/releases,网页搜索server,注意,看到版本没,这里的版本要和你python安装的版本一致

image-20211129225322271

找到自己的安装手机架构下载解压,使用adb push到安卓手机/data/local/tmp路径下,没有adb自己下载

1
2
E:\apk\frida-server-15.1.12-android-arm64>adb push ./frida-server-15.1.12-android-arm64 /data/local/tmp
./frida-server-15.1.12-android-arm64: 1 file pushed. 32.6 MB/s (47065456 bytes in 1.377s)

进入adb shell,执行su获取root权限,改名并给权限,改名是为了防止app检测

1
2
3
4
5
6
7
8
9
E:\apk\frida-server-15.1.12-android-arm64>adb shell
cepheus:/ $ su
cepheus:/ $ cd /data/local/tmp
cepheus:/data/local/tmp $ ls
frida-server-15.1.12-android-arm64
cepheus:/data/local/tmp $ mv frida-server-15.1.12-android-arm64 fs
cepheus:/data/local/tmp $ chmod 777 fs
cepheus:/data/local/tmp $ ls
fs

启动fs,并设定一个端口号,这一步还是为了防止app检测

1
cepheus:/data/local/tmp # ./fs -l 127.0.0.1:9999

执行可能报错,不慌查看当前shell模式

1
getenforce

如果是Enforcing,执行

1
setenforce 0

再次查看就是Permissive,再次执行frida脚本即可,手机部分另开一个cmd,开始进行实际的hook操作

开始hook

基础准备

环境准备完毕,另开一个cmd,开始做准备工作。因为我们是连接手机hook,所以需要转发端口,可以理解为开端口,端口就是你手机fs启动时设置的

1
adb forward tcp:9999 tcp:9999

接下来可以使用frida-ps看包名,找到我们想要hook的包

1
frida-ps -H 127.0.0.1:9999

image-20211129231501169

能执行上面的命令说明fs启动成功,并可以hook。frida支持shell hook,我们还是直接使用代码比较方面。

不过,想要hook app,我们首先要明确,要hook的位置,就是哪个类、哪个方法、参数是什么。这个才是最难的地方,一言两语无法说清,抽时间在写吧。

代码hook

其实代码是很公式的,直接放出来解释,是python脚本

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
30
31
import frida, sys

jscode = """
Java.perform(function(){
var checkHookG = Java.use('package+类');
checkHookG.方法名.implementation = function (参数) {
var result = this.方法名(参数);
//hook动作
return result;
}
});
"""

def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
pass

# 查找USB设备并附加到目标进程
session = frida.get_device_manager().add_remote_device('127.0.0.1:9999').attach('包名')
# 在目标进程里创建脚本
script = session.create_script(jscode)
# 注册消息回调
script.on('message', on_message)
print('[*] Start attach')
# 加载创建好的javascript脚本
script.load()
# 读取系统输入
sys.stdin.read()

先不看jscode脚本,先看python代码,调重要的说

第一步 、连接fs,并指定包名

这个其实没什么好说的。ip端口是你手机启动fs设置的,包名则是你想要hook的app包名。可以使用frida-ps -H 127.0.0.1:9999找到

1
session = frida.get_device_manager().add_remote_device('127.0.0.1:9999').attach('包名')

第二步、设置需要hook的类

这里的是全路径名

1
var checkHookG = Java.use('package+类');

第三步、hook方法

这里填你要hook的方法名称,注意参数一定要写

1
checkHookG.方法名.implementation = function (参数) {

第四步、hook的动作

其实没什么好说的,其实就是打印参数,然后还可以执行方法,查看方法返回值,是不是我们想要的。

rpc调用

有时间在学写