用到的工具
- Frida
- 夜神模拟器或者手机
- Python3.7.2
- Window系统
安装python
win+R 输入cmd,在控制台中输入python,看到如下信息说明安装成功
安装Frida
在命令行中输入
pip install frida
pip install frida-tools
安装完成后再命令行中输入
frida --version
安装成功
安装模拟器 或者使用手机(这里使用模拟器)
下载安装frida-server 并安装到模拟器或者手机上
需要使用和frida同一个版本 这里使用14.2.13
frida-server下载地址
有四个Android的版本:查看模拟器或者手机下载对应版本
使用夜神模拟器演示查看方法: 使用ADB 查看
打开命令行 输入夜神模拟器安装目录下的nox_adb.exe路径 shell getprop ro.product.cpu.abi
这里模拟器使用的是x86 选择上面下载地址中的frida-server-14.2.13-android-x86 版本
下载完成
改名为 frida-server
将这个文件复制到手机里 目录为 /data/local/tmp/
// 连接adb
adb connect 127.0.0.1 62001
命令行输入 adb push D:\frida-server /data/local/tmp/
在模拟器或者手机中文件夹可以看到
安装成功后在手机上启动服务
打开命令行 链接adb设置转发端口
$ D:\SoftWare\Nox\bin\nox_adb.exe forward tcp:27042 tcp:27042
shell连接手机
$ D:\SoftWare\Nox\bin\nox_adb.exe shell
输入su 切换到root用户
$ su
切换目录
$ cd /data/local/tmp
输入chmod 获取权限
$chmod 777 frida-server
启动 frida-server
$ ./frida-server
测试是否启动成功
- 打开一个新的命令行 当前这个不要关掉
- 输入frida-ps -R 获取启动frida-server的手机上正在运行的应用
显示这个说明安装成功
创建一个用来被自己破解的安卓应用
AndroidStudio3.5下载地址
配置好AndroidStudio环境 (包括AndroidSDK ,JDK,Gradle等 )
打开AndroidStudio创建安卓空项目
在布局文件上添加安卓界面
在MainActivity 中添加代码控制App逻辑
打包出APK到模拟器上安装
点击设置文字按钮之后中间的文字变成按钮点击了~ 说明apk成功运行
接下来用frida hook把一步一步这个按钮功能改了
需要一些python代码以及javascript代码
先编写python代码尝试执行frida 的功能
import frida
# 获取模拟器或者手机上已连接的设备
device = frida.get_remote_device()
print(device)
打开命令行执行python脚本
打印出Device的信息说明成功与手机系统通信
接下来完善脚本
import frida
# 获取模拟器或者手机上已连接的设备
device = frida.get_remote_device()
# print(device)
# 获取device上的所有app
applications = device.enumerate_applications()
for application in applications:
print(application)
打印出手机上已安装的app则成功
从打印出的列表中找到刚才装的应用包名为com.example.hookapp
接下来附加到应用
import frida
# 获取模拟器或者手机上已连接的设备
device = frida.get_remote_device()
# print(device)
# 获取device上的所有app
# applications = device.enumerate_applications()
# for application in applications:
# print(application)
# 附加到应用
session = device.attach("com.example.hookapp")
jsScript = """
console.log('this is javascript code')
"""
# 加载Javascript代码
script = session.create_script(jsScript)
# 执行
script.load()
执行后打印出 this is javascript code 成功
因为大量的hook操作需要在javascript中执行
所以将javascript代码独立出来
创建文件hook.js ,找到需要hook的函数
写下代码
// 程序入口
Java.perform(function()
{
// 获取类
var clazz = Java.use("com.example.hookapp.MainActivity");
// 获取类中所有函数
var methods = clazz.class.getDeclaredMethods();
console.log("have method count:"+methods.length);
if(methods.length > 0){
//遍历函数名
methods.forEach(function(method){
console.log(method);
});
}
});
修改python执行脚本 hook.py
import frida
# 获取模拟器或者手机上已连接的设备
device = frida.get_remote_device()
# print(device)
# 获取device上的所有app
# applications = device.enumerate_applications()
# for application in applications:
# print(application)
# 附加到应用
session = device.attach("com.example.hookapp")
# jsScript = """
# console.log('this is javascript code')
# """
file = open("hook.js",mode='r',encoding='UTF-8')
scr = file.read()
# 加载Javascript代码
script = session.create_script(scr)
# 执行
script.load()
在命令行 将目录切换到python脚本目录之后执行
$ cd D:\Developer\Hook\script
$ D:
$ hook.py
在命令行中显示两个函数
接下来 hook ShowWord这个按钮监听的函数
匿名函数参数需要和原函数一样
Java.use(类名).方法名.implementation = function(a)
{
return 调用一次方法()
}
修改hook.js
// 程序入口
Java.perform(function()
{
// 获取类
var clazz = Java.use("com.example.hookapp.MainActivity");
// 获取类中所有函数
// var methods = clazz.class.getDeclaredMethods();
// console.log("have method count:"+methods.length);
// if(methods.length > 0){
// //遍历函数名
// methods.forEach(function(method){
// console.log(method);
// });
// }
clazz.ShowWord.implementation = function(a)
{
console.log("Hook success")
return this.ShowWord("this is my hook method");
}
});
修改hook.py 加上等待系统输入让程序暂停等待hook
import sys
sys.stdin.read()
import frida
import sys
# 获取模拟器或者手机上已连接的设备
device = frida.get_remote_device()
# print(device)
# 获取device上的所有app
# applications = device.enumerate_applications()
# for application in applications:
# print(application)
# 附加到应用
session = device.attach("com.example.hookapp")
# jsScript = """
# console.log('this is javascript code')
# """
file = open("hook.js",mode='r',encoding='UTF-8')
scr = file.read()
# 加载Javascript代码
script = session.create_script(scr)
# 执行
script.load()
sys.stdin.read()
执行hook.py
成功hook 按钮 并修改