c# 十六进制转为字节_从ASM入门字节码增强冰岩分享

ASM入门字节码增强

2e40ffcfd30e725b65eb7d3beee64965.png

ASM作为Java字节码层次的处理框架,能够直接对字节码进行操作,使用ASM能够轻松完成代码注入等字节码增强的相关操作。

基础使用

这里使用一个基础调用展示ASM的使用

val cr = ClassReader(inputStream)val cw = ClassWriter(cr, 0)val cv = MyClassVisitor(Opcodes.ASM6, cw)cr.accept(cv, ClassReader.EXPAND_FRAMES)inputStream.close()val byteArray = cw.toByteArray()

在这里用到了ClassReader,ClassWriter以及一个自定义的ClassVIsitor,首先通过ClassReader读入输入流,之后定义ClassWriter,初始化ClassVisitor,再通过accept开启整个流程,最后通过ClassWriter获取修改过后的输出流。

自定义ClassVisitor如下,这里在Activity的onCreate方法中插入了方法System.out.println(System.currentTimeMills());

class MyClassVisitor(api: Int, cv: ClassVisitor) : ClassVisitor(api, cv) {
        override fun visitMethod(access: Int, name: String?, desc: String?,                             signature: String?, exceptions: Array<out String>?): MethodVisitor? {
            val mv = super.visitMethod(access, name, desc, signature, exceptions)        if (name == "onCreate") {
                mv.visitMaxs(0,0)            return BingyanMethodVisitor(api, mv)        }        return mv    }    private inner class BingyanMethodVisitor(api: Int, mv: MethodVisitor) : MethodVisitor(api, mv) {
            override fun visitCode() {
                super.visitCode()            mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");            mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "currentTimeMillis", "()J", false);            mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(J)V", false);        }    }}

基础准备(字节码)

Class文件结构

ASM作为操作字节码的工具,那么首先会介绍相关字节码的简单结构。用一张表格来表示class文件的结构,class文件中分成了以下十个部分:

字节码结构
名称 大小 描述
魔数 4字节 0xcafebabe
版本号 4字节 次版本号+主版本号
常量池 2字节+N 计数器+数据区
访问标志 2字节 类or接口,以及修饰符
当前类索引 2字节 当前类全限定名(常量池索引)
父类索引 2字节 父类的全限定名(常量池索引)
接口索引 2字节+N 计数器+常量池索引
字段表 2字节+N 计数器+类和接口中声明的变量字段的详细信息
方法表 2字节+N 计数器+方法信息
附加属性 类或接口所定义属性的基本信息

1、魔数

前四个字节是魔数,固定值为:0xCAFEBABE,用来标识一个文件是class文件。

2、版本号

四个字节标示版本号,其中两个字节为次版本号,后两个字节为主版本号。例如 “00 00 00 34” 转化为16进制后分别为 0 和 52。对应版本1.8.0。

3、常量池

  • 计数器

在常量池中前两位是计数器,用来标示在当前class文件中有多少个常量。将16进制转化成10进制之后-1。

  • 数据区

由指定数量的cp_info结构组成,每一个cp_info有两部分或三部分组成。储存字面量与符号引用,字面量即代码中定义的文本字符串等,而符号引用包括类和接口的全限定名,字段的名称和描述符号,方法的名称和描述符。

CONSTANT_Utf8_info tag (1 by
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值