第七下载:绿色软件放心下载

首页 > 软件教程 > 使用教程 > 详情

frida 逆向笔记 1-hook Java 层

作者:wangjing 来源:第七下载 更新:2022-04-14 17:43:24 阅读:

用手机看

记录一下 Android 逆向时使用 frida hook java 层时经常会遇到的问题以及解决方案, 包括且不限于:

  1. hook 类属性、方法

  2. hook 实例属性、方法

  3. hook 构造函数

  4. hook 动态 dex 方法

  5. 使用自定义 dex

  6. 批量 hook 方法

  7. hook 同名属性、方法

  8. 批量 hook 类

  9. 打印调用栈

具体使用方法可以参考下述代码
var f = Java.use("com.xxx.xxx.xxx"); // 获取类
var inner_class = Java.use("com.xxx.xxx.xxx$InnertClass"); // 获取内部类, 外部类名$内部类名
f.func.implementation = function(a,b,c){ // hook 类的方法
const result = this.func(a,b,c) // 获取原本函数的返回值
console.log(a, b, c) // 获取参数
console.log(a.$className) // 如果 a 是 object, 通过 $className 可以获取 a 的类名
return true // 修改返回值
}
f.func() // static 静态类方法主动调用
var m = Java.use("com.xxx.xxx.xxx.xxx");
m.$init.implementation = function(a, b, c) { // hook 构造函数
const result = this.$init(a, b, c) // 获取构造函数结果
return result
}
Java.choose("com.xxx.xxx.xxx", { // hook 实例的方法
onMatch: function(instance) {
instance.func() // 实例方法主动调用
instance.b.value = true; // 动态实例参数修改
instance._same_b.value = true; // same_b 既用来做变量、又用来做方法的话,需要前面加下划线。
var all_methods = f.class.getDeclaredMethods // 获取类的所有方法名
for (var i = 0; i < all_methods.length; i++){
var m_str = all_methods[i].toString();
var method_name = m_str.substr(m_str.indexOf(f) + f.length + 1).substr(0, substring.indexOf("(")); // 每个方法名称
f[method_name].implementation = function() {
return true // 批量调用 f 类中所有方法。
}
}
}
onComplete: function(){}
})
Java.enumerateClassLoaders({ // 枚举所有 classloader, 解决 class hook 不到的问题
onMatch: function(loader){
if (loader.findClass("com.xxx.xxx.xxx.xxx")) {
Java.classFactory.loader = loader // 把当前应用的 classloader 改为 hook 到的 classloader
}
},
onComplete: function(){}
})
Java.enumerateLoaderedClasses({
onMatch: function(name, handler) {
if(name.indexOf("xxx") >= 0) { // name 是类名
var d_class = Java.use(name) // 动态 hook name
d_class.xxx.implementation = function() {
return true // hook 每个类的 xxx 方法,并且返回 true
}
}
},
onComplete: function(){}
})
function print_stack() { // 输出当前运行环境的调用栈
const Exception = Java.use("java.use.Exception");
const instance = Exception.$new('print_stack');
const stack = instance.getStackTrace();
console.log(stack.split(",").join(",\n")); // 切分格式
instance.$dispose();
}
// Android 可以把 .java 文件编译成 .class 文件
// jar -cvf xxx.jar xxx.class // 把 .class 文件打包成 .jar 文件
// Android/sdk/build-tools/31.0.0/dx --dex --output=xxx.dex xxx.jar // 把 .jar 文件编译成 .dex 文件
// adb push xxx.dex /data/local/tmp/
var dex = Java.openClassFile("/data/local/tmp/xxx.dex"); // 读取 dex 文件
dex.load(); // 加载 dex 文件

OK, 关于 frida 如何 hook Java 层就介绍到这里了。

如果您在实际开发过程中遇到过 Python、Golang、数据库、爬虫、分布式、消息队列等方面的难题, 也欢迎在公众号或评论区留言, 我们一起探讨解决方案

如果本篇内容能够帮助到您, 希望您点击下方的点赞和在看,也希望与您一起共同成长~

 


 

 
?
热点推荐
?
赞助
?
网友跟帖吐槽
pl
返回顶部