Android开发启动未注册的activity,Hook使用demo

三个工具类

 

1、

/*** @author : LGQ* @date : 2020/05/11 14* @desc :*/
public class HCallback implements Handler.Callback{private final String TAG="HCallback";private Handler mHandler;public HCallback(Handler handler){mHandler=handler;}@Overridepublic boolean handleMessage(Message msg) {//这里为159,是因为EXECUTE_TRANSACTION字段的值为159if(msg.what==159){//r实际为clienttransactionObject r= msg.obj;try {Class clientClazz = r.getClass();Field fCallbacks = clientClazz.getDeclaredField("mActivityCallbacks");fCallbacks.setAccessible(true);//得到transactionz中的callbacks,为一个list,其中元素为LaunActivityItemList<?> lists = (List) fCallbacks.get(r);for(int i=0;i<lists.size();i++){Object item = lists.get(i);Class itemClazz = item.getClass();//拿到LaunActivityItem中的intent,进行替换Field mIntent = itemClazz.getDeclaredField("mIntent");mIntent.setAccessible(true);Intent intent = (Intent) mIntent.get(item);Intent target = intent.getParcelableExtra("target_intent");if(target!=null){intent.setComponent(target.getComponent());}}} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}mHandler.handleMessage(msg);return true;}
}

2、

public class HookHelper {private static  final String TAG="HookHelper";public static void hookAms() throws Exception {Class clazz = null;Field singletonIAMS = null;
//        Class clazz = ActivityManager.class;
//        Field singletonIAMS = clazz.getDeclaredField("IActivityManagerSingleton");if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {clazz = ActivityManager.class;singletonIAMS = clazz.getDeclaredField("IActivityManagerSingleton");}else {clazz =Class.forName("android.app.ActivityManagerNative");singletonIAMS =clazz.getDeclaredField("gDefault");}singletonIAMS.setAccessible(true);Object defultSingleton = singletonIAMS.get(null);Class singletonClazz = Class.forName("android.util.Singleton");Field mInstance = singletonClazz.getDeclaredField("mInstance");mInstance.setAccessible(true);Object iAMs = mInstance.get(defultSingleton);Class iAmClazz =Class.forName("android.app.IActivityManager");Object proxy = Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),new Class[]{iAmClazz},new IActivityManagerProxy(iAMs));mInstance.set(defultSingleton,proxy);}public static void hookHandler() throws Exception{try {// 获取ActivityThread实例Class activityThreadClass = Class.forName("android.app.ActivityThread");Field threadField = activityThreadClass.getDeclaredField("sCurrentActivityThread");threadField.setAccessible(true);Object sCurrentActivityThread = threadField.get(null);// 获取mH变量Field mHField = activityThreadClass.getDeclaredField("mH");mHField.setAccessible(true);final Object mH = mHField.get(sCurrentActivityThread);// 设置mCallback变量Field mCallbackField = Handler.class.getDeclaredField("mCallback");mCallbackField.setAccessible(true);Handler.Callback callback = new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {if (msg.what == 100) {try {Field intentField = msg.obj.getClass().getDeclaredField("intent");intentField.setAccessible(true);Intent intent = (Intent) intentField.get(msg.obj);Intent raw = intent.getParcelableExtra("RawIntent");intent.setComponent(raw.getComponent());} catch (Exception e) {Log.e("hook", "hookActivityThreaderr"+ e);}}return false;}};mCallbackField.set(mH, callback);} catch (Exception e) {Log.e("hook", "hookActivityThreaderr"+ e);}}
}

