当前位置: 首页 > 网络应用技术

字节码参考检测原理和实际战斗

时间:2023-03-07 00:01:28 网络应用技术

  本章中的字节码关注Java字节码。Java Bytecode是由Java Virtual Machine执行的指令格式。您可以通过Javap -c -c -v XXX.Class(类文件路径)命令查看与类代码相对应的字节代码文件,如下图:

  字节码检测的本质是分析和检测编译.java或.kt文件后生成的类文件。在根据参考检测原则构成字节码分析的原理之前,以下介绍了字节代码的技术预研究背景参考检测。

  需要从应用程序的软件体系结构(我负责的官方网站应用程序)中提及整个前研究背景。

  国内销售官方网站目前有12个Zicharacks。Zicang被独立编译为应用程序项目的AAR文件。软件体系结构图如下图:

  在应用程序下方,浅蓝色的上层是业务层,中间绿色是组件层,底部深蓝色为基础框架:

  假设以下场景:

  在官方网站App5.0版本的开发过程中,由于硬件仓库没有业务修改,因此它继续使用4.9.0.0的硬件的先前版本(在版本开发过程中,它只会删除该硬件需要修改的仓库。染色版),但是核心仓库具有代码修改,因此已拉出新的5.0分支,并且对相关代码进行了修改以在Coreutils类中删除FUN1方法,如下图所示。:

  注意:硬件检测模块v4.9.0.0 AAR在核心仓库coreutils.class中使用fun1方法。其他仓库包括fun1方法,而无需使用主应用程序。

  请考虑一下,上述场景项目的汇编会有问题吗?

  答:编译没有问题

  该应用程序的主要位置取决于版本4.9.0.0中硬件仓库编译的AAR文件。该AAR文件早在4.9版本就不会移动,因此硬件仓库没有编译问题。

  主要仓库取决于版本5.0.0.0的核心仓库。硬件依赖于4.9.0.0版本的核心仓库。最后,将编译高版本5.0.0.0版本的核心仓库。FUN1方法没有编译问题。

  上述场景项目的操作期间会有问题吗?

  答:有问题。

  当应用程序运行到硬件仓库时,FUN1方法用于在Coreutils类中运行。

  最后,应用工程编译是版本5.0.0.0的核心仓库。此版本已通过fun1方法删除,因此将出现运行时错误。

  真实情况:

  1)找不到方法

  2)找不到课程

  幸运的是,在开发和测试阶段发现了上述问题并在时间上固定。如果它流到生产线时,当它运行到功能时,它是必不可少的场景,这将非常严重。

  如果您对源代码依赖性负责该应用程序的所有模块,如果存在参考问题,则编译器将发出提示,因此无需担心(除非底部SDK依靠参考问题),但是,如果它与官方网站相似,则是官方网站。需要注意软件体系结构。

  在本地测试期间,参考问题期间存在异常运行。运行时的这种异常检测是不够的。必须有一个自动检测工具进行检查。传统发现虫,皮棉等是代码静态检测工具。无法检测到由此潜在的参考问题引起的异常运行时。静态代码检测无法解决此问题。因此,自动开发的自动化测试工具即将到来!

  如果在APK汇编期间,可以通过所有JAR和AAR软件包中的每个类对其进行测试。,并输出错误日志以提醒开发人员进行检查,以防止在运行时在问题流入时进行异常。

  原理:将每个子软件设备的Java类(或Kotlin类)编译为AAR或JAR后,将在AAR和JAR中具有各种类文件。实际上,我们需要分析编译后生成的类文件。

  如何在类文件上分析字节代码?

  建议使用Javaassist或AM。我们知道,Android汇编过程主要由Gradle控制。要分析类文件字节码,我们需要实现自己的gradle变换。制作gradle插头。

  在汇编期间,对类字节码是否具有方法参考,属性参考,无法找到的类参考或无权访问当前类别,发现停止编译的问题和与输出相关日志的问题,提醒,请提醒,提醒开发人员分析并支持插件 - 插件 - configuration。

  在这一点上,整个计划的主要框架更清晰,如下图所示:

  方法和属性参考问题:

  如何确定一种参考方法?

  如何使用属性(字段)参考确定问题?

  永久修饰符描述:

  方法和属性参考字节码检测:我们可以使用Javaassist,ASM和其他库来支持字节码操作以在所有类中实现扫描方法和属性,并分析调用方法的方法,以及属性引用是否有参考问题。

  以下代码已写在Kotlin中,省略了Gradle插件和转换的特定过程以直接检测代码。方法,现场参考检测:

  在实现上述代码中,所有方法都已遍历以检测方法中的方法调用和字段访问。因此如何检查全局变量?

  例如,在上面的代码中,测试MTEST1属性的值和MTEST2属性的值应如何进行?此问题使作者很长一段时间都困扰了作者。没有与当前值的当前值相关的API在Javaassist和ASM中找不到属性,类字节码的相关思想和材料直接分析了属性值。

  在研究了类字节码相关的知识并进行大量实验之后,在大量日志之后,该溶液逐渐浮出水面。

  让我们看一下BillActivity的字节守则:

  在这里,我们找到了MTEST1的全局变量的定义,然后每个人都可以注意到右侧的方法中出现了INIT方法。实际上,Java将在编译后在字节码文件中生成INIT方法,这称为实例构造函数。此Instance构造函数将收敛语句块,变量,并将parent -Class构造函数和其他操作调用到INIT方法中。关于MTEST2的全局变量?

  搜索后,发现MTEST2实际上在静态代码块中。似乎MTEST2并未包裹在MTEST2的方法中,如下图所示:

  实际上,在咨询了大量信息之后,Java将在编译后的字节码文件中生成临床方法,这称为构造函数。上图上图未显示在类Bytecode中的Javap中的Javap,因为Javap没有Javap,因为Javap并未显示Javap在此上进行相关的适应性显示。

  发现MTEST2的初始化通过实验日志出现在临床方法中,并查看与Asmplugin字节码中的上图相同的字节代码,并显示了具有Clinit方法识别的字节代码,如下图所示:

  在这里研究,我们实际上知道MTEST1和MTEST2的分配实际上发生在初始化和临床方法中。因此,以前的遍历类中的所有方法都可以检测方法和属性涵盖全局变量。

  这个问题似乎在这里得到了完美的解决,但是在浏览了全球变量的代码后,我再次发现了新问题:新问题:

  我们只关心标签属性和getFormatProvinceinfo的引号是否存在问题,但是我们没有针对CreateNewadDressActivity的参考检查。假设此类是私人的,这里仍然会有问题。因此,我们引用了检查类参考的检查。

  如何确定课程参考?

  班级报价检查

  在这一点上,引用该字节码检测的原则已完成。

  在国内销售官方网站的BuildSRC中实现了参考检测功能后,许多其他应用程序已被模块化。认为其他应用程序也可能使用类似官方网站的模块化结构,会有类似的痛点。没有一般的访问能力。我觉得这一事件还没有完成。解决了自己的应用程序的疼痛点之后,您需要水平增强其他应用程序,以解决大型团队所面临的疼痛点。

  如果需要在编译过程中引用的应用模块,欢迎您访问由我引用的字节代码检测到的gradle插件。

  1)独立的Gradle插头,方便所有应用程序访问;

  2)支持常用的开发配置项目,支持插件功能开关,异常跳过和其他配置;

  3)引用Java和Kotlin汇编编辑的字节代码。当在CI和Jenkins上编译APK软件包以找到参考问题时,它可以编译和报告一个错误和输出特定信息,以解决用于开发,分析和解决方案的参考问题。

  1)方法引用检测;

  2)属性(字段)参考检测;

  3)类参考检测;

  4)插头支持常用的配置,可以关闭。

  例如,可以检测未找到或找不到的类方法的问题的问题。编译过程中的整个插头非常短。例如,国内官方网站应用程序就是一个例子。在应用程序编译期间运行的插头大约为2.3秒,速度很快。您不必担心增加编译时间。

  将依赖项添加到主要工程根目录build.gradle的根源:Gradle:

  使用插件-in并在build.gradle中设置配置信息。

  启用:是否打开参考检查功能,如果是错误的,则没有参考检查

  strictmode:当严格模式打开时,发现参考异常直接中断并直接编译(当关闭严格模式时,仅在编译过程中仅在日志中击中异常信息,并且它是发现参考问题不会终止汇编)。

  建议:当Jekins或CI播放发布包时,在build.gradle中配置的启用和严格模式设置为true。

  检查:需要检测到包装名称。通常,仅配置当前的应用程序包名称。如果您需要检查第三方SDK依赖性,则可以根据需要进行配置。

  Notwarn:我发现参考问题没有错。在开发人员检查错误报告插件的问题并确定它不会导致崩溃的问题之后,您可以在此处配置当前未引用的类名称,并且可以跳过检查。如果不参考类A。B类中的方法,您可以在此处配置B类的名称,并且不会出现错误。

  官方网站应用程序应用程序org.apache.http和com.core.core.videocompressor.videocontroller to to White List.org.apache.htp实际上在Android系统中使用了软件包。该软件包不参与APK汇编。如果未添加配置项目,将报告错误,但是实际操作不会造成错误。

  com.core.videocompressor.videocontroller如果不添加,将报告一个错误:fileprocessFactory不能引用compressionProgressListener类。检查FILEPROCESSFACTORY代码,138行的138行FileProcessFactory类,呼叫conversvidener listner listner listner listner listner parameter ins is crospvidener参数。通过null。

  该类的字节代码类文件如下,最后一个参数null将转换为convervideo的最后一个参数:

  而且该CompressProgressListener不是公开的,它是默认软件包。fileProcessFactory类与CompressProgressListener不同,因此将报告错误。给未报告的白名单。

  如果您遇到在使用插头时不应报告的情况,则可以跳过白色列表控件。同时,我希望给我这个案子。我分析了案例并迭代插件更新。

  在研究前过程中,由于对字节码的更深入了解以及在网络上生成代码的许多教程,因此有更多用于生成代码的教程,但是对于字节码分析来说,信息太少了,因此您需要成为熟悉字节代码的知识在实践中进行实验和探索,需要缓慢地抛光细节。

  在研究前过程中,积极考虑解决方案的通用性和可配置性,并最终开发了通用的Gradle插头,积极促进其他模块访问,利用这一宝贵机会来增强水平技术的能力,并努力为成功的成功而努力大型团队。

  当前有两个App Accessories Plug -in,插件 - 将继续维护并迭代。插件稳定后,计划将计划集成在CI和Jenkins上。所需的应用程序访问已被检测到的Gradle插件,希望帮助使用引用检测痛点的应用程序和团队。

  作者:Vivo官方网站购物中心客户团队QI Haoxin