Frida Hook(二) - 安卓Hook 常用JS脚本

admin 2024年4月19日22:07:39评论10 views字数 4955阅读16分31秒阅读模式

Frida的JavaScript API允许你在JavaScript中编写代码来与目标进程交互。这些代码通常被称为Frida脚本。Frida脚本的语法基于JavaScript,但是引入了一些特殊的对象和方法,以便与目标进程的内存、代码和数据进行交互。

Frida Hook(二) - 安卓Hook 常用JS脚本

JS API语法

Frida Hook(二) - 安卓Hook 常用JS脚本

点击图片可查看完整电子表格

详细语法参考:https://frida.re/docs/javascript-api/#console 通常很多都用不到的,记得住常用的就行啦    

常见Hook脚本示例

使用的时候,就可以直接基于此修修改改就可以快速完成Hook的JS脚本    

示例 :列出所有当前运行的Java类和方法

JavaScript                  
Java.perform(function () {                  
var classes = Java.enumerateClasses();                  
for (var i =0; i < classes.length; i++) {                  
var className = classes[i].getName().replace("L", "").replace(";", "");                  
console.log("Class: "+ className);                  
var methods = classes[i].getDeclaredMethods().toArray();                  
for (var j =0; j < methods.length; j++) {                  
var methodName = methods[j].getName();                  
console.log("Method: "+ methodName);                  
}                  
}                  
});

示例 :Hook Android应用中的特定方法

假设我们要hook一个名为com.example.app/.MainActivity的Activity中的onClick方法:

此处需要注意如果onClick方法没有传参的时候就,可以不用写overload,如果存在重载函数,需要通过overload来传入不同的参数来区分重构函数

JavaScript                  
Java.perform(function () {                  
var MainActivity = Java.use("com.example.app.MainActivity");                  
MainActivity.onClick.
overload('android.view.View').implementation=function (v) {                  
// 在原始的onClick方法执行之前做一些事情console.log("onClick was called with view: "+ v);                  
// 调用原始的onClick方法this.onClick(v);                  
// 原始的onClick方法执行后再做一些事情                  
};                  
});

示例:Hook 构造函数

Java                  
Java.perform(function () {                  
var utils = Java.use("
com.example.app.MainActivity");                  
//修改类的构造函数的实现,$init表示构造函数                  
utils.$init.overload('java.lang.String').implementation = function(str){                  
console.log(str);                  
str = "52";                  
this.$init(str);                  
}                  
}                  

示例:Hook静态字段

Java                  
function hookStaticFiledTest(){                  
Java.perform(function(){                  
//静态字段的修改                  
var utils = Java.use("
com.example.app.utils");                  
//修改类的静态字段"flag"的值                  
utils.staticField.value = "我是被修改的静态变量";                  
console.log(utils.staticField.value);                  
//非静态字段的修改                  
//使用`Java.choose()`枚举类的所有实例                  
Java.choose("
com.example.app.utils", {                  
onMatch: function(obj){                  
//修改实例的非静态字段"_privateInt"的值为"123456",并修改非静态字段"privateInt"的值为9999。                 
obj._privateInt.value = "123456"; //字段名与函数名相同 前面加个下划线                  
obj.privateInt.value = 9999;                  
},                  
onComplete: function(){                  
                 
}                  
});                  
});                  
                 
}

示例:Hook内部类    

Java                  
function hookInternalClass(){                  
Java.perform(function(){                  
//内部类                  
var innerClass = Java.use("
com.example.app.Demo$innerClass");                  
console.log(innerClass);                  
innerClass.$init.implementation = function(){                  
console.log("eeeeeeee");                  
}                  
                 
});                  
}

示例:主动调用

在Frida中,除了拦截和监控函数调用之外,还可以主动调用目标应用程序的方法或函数。这可以通过使用Frida的JavaScript API中的call方法来实现。

Java                  
Java.perform(function () {                  
// 获取当前活动(Activity)的引用                  
var currentActivity = android.app.ActivityThread.currentActivity();                  
                 
// 定义一个函数,该函数将在特定条件下被调用                  
function showCustomToast() {                  
// 调用Activity的toast方法来显示一个Toast消息                  
var toast = android.widget.Toast.makeText(currentActivity, "这是一个自定义的Toast消息!", android.widget.Toast.LENGTH_SHORT);                  
toast.show();                  
}                  
                 
// 假设我们要在某个特定方法被调用后显示Toast消息                  
// 例如,我们拦截一个名为`onCustomButtonClick`的方法                  
var SomeActivityClass = Java.use("com.example.app.SomeActivity");                  
SomeActivityClass.onCustomButtonClick.implementation = function () {                  
// 调用原始的onCustomButtonClick方法                  
this.onCustomButtonClick();                  
                 
// 在方法执行后显示Toast消息                  
showCustomToast();                  
};                  
});
       

示例 :修改内存中的值

有时候,你可能需要直接修改Android应用程序内存中的值。以下是一个示例,展示了如何修改一个整数值:

JavaScript                  
var libc = Module.find("libc");                  
var addressOfValue = libc.base.add(0x1234); // 假设的地址                  
Interceptor.
replace(addressOfValue, {                  
value:0x12345678// 新的值                  
});

示例 :监控特定方法的调用并修改返回值

JavaScript                  
Java.perform(function () {                  
var SomeClass = Java.use("com.example.app.SomeClass");                  
SomeClass.someMethod.
overload('int').implementation=function (x) {                  
var originalResult =this.someMethod(x);                  
console.log("Original result: "+ originalResult);                  
// 修改返回值return originalResult +1;                  
};                  
});

示例 :使用Frida的RPC功能

Frida的RPC(远程过程调用)功能允许你通过网络从一个远程客户端调用Frida脚本中定义的函数。这通常用于在不同的设备或环境中执行代码,例如,当你的Frida脚本运行在一个Android设备上,而你想要从你的开发机上调用脚本中定义的函数    

JavaScript                  
复制                  
// frida-server.js                  
Java.perform(function () {                  
// 定义一个函数,该函数将通过RPC调用                  
var showCustomToast = function (message) {                  
var toast = android.widget.Toast.makeText(android.app.ActivityThread.currentActivity(), message, android.widget.Toast.LENGTH_SHORT);                  
toast.show();                  
};                  
                 
// 创建RPC服务器并导出函数                  
RPCServer = new RPCServer({                  
port: 27015, // 使用一个未被占用的端口                  
functions: {                  
showToast: showCustomToast // 导出函数以便远程调用                  
}                  
});                  
                 
RPCServer.on("listening", function () {                  
console.log("RPC server is listening on port 27015");                  
});                  
});                  
                 
                 

原文始发于微信公众号(暴暴的皮卡丘):Frida Hook(二) - 安卓Hook 常用JS脚本

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年4月19日22:07:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Frida Hook(二) - 安卓Hook 常用JS脚本https://cn-sec.com/archives/2650406.html

发表评论

匿名网友 填写信息