Android Hook Activity 的几种姿势,android开发者工具

mToken, child.mEmbeddedID, requestCode,

ar.getResultCode(), ar.getResultData());

}

cancelInputsAndStartExitTransition(options);

}

可以看到 startActivityFromChild 中也会调用 mInstrumentation.execStartActivity 方法。因此,即我们通过 Activity startActivity 的方法启动 activity,最终都会调用到 mInstrumentation.execStartActivity 方法。因此,如果我们想要拦截的话,可以 hook 住 mInstrumentation。

由于 mInstrumentation 是类,不是 interface,不能使用动态代理的方式,因此,这里我们使用静态代理的方式。

下面让我们一起看一下 怎样 hook activity 的 mInstrumentation

  • 第一步:拿到当前 activity 的 mInstrumentation

  • 第二步:创建代理对象

  • 第三步:将我们的代理替换原 activity 的 mInstrumentation

public static void replaceInstrumentation(Activity activity) throws Exception {

Class<?> k = Activity.class;

//通过Activity.class 拿到 mInstrumentation字段

Field field = k.getDeclaredField(“mInstrumentation”);

field.setAccessible(true);

//根据activity内mInstrumentation字段 获取Instrumentation对象

Instrumentation instrumentation = (Instrumentation) field.get(activity);

//创建代理对象

Instrumentation instrumentationProxy = new ActivityProxyInstrumentation(instrumentation);

//进行替换

field.set(activity, instrumentationProxy);

}

public class ActivityProxyInstrumentation extends Instrumentation {

private static final String TAG = “ActivityProxyInstrumentation”;

// ActivityThread中原始的对象, 保存起来

Instrumentation mBase;

public ActivityProxyInstrumentation(Instrumentation base) {

mBase = base;

}

public ActivityResult execStartActivity(

Context who, IBinder contextThread, IBinder token, Activity target,

Intent intent, int requestCode, Bundle options) {

// Hook之前, 可以输出你想要的!

Log.d(TAG,"xxxx: 执行了startActivity, 参数如下: " + “who = [” + who + "], " +

“contextThread = [” + contextThread + “], token = [” + token + "], " +

“target = [” + target + “], intent = [” + intent +

“], requestCode = [” + requestCode + “], options = [” + options + “]”);

// 开始调用原始的方法, 调不调用随你,但是不调用的话, 所有的startActivity都失效了.

// 由于这个方法是隐藏的,因此需要使用反射调用;首先找到这个方法

try {

Method execStartActivity = Instrumentation.class.getDeclaredMethod(

“execStartActivity”,

Context.class, IBinder.class, IBinder.class, Activity.class,

Intent.class, int.class, Bundle.class);

execStartActivity.setAccessible(true);

return (ActivityResult) execStartActivity.invoke(mBase, who,

contextThread, token, target, intent, requestCode, options);

} catch (Exception e) {

// rom修改了 需要手动适配

throw new RuntimeException(“do not support!!! pls adapt it”);

}

}

}

在 ActivityProxyInstrumentation 里面,我们打印相应的 log。

运行以下测试代码

try {

HookHelper.replaceInstrumentation(this);

} catch (Exception e) {

e.printStackTrace();

}

startActivity(new Intent(this,TestActivityStart.class));

将会看到输出以下 log

hook activity 的第二种方法

我们先来看一下 getApplicationContext startActivity 的调用关系

因此,这里我们要 hook 的是 ActivityThread 的 mInstru
mentation

public static void attachContext() throws Exception {

Log.i(TAG, "attachContext: ");

// 先获取到当前的ActivityThread对象

Class<?> activityThreadClass = Class.forName(“android.app.ActivityThread”);

Method currentActivityThreadMethod = activityThreadClass.getDeclaredMethod(“currentActivityThread”);

currentActivityThreadMethod.setAccessible(true);

//currentActivityThread是一个static函数所以可以直接invoke,不需要带实例参数

Object currentActivityThread = currentActivityThreadMethod.invoke(null);

// 拿到原始的 mInstrumentation字段

Field mInstrumentationField = activityThreadClass.getDeclaredField(“mInstrumentation”);

mInstrumentationField.setAccessible(true);

Instrumentation mInstrumentation = (Instrumentation) mInstrumentationField.get(currentActivityThread);

// 创建代理对象

Instrumentation evilInstrumentation = new ApplicationInstrumentation(mInstrumentation);

// 偷梁换柱

mInstrumentationField.set(currentActivityThread, evilInstrumentation);

}

public class ApplicationInstrumentation ext

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Ratel平头哥是一款用于Android系统的hook工具。它可以实现对Android应用程序的动态调试和修改。 这款工具可以在不修改应用程序源代码的情况下,对应用程序进行hook操作。具体来说,Ratel平头哥可以用来修改应用程序中的参数、方法和对象等。同时,它还支持一些高级的hook技术,如Inline Hook和Xposed Hook。 除了hook功能外,Ratel平头哥还具有一些实用的辅助功能,如应用程序稳定性监测、Crash日志收集等。这些功能可以帮助开发者更好地了解应用程序的运行状况,更快地排查和修复bug。 需要注意的是,使用Ratel平头哥进行hook操作需要一定的专业知识和技能。此外,它仅适用于Android系统,对于iOS系统的应用程序无法使用。因此,在使用该工具时,需要谨慎、理性地进行操作,以免影响应用程序的正常运行。 ### 回答2: Ratel平头哥是一款针对Android系统的hook工具,可以帮助开发者在不修改应用程序源代码的情况下,对应用程序进行二次开发和定制化。Ratel平头哥采用了一种名为“沙箱”技术的方式,从而实现了对应用程序的hook。沙箱是指在操作系统中运行的一种隔离环境,它可以模拟硬件环境、网络环境等,从而确保应用程序在沙箱环境中运行时不会影响到操作系统的正常运行。这种技术不仅保护了操作系统的安全性,同时也提高了应用程序的运行效率和稳定性。 Ratel平头哥可以对应用程序的各种相关操作进行hook,例如调用系统API、读取文件、访问网络等等。通过hook这些操作,开发者可以实现对应用程序的加密、优化、广告屏蔽等功能,并抵御恶意攻击、防止反编译等。同时,Ratel平头哥还支持插件化开发,用户可以自己编写插件来完成特定的任务。由于Ratel平头哥具有较强的兼容性,用户无需担心修改后的应用程序会出现各种奇怪的问题。 总之,Ratel平头哥是一款很实用的hook工具,为安卓系统提供了更多的二次开发空间,可以助力开发者快速定制化自己的应用程序。它不仅具有强大的功能,而且还很容易上手,是一款非常值得尝试的工具。 ### 回答3: Ratel平头哥是一种流行的Android Hook工具,它能够助力在Android应用中实现不同的挂钩操作。它支持多种应用中检测活动的方法,如onCreate、onStart、onResume和onPause等。这些都可以被编程人员作为钩子使用,以便更好地分析内存和线程操作,并跟踪应用的运行情况。 Ratel平头哥还支持沙箱技术,并能够用于修改应用程序的原始代码。这些代码可以用于修复应用程序的漏洞,或者用于帮助应用程序中的其他开发人员进行测量和调试操作。平头哥工具旨在为开发人员提供一种简单的方法,以便轻松地重载不同的类,添加自定义函数,或者随时监视应用程序中发生的任何事件。 总的来说,Ratel平头哥是一个功能丰富且易于使用的Android Hook工具,它为开发人员提供了许多有用的功能,并且可以用于监视应用程序的运行和调试过程。使用该工具还可以加速开发过程,提高开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值