• 加固前奏2-替换application


    运行加载过程
    ActivityThread.JAVA
    Application app = data.info.makeApplication(data.restrictedBackupMode, null);
                                ->进入LoadedApk.java
                                        String appClass = mApplicationInfo.className;
                                        app.attachBaseContext()        //可控函数
                                        ...
                                        mActivityThread.mAllApplications.add(app);
                                        mApplication = app;
                                <-退出
    mInitialApplication = app;
    mInstrumentation.callApplicationOnCreate(app);
                                ->    app.onCreate()                //可控函数

    onCreate中实现

            Object currentActivityThread = javaRef.invokeStaticMethod("android.app.ActivityThread", "currentActivityThread",
                    new Class[]{}, new Object[]{});
    				
            Object mBoundApplication = javaRef.getFieldValue("android.app.ActivityThread", "mBoundApplication", currentActivityThread);
            Object loadedApk = javaRef.getFieldValue("android.app.ActivityThread$AppBindData", "info", mBoundApplication);
    
            javaRef.setFieldValue("android.app.LoadedApk", "mApplication", loadedApk, null);
            ApplicationInfo applicationInfo_loadapk = (ApplicationInfo) javaRef.getFieldValue("android.app.LoadedApk", "mApplicationInfo", loadedApk);
            String desAppName = "com.cc.shell.MyApplication";
            applicationInfo_loadapk.className = desAppName;
    
            Application oldApplication = (Application) javaRef.getFieldValue("android.app.ActivityThread", "mInitialApplication", currentActivityThread);
    
            ArrayList<Application> mAllApplications = (ArrayList<Application>) javaRef.getFieldValue("android.app.ActivityThread",
                    "mAllApplications", currentActivityThread);
            mAllApplications.remove(oldApplication);
    
            Application realApp = (Application) javaRef.invokeMethod("android.app.LoadedApk", "makeApplication", loadedApk
                    , new Class[]{boolean.class, Instrumentation.class}, new Object[]{false, null});
    
            realApp.onCreate();
    
            javaRef.setFieldValue("com.android.ActivityThread", "mInitialApplication", currentActivityThread, realApp);
  • 相关阅读:
    把图片转换成二进制--把二进制转换成图片
    .NET 读取视频文件
    winform ListView创建columnHeader的方法
    VUE篇 3、this指向问题、双向数据绑定 、局部/全局组件、父子传值 、兄弟传值(平行组件传值)
    爬虫 5 scrapy框架 虎牙scrapy示例
    爬虫 空气质量爬取分析
    爬虫 4 selenium
    爬虫3 request3高级 代理操作、模拟登录、单线程+多任务异步协程
    爬虫2 数据解析 --图片 、bs4 、xpath 、l乱码的一个解决方法 “|”
    vue篇 2、简单的轮播图 ajax、简单的音乐播放器、计算属性computed
  • 原文地址:https://www.cnblogs.com/lyxin/p/10052313.html
Copyright © 2020-2023  润新知