当前位置: 首页 > news >正文

建立网站的过程百度指数怎么查

建立网站的过程,百度指数怎么查,影视自助建站系统源码,网站如何做脚注一、APP启动流程(结合源码分析) 当我们点击APP图标,到APP运行启动,中间经历了怎样的过程?可以用一张图来概括: 首先启动Activity/Service,(Activity、Service是什么?四大组件:Activity、Serv…

一、APP启动流程(结合源码分析)

当我们点击APP图标,到APP运行启动,中间经历了怎样的过程?可以用一张图来概括:
在这里插入图片描述

首先启动Activity/Service,(Activity、Service是什么?四大组件:Activity、Service、BroadCast Recevicer、Content provider),通知system_server进程,然后以Binder的方式通知Zygote进程,最终进入ActivityThread.main(),开始进入APP世界的大门。

我们打开http://androidxref.com/8.0.0_r4/xref/frameworks/base/core/java/android/app/ActivityThread.java,对ActivityThread进行源码分析,了解启动流程。

ActivityThread是单例创建,sCurrentActivityThread是全局创建的ActivityThread实例。其中currentActivityThread()是静态方法,可以返回我们当前创建的ActivityThread。

在这里插入图片描述

ActivityThread.main()函数是java中的入口main函数,这里会启动主消息循环,创建ActivityThread实例,之后调用thread.attach(false)完成一系列初始化准备工作。之后主线程进入消息循环(bindleMessage函数),等待接收来自系统的消息。
在这里插入图片描述

当收到系统发送来的bindapplication的进程间调用时,调用handlebindapplication来处理该请求。
在这里插入图片描述

还有ArrayMap类型的mPackages变量需要注意下,这是加载APP存放的内容,LoadApk函数如下:

在这里插入图片描述

我们获取mPackages,和包名就可以获取动态加载的APP包内容,这后面会用到。

接下来,我们看下handleBindApplication函数,内容比较多。

在这里插入图片描述

学习寒冰大佬的说法,这个函数主要完成以下的任务。

private void handleBindApplication(AppBindData data) {//step 1: 创建LoadedApk对象data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo);...//step 2: 创建ContextImpl对象;final ContextImpl appContext = ContextImpl.createAppContext(this, data.info);//step 3: 创建InstrumentationmInstrumentation = new Instrumentation();//step 4: 创建Application对象;在makeApplication函数中调用了newApplication,在该函数中又调用了app.attach(context),在attach函数中调用了Application.attachBaseContext函数Application app = data.info.makeApplication(data.restrictedBackupMode, null);mInitialApplication = app;//step 5: 安装providersList<ProviderInfo> providers = data.providers;installContentProviders(app, providers);//step 6: 执行Application.Create回调mInstrumentation.callApplicationOnCreate(app);

在handleBindApplication函数中,第一次进入了app代码世界,该函数启动了一个application,并把apk组件等相关信息绑定到application里,在创建完application对象后,接着调用了application的attachBaseContext方法,之后调用了application的onCreate函数。

正常APP启动过程:
在这里插入图片描述

由此可见,attachBaseContext和onCreate是最先获取代码执行权的,这也是为什么各家的加固工具主要逻辑都是替换app入口Application,并自实现这两个函数。这也是为什么在这两个地方进行脱壳的原因。

加壳APP运行流程

加壳APP运行过程:

在这里插入图片描述

壳要做的工作有:

1、要对原先APP的dex进行解密

2、初始化自定义类加载器

3、替换LoadApk中的加载器为自定义加载器。

上一篇文章讲述了,如何调用加载其他dex内的方法,那么如果我想调用dex内的其他Activity能不能,用同样的方法能不能行得通呢?

上代码截图:
在这里插入图片描述

然后build提取APK的classes.dex,adb push到手机上

adb push classes.dex /sdcard/4.dex

然后新建工程,赋予读写存储卡权限,写入 调用读取4.dex的TestActivity方法,那么很快啊,就会显示报错,无法调用。
在这里插入图片描述

究其原因是什么呢?因为Activity不像是上篇文章中的函数方法,Activity具有生命周期和相关组件信息,只有当classloader被修正后,才能正确加载被解密后的dex类和方法。顺便提一点,壳在函数attachBaseContext和onCreate中完成对加密的dex文件的解密。

修复classloader

如何修正呢?

有两种方法:

  • 方法一:通过层层反射,拿到mPackage内容,然后根据报名通过LoadApk获取APP内的类加载器,最终使用自定义类加载器进行替换。
  • 方法二:利用双亲委派机制,在BootClassloader和PathClassloader中插入我们自定义的类加载器,完成修复。
方法一

在这里插入图片描述

根据java的反射,和开源的java代码,进行一步步反射。(可对照androidxref,逐步理解以下代码)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LZHHspV2-1606453346989)(/Users/liyang/Library/Application Support/typora-user-images/image-20201127124124072.png)]

然后在原先的基础上调用replaceClassloader即可。

在这里插入图片描述

方法二