 3、

public class IActivityManagerProxy implements InvocationHandler {private Object activityManager;private static final String TAG="IActivityManagerProxy";public IActivityManagerProxy(Object activityManager){this.activityManager=activityManager;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if(method.getName().equals("startActivity")){Intent intent =null;int index=0;for(int i=0;i<args.length;i++){if(args[i] instanceof Intent){index=i;break;}}intent = (Intent) args[index];String packageName = "com.suny.hooktest";Intent subIntent = new Intent();//替换activity为已经注册的占坑activity
//            subIntent.setClassName(packageName,packageName+".SubActivity");Intent raw = (Intent) args[index];subIntent.setClassName(raw.getComponent().getPackageName(), StubActivity.class.getName());//同时将真正的intent保存在subintent中,绕过AMS的检查后,将真正的intent替换回来
//            subIntent.putExtra("target_intent",intent);subIntent.putExtra("RawIntent", raw);args[index]=subIntent;Log.d(TAG, "invoke: subIntent="+subIntent+"inteent="+intent);}return method.invoke(activityManager,args);}
}

初始化

public class MyApplication extends Application {@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);try {HookHelper.hookAms();HookHelper.hookHandler();} catch (Exception e) {e.printStackTrace();}}
}

实现demo链接:https://download.csdn.net/download/meixi_android/12409214

bug在线交流:QQ1085220040 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

游戏UI系统设计

1.需要实现的功能 UI界面的管理&#xff08;窗体加载、窗体显示、窗体隐藏、窗体销毁等&#xff09;UI分层次&#xff08;比如弹窗、广播信息需要在上层&#xff09;UI界面的出场、入场动画UI界面的显示效果&#xff08;比如带透明背景、带高斯模糊背景等&#xff09;UI可以动态…

String转List,String转数组,List转ArrayList,数组转List

String转List private List<String> strings; strings Arrays.asList(dataBean.getImgs().split(",")); String转数组 String ac "12&/*?*/3"; String shuzu [] null; shuzu ac.split("");//是[12&/,?,3] 特殊字符用中括…

docker容器配置加速器

1.编辑docker配置文件 vi /etc/docker/daemon.json加入如下配置&#xff1a; {"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]}该链接为中科大加速器地址&#xff0c;无需注册。 2. 执行命令生效 systemctl daemon-reload systemctl res…

软件测试原则

软件测试原则测试 原则 测试原则 测试证明软件存在缺陷 测试的本质是证明软件存在缺陷&#xff0c;而不是软件没有缺陷。 人无完人&#xff0c;只要是人写的代码&#xff0c;肯定不能保证百分之百正确&#xff0c;除非特别简单的功能。即便如此&#xff0c;也会存在各种环境问题…

Unable to add window token null is not valid is your activity running

莫名其妙的报错 错误原因是不在主线程调用了弹窗方法 解决方法很简单 创建Handler static final int REFRESH_COMPLETE 0X1112; private Handler mHandler new Handler() {public void handleMessage(android.os.Message msg) {switch (msg.what) {case REFRESH_COMPLETE:Ob…

01-Flutter移动电商实战-项目学习记录

01-Flutter移动电商实战-项目学习记录 一直想系统性的学习一下 Flutter&#xff0c;正好看到该课程《Flutter移动电商实战》的百度云资源&#xff0c;共 69 课时&#xff0c;由于怕自己坚持不下去&#xff08;经常学着学着就不学了&#xff09;&#xff0c;故采用博客监督以记之…

matplotlib 的一些知识

import matplotlib.pyplot as plt plt做图有两种方式&#xff0c;一种是面向对象编程方式的&#xff0c;一种是直接利用plt的结构化的快速绘图编程方式。所以命令不能用错地方。figplt.figure() 返回的fig为Figure类对象 ax1fig.add_subplot(111) 返回的ax1为Axes类对象 这个…

02-Flutter移动电商实战-建立项目和编写入口文件

02-Flutter移动电商实战-建立项目和编写入口文件 环境搭建请参考之前写的一篇文章&#xff1a;Flutter_初体验_创建第一个应用 1、创建项目 采用AndroidStudio构建本项目&#xff0c;FIle>New>New Flutter Project… 创建后的项目如下图所示&#xff1a; 我们着重需要…

Android 倒计时——Timer和CountDownTimer的使用,实现启动,暂停,继续,重复,重设时长以及启动service后台倒计时

实现效果 单个倒计时功能 列表倒计时功能 自定义倒计时类 public class CountDownTimerSupport implements ITimerSupport {private Timer mTimer;private Handler mHandler;/*** 倒计时时…

cin和scanf读入速度

cin慢是有原因的&#xff0c;其实默认的时候&#xff0c;cin与stdin总是保持同步的&#xff0c;也就是说这两种方法可以混用&#xff0c;而不必担心文件指针混乱&#xff0c;同时cout和stdout也一样&#xff0c;两者混用不会输出顺序错乱。正因为这个兼容性的特性&#xff0c;导…

03-Flutter移动电商实战-底部导航栏制作

03-Flutter移动电商实战-底部导航栏制作 1、cupertino_IOS风格介绍 在Flutter里是有两种内置风格的&#xff1a; material风格&#xff1a; Material Design 是由 Google 推出的全新设计语言&#xff0c;这种设计语言是为手机、平板电脑、台式机和其他平台提供一致&#xff…

plugin since you are using Gradle version 4.6 or above

Android studio项目在新的开发环境下打开时报错如下 解决方法如下&#xff1a; 1、目录选到Android状态 2、进入gradle.properties文件。 3、org.gradle.configureondemandfalse——————默认是true。改完false即可

[转]调试 smallcorgi/Faster-RCNN_TF 的demo过程遇到的问题

最近在调试faster R-CNN时&#xff0c;遇到了各种各样的问题。使用的算法库为https://github.com/smallcorgi/Faster-RCNN_TF 注&#xff1a;本文使用的是通过virtualenv 创建python虚拟环境进行调试&#xff0c;python 版本2.7&#xff0c;tensorflow 版本为tensorflow1.4-gpu…

04-Flutter移动电商实战-打通底部导航栏

04-Flutter移动电商实战-打通底部导航栏 关于界面切换以及底栏的实现可参考之前写的一篇文章&#xff1a;Flutter实 ViewPager、bottomNavigationBar界面切换 1、新建4个基本dart文件 在pages目录下&#xff0c;我们新建下面四个dart文件。 home_page.dart :商城首页UI页面…