# 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)) 实例化一下。
Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

Mr2 WeChat Pay

WeChat Pay