篇幅有限
完整内容及源码关注公众号:ReverseCode,发送 冲
java type | 语法 |
---|---|
int类型 | int |
float类型 | float |
boolean类型 | boolean |
string类型 | java.lang.String |
byte类型 | [B |
char类型 | [C |
list结构 | java.util.List |
安卓上下文 | android.content.Context |
符号 | 作用 |
---|---|
$init | hook构造函数 |
$new() | 实例化对象用户主动调用 |
frida中数组格式[java.lang.String;
java type | so type |
---|---|
int | I |
float | F |
boolean | Z |
string | java.lang.String |
byte | B |
long | J |
short | S |
double | D |
char | C |
plain
1 | // byte array to string |
动静态函数
静态函数 use
plain
1 | function static() { |
实例函数 choose
plain
1 | function dynamic(){ |
so导出函数
plain
1 | var native_func = Module.findExportByName("${so file name}", "${so export function name}"); |
so偏移地址
plain
1 | var native_func_addr = Module.findBaseAddress("${so file name}"); |
JNIEnv函数
plain
1 | // 获取 JNIEnv |
动静态变量修改
静态变量 use
plain
1 | function staticField(){ |
动态变量 choose
plain
1 | function dynamicField(){ |
构造函数 实例化
plain
1 | // Utils.test(new Money(200,"美元")) |
Hook实例化
plain
1 | JavaClass.$new.implementation = function () {} |
Hook构造函数
plain
1 | // JavaClass.$init.implementation = function () {} |
sleep
plain
1 | function sleep(numberMillis) { |
枚举类所有方法
plain
1 | //Hook类的所有方法 |
特殊不可见字符
当方法名被混淆时֏,打印出来所有的类名%D6%8F
,用编码后的字符串hook
plain
1 | Java.perform( |
wallbreaker
plain
1 | function main(){ |
枚举所有类
plain
1 | Java.perform(function (){ |
枚举接口实现
获取指定包下所有类的接口实现
plain
1 | function searchInterface(){ |
多个ClassLoader时枚举指定类所有关联的接口实现和父子类关系
plain
1 | Java.perform(function () { |
Hook Char&Byte
plain
1 | Java.perform(function () { |
Hook Map
plain
1 | 遍历打印 |
Hook 重载
plain
1 | function hookdecodeimgkey() { |
Hook 内部类
plain
1 | function main(){ |
Hook 匿名类
plain
1 | // 接口, 抽象类, 不可以被new |
Hook 枚举类
plain
1 | function enumPrint(){ |
Hook 动态加载dex
plain
1 | function main(){ |
经常在加壳的 app 中, 没办法正确找到正常加载 app 类的 classloader
plain
1 | function hook() { |
trace类调用栈
plain
1 | function uniqBy(array, key) { |
调用栈打印
plain
1 | function printStacks(name){ |
手动注册类
plain
1 | Java.perform(function () { |
Hook Click
plain
1 | var jclazz = null; |
Hook Activity
plain
1 | Java.perform(function () { |
Hook 绕过root检测
plain
1 | // $ frida -l antiroot.js -U -f com.example.app --no-pause |
frida主线程运行
使用一些方法的时候出现报错 on a thread that has not called Looper.prepare()
plain
1 | Java.perform(function() { |
过滤打印
plain
1 | function hook_lnf() { |
禁止退出
plain
1 | function hookExit(){ |
修改设备参数
plain
1 | // frida hook 修改设备参数 |
请求调用栈
plain
1 | var class_Socket = Java.use("java.net.Socket"); |
上下文Context
plain
1 | function getContext(){ |
RPC
plain
1 | frida 传递参数 |
强制类型转换
plain
1 | // Java.cast() 子类可以强转成父类, 父类不能转成子类 |
map2json
plain
1 | function map2json(mapSet) { |
bytes2Hex
plain
1 | function bytes2Hex(arrBytes){ |
string2Bytes
plain
1 | function string2Bytes(str) { |
bytes2String
plain
1 | function bytes2String(arr) { |
bytes2Base64
plain
1 | function bytes2Base64(e) { |
常见算法hook
plain
1 | Java.perform(function () { |
base64实现
plain
1 | # -*- coding: utf-8 -*- |
常用转换模板
plain
1 | //工具相关函数 |
打印class
plain
1 | function printClass(c){ |