# Ratel 介绍
直接 adb install 安装。
# app 感染:
使用 ratel.bat package
生成被感染的 app 然后 adb install package
apk 逻辑可以直接
jadx -e package
导出为 gradle 项目,用 As 看
# Ratel 插件开发
模板地址 https://github.com/virjarRatel/ratel-module-template.git
- 直接使用模板创建
template.bat -a <appname> -m <dirname>
- 直接用 as 创建工程
//gradle | |
android { | |
// ... | |
packagingOptions { | |
exclude 'META-INF/INDEX.LIST' | |
exclude 'META-INF/io.netty.versions.properties' | |
} | |
} | |
dependencies { | |
//... 其他的依赖 | |
//ratel 核⼼ api | |
compileOnly 'com.virjar:ratel-api:1.3.6' | |
//ratel 的扩展 api,他⼀般是给逆向破解和爬⾍业务使⽤,如果您只是基于 ratel 做⼀个插件,那么⼤多数情况 | |
api 'com.virjar:ratel-extersion:1.0.6' | |
//sekiro 项⽬,他可以提供⻓链接 RPC 功能 | |
api 'com.virjar:sekiro-api:1.0.3' | |
} | |
// AndroidManifest | |
<meta-data android:name="xposedminversion" android:value="54"/> | |
<meta-data android:name="xposedmodule" android:value="true"/> | |
<meta-data android:name="xposeddescription" android:value="这个描述可以随便写, 会展示在插件列"/> | |
//xposed_init 中 添加入口类 | |
com.yuanrenxue.ratel.crack01.HookEntry |
这里面的逻辑都要在 handleLoadPackage 中写
@Override | |
public void handleLoadPackage(final RC_LoadPackage.LoadPackageParam lpparam) throws Throwable { | |
Log.d(tag, "hook begin"); | |
Log.d(tag, "current pacakage name : " + lpparam.packageName); | |
//lpparam.packageName 可以输出包名,如果要针包 hook, 就需要 z | |
if(lpparam.packageName.equals("com.example.myapplication")) { | |
Log.d(tag, "current is in app package"); | |
} | |
addFloatingButtonForActivity(lpparam); | |
Log.d(tag, "hook end"); | |
} |
# api
# hook
# 回调中对参数的操作
param.getResult () 获取返回值
param.args 对应传参的列表
param.thisObject 获取对象
RposedHelpers.setObjectField 修改值
RposedHelpers.getObjectField 获取值
# HOOK 构造方法
// 类名 + 回调即可 | |
RposedBridge.hookAllConstructors(Dialog.class, new RC_MethodHook() { | |
@Override | |
protected void afterHookedMethod(MethodHookParam param) throws Throwable { | |
super.afterHookedMethod(param); | |
Log.i(tag, "show dialog", new Throwable()); | |
} | |
} | |
); |
# Hook 类方法
// 这里跟感染前的类名 | |
RposedHelpers.findAndHookMethod("com.example.testratel.SecondActivity", lpparam.classLoader, | |
"BuildDialog", View.class, new RC_MethodHook() { | |
@Override | |
protected void beforeHookedMethod(MethodHookParam param) throws Throwable { | |
super.beforeHookedMethod(param); | |
param.setResult(null); | |
// Object[] args = param.args; | |
// Log.i(tag, "args[0]: " + args[0]); | |
} | |
// @Override | |
// protected void afterHookedMethod(MethodHookParam param) throws Throwable { | |
// super.afterHookedMethod(param); | |
//// Object result = param.getResult(); | |
//// Log.i(tag, "result: " ); | |
// } | |
}); |
# 主动调用
# 静态方法
RposedHelpers.callStaticMethod(Class<?> clazz, String methodName, Object... args) |
- clazz 类实例,可以用 lpparam 自带的 classLoader 拿到
- methodName 方法名
- args 传的参数
# 类方法
callMethod(Object obj, String methodName, Object... args) |
- obj 指代的是类实例,要用
RposedHelpers.newInstance(RposedHelpers.findclass(classname))
实例化一下。