Xposed是一个模块框架,可以在不接触任何APK的情况下更改系统和应用程序的行为。这意味着模块可以在不同版本甚至ROM上工作而无需任何更改。
JsHook是使用Xposed框架对任意app的初始化进行注入Rhino/Frida,Xposed模块开发需要一定的Java语法基础,技术门槛高,而JsHook注入的Rhino/Frida很棒,只需要会简短的Js语法基础,即可用手机快速制作属于自己的hook插件,并且hook支持java层和native层。
- Xposed api 82
- Android 7 - 12
启用脚本前请确认选择的应用已开启hook服务选项,如果是LSPosed非全局作用域在激活模块时除了勾选系统还需勾选对应脚本生效的应用,每次更改脚本内容都需要重启一下被hook的app。
如果你对Xposed的hook方法比较熟,推荐Rhino,使用js调用Xposed框架的方法,且兼容性高;而Frida属于另一个hook框架,需要对Frida有一定的了解,上手较难,且不支持部分机型和app。
版本1.0.2之前默认是frida注入,所以之前使用frida的需要在框架管理中将全局默认设置为frida,导入框架目前只支持frida-gadget。
版本1.0.5之前的rhino脚本如果有调用到context,需要在新版中加入以下代码进行兼容。
common.hookAllMethods('android.app.Application', 'onCreate', function (param) {
//你的脚本代码
});
日志打印:
common.log('...');
消息提示:
common.toast('...');
获取Context:
common.getcontext();
获取类实例
findClass | |||
参数 | 参数类型 | 参数说明 | 是否必填 |
className | String | 类名 | Y |
classLoader | ClassLoader | 类加载器 | Y |
示例:
common.findClass('com.test.test',classLoader);
hook构造函数
hookAllConstructors | |||
参数 | 参数类型 | 参数说明 | 是否必填 |
className | Object | 类实例或类名 | Y |
beforeHookedMethod | Function | 构造函数执行前 | N |
afterHookedMethod | Function | 构造函数执行后 | N |
replaceHookedMethod | Function | 替换构造函数执行过程 | N |
示例:
common.hookAllConstructors('com.test.test', function (param) {
//构造函数执行前
//打印构造函数接收到的第一个参数
common.log(param.args[0]);
//修改这个参数的值
param.args[0] = 'fuck';
}, function (param) {
//构造函数执行后
//...
});
hook指定参数的构造函数
hookConstructor | |||
参数 | 参数类型 | 参数说明 | 是否必填 |
className | Object | 类实例或类名 | Y |
paramTypes | Object[] | 参数类型 | Y |
beforeHookedMethod | Function | 构造函数执行前 | N |
afterHookedMethod | Function | 构造函数执行后 | N |
replaceHookedMethod | Function | 替换构造函数执行过程 | N |
示例:
common.hookConstructor('com.test.test', ['java.lang.String', 'int'], function (param) {
//...
}, function (param) {
//...
});
hook类方法
hookAllMethods | |||
参数 | 参数类型 | 参数说明 | 是否必填 |
className | Object | 类实例或类名 | Y |
beforeHookedMethod | Function | 函数执行前 | N |
afterHookedMethod | Function | 函数执行后 | N |
replaceHookedMethod | Function | 替换函数执行过程 | N |
示例:
common.hookAllMethods('com.test.test', 'methodname', function (param) {
//...
}, function (param) {
//...
}, function (param) {
//调用原方法返回
return common.thisMethod(param);
});
hook指定的类方法
hookByMethod | |||
参数 | 参数类型 | 参数说明 | 是否必填 |
method | Method | 方法对象 | Y |
beforeHookedMethod | Function | 函数执行前 | N |
afterHookedMethod | Function | 函数执行后 | N |
replaceHookedMethod | Function | 替换函数执行过程 | N |
示例:
common.hookByMethod(method, function (param) {
//...
//修改返回值
param.setResult('fuck');
}, function (param) {
//...
//获取类方法的返回值并打印
common.log(param.getResult());
});
hook指定参数的类方法
hookMethod | |||
参数 | 参数类型 | 参数说明 | 是否必填 |
className | String | 类名 | Y |
paramTypes | Object[] | 参数类型 | Y |
beforeHookedMethod | Function | 函数执行前 | N |
afterHookedMethod | Function | 函数执行后 | N |
replaceHookedMethod | Function | 替换函数执行过程 | N |
示例:
common.hookMethod('com.test.test', 'methodname', ['java.lang.String', 'int'], function (param) {
//...
//修改返回值
param.setResult('fuck');
}, function (param) {
//...
//获取类方法的返回值并打印
common.log(param.getResult());
});
修改静态变量值
setStaticObjectField | |||
参数 | 参数类型 | 参数说明 | 是否必填 |
className | String | 类名 | Y |
fieldName | String | 变量名 | Y |
fieldValue | Object | 变量值 | Y |
示例:
common.setStaticObjectField('com.test.test', '变量名', '变量值');
修改动态变量值
setObjectField | |||
参数 | 参数类型 | 参数说明 | 是否必填 |
className | Object | 类名或者当前实例 | Y |
fieldName | String | 变量名 | Y |
fieldValue | Object | 变量值 | Y |
示例:
common.setObjectField('com.test.test', '变量名', '变量值');
//或者
//param.thisObject 在hook回调方法中获取
common.setObjectField(param.thisObject, '变量名', '变量值');
获取静态变量值
getStaticObjectField | |||
参数 | 参数类型 | 参数说明 | 是否必填 |
className | Object | 类实例或类名 | Y |
fieldName | String | 变量名 | Y |
示例:
common.getStaticObjectField('com.test.test', '变量名');
获取动态变量值
getObjectField | |||
参数 | 参数类型 | 参数说明 | 是否必填 |
className | Object | 类名或者当前实例 | Y |
fieldName | String | 变量名 | Y |
示例:
common.getObjectField('com.test.test', '变量名');
主动调用动态方法
callMethod | |||
参数 | 参数类型 | 参数说明 | 是否必填 |
className | Object | 类名或者当前实例 | Y |
methodMame | String | 方法名 | Y |
paramTypes | Object[] | 参数值 | N |
示例:
common.callMethod('com.test.test', 'methodname', ['a', 1]);
主动调用静态方法
callStaticMethod | |||
参数 | 参数类型 | 参数说明 | 是否必填 |
className | Object | 类实例或类名 | Y |
methodMame | String | 方法名 | Y |
paramTypes | Object[] | 参数值 | N |
示例:
common.callStaticMethod('com.test.test', 'methodname', ['a', 1]);
replaceHookedMethod
中调用原方法
thisMethod | |||
参数 | 参数类型 | 参数说明 | 是否必填 |
param | Object | 参数 | Y |
示例:
//param在replaceHookedMethod中获取
common.thisMethod(param);