[ASM教程]#5字符串混淆

简介: 测试类,需要混淆这里所有的字符串,上一期我们学习了如果插入一个常量,那么拦截插入常量的时候判断是不是字符串,如果是就混淆它。

首发于Enaium的个人博客


测试类,需要混淆这里所有的字符串,上一期我们学习了如果插入一个常量,那么拦截插入常量的时候判断是不是字符串,如果是就混淆它。

public class Learn5Test {
   
    private final String name = "Enaium";

    private Learn5Test() {
   
        render(name);
    }

    private void render() {
   
        System.out.println("obfuscatory by " + name);
    }

    private void render(String text) {
   
        System.out.println(text);
    }
}

重写方法访问。

@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
   
    return new MethodVisitor(api, super.visitMethod(access, name, desc, signature, exceptions)) {
   

    };
}

重写常量访问。

@Override
public void visitLdcInsn(Object cst) {
   

}
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
   
    return new MethodVisitor(api, super.visitMethod(access, name, desc, signature, exceptions)) {
   
        @Override
        public void visitLdcInsn(Object cst) {
   
            if (cst instanceof String) {
   //判断是不是字符串类型,如果不是不重写。
                byte[] bytes = ((String) cst).getBytes();//先将字符串转换为字节组。
                mv.visitTypeInsn(NEW, "java/lang/String");//创建字符串对象。
                mv.visitInsn(DUP);
                mv.visitIntInsn(SIPUSH, bytes.length);//将字符串转换的字节组插入。
                mv.visitIntInsn(NEWARRAY, T_BYTE);
                for (int i = 0; i < bytes.length; i++) {
   
                    mv.visitInsn(DUP);
                    mv.visitIntInsn(SIPUSH, i);
                    mv.visitIntInsn(SIPUSH, bytes[i]);
                    mv.visitInsn(AASTORE);
                }
                mv.visitLdcInsn("UTF-8");
                mv.visitMethodInsn(INVOKESPECIAL, "java/lang/String", "<init>", "([BLjava/lang/String;)V", false);//调用String的构造方法,把字节组转换为字符串,使用UTF-8保证中文不乱码,因为字符串有一个解密的过程,所以反字符串混淆也很简单。
            } else {
   
                super.visitLdcInsn(cst);
            }
        }
    };
}
目录
相关文章
[ASM教程]#4创建对象和数组
这期我们要创建一个对象和数组。
92 0
|
Java
[ASM教程]#1分析类
ASM是一种通用Java字节码操作和分析框架,它可以用于修改现有的class文件或动态生成class文件。
144 0
|
API
[ASM教程]#6树API
使用树API来生成一个类
87 0
[ASM教程]#3增加移除类成员
可以委托一个ClassWriter。
80 0
[ASM教程]#2生成类
使用classWriter生成类
73 0
|
Java 编译器 测试技术
使用 Java ASM 替换字符串常量
具体来说,这个区块链是 Neo N3 区块链,其中 Java 的语言支持由 Neow3j 这个库提供。这个库允许开发者使用任意 JVM 语言开发合约,并根据最终编译的 Java 字节码生成 Neo 的可执行合约。因此上文提到的合约就是使用 Java 开发的,没有用 Kotlin 的原因就是怕翻车。
405 0
|
7月前
|
Oracle 关系型数据库
oracle asm 磁盘显示offline
oracle asm 磁盘显示offline
354 2
|
2月前
|
存储 Oracle 关系型数据库
数据库数据恢复—Oracle ASM磁盘组故障数据恢复案例
Oracle数据库数据恢复环境&故障: Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 ,ASM实例不能mount。 Oracle数据库故障分析&恢复方案: 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储元数据损坏,导致磁盘组无法挂载。
|
7月前
|
存储 Oracle 关系型数据库
【数据库数据恢复】Oracle数据库ASM磁盘组掉线的数据恢复案例
oracle数据库ASM磁盘组掉线,ASM实例不能挂载。数据库管理员尝试修复数据库,但是没有成功。
【数据库数据恢复】Oracle数据库ASM磁盘组掉线的数据恢复案例
|
SQL Oracle 关系型数据库
Oracle ASM磁盘和磁盘组的常用SQL语句
Oracle ASM磁盘和磁盘组的常用SQL语句
289 0