frida 入门及几种 hook 思路
前言
frida Xposed简单对比
学安卓hook入门的时候纠结于选用哪个平台Xposed和frida看了看都在脑子里云了一下觉得都好好用于是干脆和教程反着来看着师傅Xposed的文章后用frida复现一遍(实战链接也在文章中就不发出来了)而且之前Peanuts师傅也发过Xposed的了.
其实两者差别还是比较大的就拿工作方式来说Xposed走的是开发那一套重新写组件后再打包用可以说是一劳永逸以后直接拿apk就能用;frida则不然它的方式是把js代码注入到进程的方式简单但是缺点也很明显就是不好用到实际app的使用中
环境搭建
本机实验环境
python3.7
夜神模拟器Android5.1.1
Windows10
frida 安装
pip install frida
pip install frida-tools
frida-server 安装运行
先看看自己模拟器平台一般模拟器架构都是x86的
λ adb shell getprop ro.product.cpu.abi
x86
我这边是x86的到frida-releases这找到对应版本进行下载之后用adb把它push到手机中转发到本机端口起frida-server
adb push frida-server /data/local/tmp
adb forward tcp:27042 tcp:27042
adb shell /data/local/tmp/frida-server
已经起来了可以用frida-ps -U
看看模拟器进程
hook实战测试
实战链接在最上方
就直接拿师傅的程序搞了师傅用写xposed组件的方式写的我就拿frida复现一遍同时实现几个别的思路开始吧
解锁码
先装到手机上测试发现进去后要一个key进行解锁.
使用反编译工具(我用的jadx)打开apk发现有两个小测验第一处是要一个解锁码解锁码与程序算出来的完全一致就跳到下一个挑战.
进入加密函数一探究竟可以看到进行了加密.
之后程序使用equals函数判断和我们输入的是否相等(在此之前程序有一处输出解锁码的函数即a.a不过因为条件不满足未执行).
了解流程后进行打hook绕过思路有两种一种是把真实的解锁码打印出来(这思路等下用两种方式实现分别是hook掉打印函数a.a和系统函数equals的方式)还有偷鸡的方式就是直接修改加密函数return一个我们控制的值之后在输入的时候直接输我们的值就好了.
在注入js代码的时候有两种方式分别是js直接加载和使用python的方式python当作一个loader的角色把js代码注入进去python代码在最下侧本篇用的是python的方式.下面是js代码(这代码不用纠结和pwntools一样用多了就熟练了):
console.log("Script loaded successfully ");
Java.perform(function x() {
var String = Java.use('java.lang.String')//定位到要hook的类名
String.equals.implementation = function (arg1) {//equals就是我们要hook的函数
console.log("your input : " + this.toString());
console.log("I'm the real key : " + arg1);//打印出来真实的解锁码
var ret = this.equals(arg1);
return ret;//返回值
}
var Show_key = Java.use("com.hfdcxy.android.by.a.a");
Show_key.a.overload("java.lang.String").implementation = function (args1) {
console.log("Your_key_is" + args1);//打印解锁码
}
var my_class = Java.use("com.hfdcxy.android.by.test.a");
my_class.a.implementation = function () {
return "123456789";//使用"123456789"当返回值
}
});
三种方法都能完成步骤一的hook使用python注入一下看看效果
看到了输入的123和真正的作比较
成功了进入下一个界面.本质上是两种方法一种是hook自实现函数一种就是hook系统函数
点金币开宝箱
点金币的这个执行的函数很简单就是点击一次后coin加i(原本程序i等于1)
开宝箱按钮就是判断你的coin值大小大于等于9999就完成挑战
这里再介绍另一种姿势就是修改函数的参数完成参数调用frida实现起来也很简单见js:
console.log("Script loaded successfully ");
Java.perform(function x() {
var coin = Java.use("com.hfdcxy.android.by.test.b");
coin.a.overload("android.content.SharedPreferences" "android.widget.TextView" "int").implementation = function (args1args2args3) {//overload后接的参数都是这个a函数的参数
return this.a(args1args29999)//把参数改成9999这样一次就能加9999个了
}
});
点了几次coin就很大了直接满足条件
总结 & python loader
可以看到frida在hook时真的方便代码也不难本篇js太过简单有好多很nb的模板都可以拿来练练并测试官方文档也是深入学习的好去处
import time
import frida
device = frida.get_remote_device()
pid = device.spawn(["com.ss.android.ugc.aweme"])#程序名
device.resume(pid)
time.sleep(1)
session = device.attach(pid)
with open("s1.js") as f:
= session.create_(f.read())
.load()
input()