在这里插入图片描述

    public void startTestActivitySecondMethod(Context context,String dexfilepath){File optfile=context.getDir("opt_dex",0);File libfile=context.getDir("lib_path",0);ClassLoader pathClassloader=MainActivity.class.getClassLoader();ClassLoader bootClassloader=MainActivity.class.getClassLoader().getParent();//这里的改变,MainActivity.class.getClassLoader()变成bootClassloader,意思是,这里的DexClassLoader,直接向BootClassLoader汇报的DexClassLoader dexClassLoader=new DexClassLoader(dexfilepath,optfile.getAbsolutePath(),libfile.getAbsolutePath(),bootClassloader);try {Field parentField=ClassLoader.class.getDeclaredField("parent");parentField.setAccessible(true);//把pathclassloader插入我们的dexClassLoaderparentField.set(pathClassloader,dexClassLoader);} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}
/*
* this:dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.kanxue.loaddex-8_fCxispeBuExjw1ryrRZg==/base.apk"],nativeLibraryDirectories=[/data/app/com.kanxue.loaddex-8_fCxispeBuExjw1ryrRZg==/lib/arm64, /system/lib64, /vendor/lib64]]]--parent:dalvik.system.DexClassLoader[DexPathList[[dex file "/sdcard/6.dex"],nativeLibraryDirectories=[/data/user/0/com.kanxue.loaddex/app_lib_path, /system/lib64, /vendor/lib64]]]
this:dalvik.system.DexClassLoader[DexPathList[[dex file "/sdcard/6.dex"],nativeLibraryDirectories=[/data/user/0/com.kanxue.loaddex/app_lib_path, /system/lib64, /vendor/lib64]]]--parent:java.lang.BootClassLoader@fd4323d
root:java.lang.BootClassLoader@fd4323d*//** PathClassLoader => DexClassLoader => BootClassLoader* */ClassLoader tmpClassloader=pathClassloader;ClassLoader parentClassloader=pathClassloader.getParent();while(parentClassloader!=null){Log.i("kanxue","this:"+tmpClassloader+"--parent:"+parentClassloader);tmpClassloader=parentClassloader;parentClassloader=parentClassloader.getParent();}Log.i("kanxue","root:"+tmpClassloader);Class<?> clazz=null;try {clazz = dexClassLoader.loadClass("com.kanxue.test02.TestActivity");} catch (ClassNotFoundException e) {e.printStackTrace();}context.startActivity(new Intent(context,clazz));}
壳工作方式

而第一种方式,是加壳厂商经常会用的方式,也就是通过自定义dexclassloader对原先的类加载器进行替换修复。

这里还分为两种情况,一种是原始的APP没有自定义Application子类,那么这种情况比较简单,直接替换壳的Application即可。

另一种情况,是原始APP定义了Application子类,那么壳Application的工作就不仅仅是进行解密、类加载器修复等工作了,还有对解密后的DEX原始的Application的方法和类重新进行处理,保证整个过程运行顺畅。

我们可以看AndroidManifest.xml内的主Application是否被替换为壳Application入口,就可以了解到,同时观察壳Application的汇编代码,会发现进行了大量的修复。

Reference

https://bbs.pediy.com/thread-252630.htm

http://www.yidumall.com/news/3360.html

相关文章:

  • 深圳做网站推荐哪家公司好app开发多少钱
  • c2c网站制作品牌营销案例分析
  • 网站设计建设合同百度实时热搜榜
  • 网站前端是做啥的搜索引擎快速排名推广
  • 怎么做外贸网站推广制作网页多少钱
  • 巴中建设厅网站电话百度公司推广电话
  • 粉丝社区网站怎么做深圳抖音推广公司
  • 深圳深圳网站开发链接交换平台
  • 汽车网站开发背景广告推广的软件
  • qq炫舞做字网站淘宝联盟怎么推广
  • html5电影网站如何做长沙网动网络科技有限公司
  • 阿里云可以做网站百度快照网站
  • 自己怎么建设手机网站首页搜索引擎优化的内部优化
  • 联合建设官方网站百度推广代理
  • 磁力搜索网站怎么做的如何提升关键词的自然排名
  • 企业用什么做网站象山关键词seo排名
  • 计算机专业做网站运营网络营销个人感悟小结
  • 网站制作潍坊区域网络营销课程心得体会
  • 长春手机网站360站长平台
  • 上海网站开发哪里好薇长沙网
  • 软件开发包含网站开发吗免费推广平台有哪些
  • 在网站上怎么做招聘信息做网络推广需要多少钱
  • app调用网站百度一下百度主页度
  • pk10网站怎么做百度网页版登录入口官网
  • 免费ai设计logo网站班级优化大师怎么加入班级
  • 买了个域名 如何自己做网站1个百度指数代表多少搜索
  • 武汉光谷网站建设chatgpt 网址
  • 商城网站设计公司怎么做关键词优化排名
  • 机械毕业设计代做网站网站优化设计公司
  • 如何做网站效果更好免费二级域名注册网站