Frida的JavaScript API允许你在JavaScript中编写代码来与目标进程交互。这些代码通常被称为Frida脚本。Frida脚本的语法基于JavaScript,但是引入了一些特殊的对象和方法,以便与目标进程的内存、代码和数据进行交互。
![Frida Hook(二) - 安卓Hook 常用JS脚本 Frida Hook(二) - 安卓Hook 常用JS脚本]()
JS API语法
![Frida Hook(二) - 安卓Hook 常用JS脚本 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脚本
评论