精华内容
下载资源
问答
  • 解析class文件案例介绍 本案例主要介绍通过java代码class文件中解析;class文件、常量池、属性表;作为类(或者接口)信息的载体,每个class文件都完整地定义了一个类。为了使java程序可以“编写一次,处处运行”,...
    3daa94ec21b51f4fe82ef0cc7fc7028a.png

    解析class文件

    案例介绍

    本案例主要介绍通过java代码从class文件中解析;class文件、常量池、属性表;

    作为类(或者接口)信息的载体,每个class文件都完整地定义了一个类。为了使java程序可以“编写一次,处处运行”,Java虚拟机规范对class文件格式进行了严格的规定。但是另外一方面,对于从哪里加载class文件,给了足够多的自由。Java虚拟机实现可以从文件系统读取和从JAR(或ZIP)压缩包中提取clss文件。除此之外,也可以通过网络下载、从数据库加载,甚至是在运行中直接生成class文件。Java虚拟机规范中所指的class文件,并非特指位于磁盘中的.class文件,而是泛指任何格式符号规范的class数据。

    环境准备

    1. jdk 1.8.0
    2. IntelliJ IDEA Community Edition 2018.3.1 x64

    配置信息

    1. 配置位置:Run/Debug Configurations -> program arguments
    2. 配置内容:-Xjre "C:Program FilesJavajdk1.8.0_161jre" java.lang.String

    代码示例

    https://github.com/fuzhengwei/itstack-demo-jvm/tree/master/itstack-demo-jvm-03

    itstack-demo-jvm-03├── pom.xml└── src └── main │ └── java │ └── org.itstack.demo.jvm │ ├── classfile │ │ ├── attributes {BootstrapMethods/Code/ConstantValue...} │ │ ├── constantpool {CONSTANT_TAG_CLASS/CONSTANT_TAG_FIELDREF/CONSTANT_TAG_METHODREF...} │ │ ├── ClassFile.java │ │ ├── ClassReader.java │ │ └── MemberInfo.java  │ ├── classpath │ │ ├── impl │ │ │ ├── CompositeEntry.java │ │ │ ├── DirEntry.java  │ │ │ ├── WildcardEntry.java  │ │ │ └── ZipEntry.java  │ │ ├── Classpath.java │ │ └── Entry.java  │ ├── Cmd.java │ └── Main.java └── test └── java └── org.itstack.demo.test └── HelloWorld.java

    代码篇幅较长,不一一列举

    AttributeInfo.java

    package org.itstack.demo.jvm.classfile.attributes;import org.itstack.demo.jvm.classfile.ClassReader;import org.itstack.demo.jvm.classfile.attributes.impl.*;import org.itstack.demo.jvm.classfile.constantpool.ConstantPool;/** * http://www.itstack.org * create by fuzhengwei on 2019/4/26 */public interface AttributeInfo { void readInfo(ClassReader reader); static AttributeInfo[] readAttributes(ClassReader reader, ConstantPool constantPool) { int attributesCount = reader.readU2ToInt(); AttributeInfo[] attributes = new AttributeInfo[attributesCount]; for (int i = 0; i < attributesCount; i++) { attributes[i] = readAttribute(reader, constantPool); } return attributes; } static AttributeInfo readAttribute(ClassReader reader, ConstantPool constantPool) { int attrNameIdx = reader.readU2ToInt(); String attrName = constantPool.getUTF8(attrNameIdx); int attrLen = reader.readU4ToInt(); AttributeInfo attrInfo = newAttributeInfo(attrName, attrLen, constantPool); attrInfo.readInfo(reader); return attrInfo; } static AttributeInfo newAttributeInfo(String attrName, int attrLen, ConstantPool constantPool) { switch (attrName) { case "BootstrapMethods": return new BootstrapMethodsAttribute(); case "Code": return new CodeAttribute(constantPool); case "ConstantValue": return new ConstantValueAttribute(); case "Deprecated": return new DeprecatedAttribute(); case "EnclosingMethod": return new EnclosingMethodAttribute(constantPool); case "Exceptions": return new ExceptionsAttribute(); case "InnerClasses": return new InnerClassesAttribute(); case "LineNumberTable": return new LineNumberTableAttribute(); case "LocalVariableTable": return new LocalVariableTableAttribute(); case "LocalVariableTypeTable": return new LocalVariableTypeTableAttribute(); // case "MethodParameters": // case "RuntimeInvisibleAnnotations": // case "RuntimeInvisibleParameterAnnotations": // case "RuntimeInvisibleTypeAnnotations": // case "RuntimeVisibleAnnotations": // case "RuntimeVisibleParameterAnnotations": // case "RuntimeVisibleTypeAnnotations": case "Signature": return new SignatureAttribute(constantPool); case "SourceFile": return new SourceFileAttribute(constantPool); // case "SourceDebugExtension": // case "StackMapTable": case "Synthetic": return new SyntheticAttribute(); default: return new UnparsedAttribute(attrName, attrLen); } }}

    ConstantInfo.java

    package org.itstack.demo.jvm.classfile.constantpool;import org.itstack.demo.jvm.classfile.ClassReader;import org.itstack.demo.jvm.classfile.constantpool.impl.*;/** * http://www.itstack.org * create by fuzhengwei on 2019/4/26 */public interface ConstantInfo { int CONSTANT_TAG_CLASS = 7; int CONSTANT_TAG_FIELDREF = 9; int CONSTANT_TAG_METHODREF = 10; int CONSTANT_TAG_INTERFACEMETHODREF = 11; int CONSTANT_TAG_STRING = 8; int CONSTANT_TAG_INTEGER = 3; int CONSTANT_TAG_FLOAT = 4; int CONSTANT_TAG_LONG = 5; int CONSTANT_TAG_DOUBLE = 6; int CONSTANT_TAG_NAMEANDTYPE = 12; int CONSTANT_TAG_UTF8 = 1; int CONSTANT_TAG_METHODHANDLE = 15; int CONSTANT_TAG_METHODTYPE = 16; int CONSTANT_TAG_INVOKEDYNAMIC = 18; void readInfo(ClassReader reader); int tag();  static ConstantInfo readConstantInfo(ClassReader reader, ConstantPool constantPool) { int tag = reader.readU1ToInt(); ConstantInfo constantInfo = newConstantInfo(tag, constantPool); constantInfo.readInfo(reader); return constantInfo; } static ConstantInfo newConstantInfo(int tag, ConstantPool constantPool) { switch (tag) { case CONSTANT_TAG_INTEGER: return new ConstantIntegerInfo(); case CONSTANT_TAG_FLOAT: return new ConstantFloatInfo(); case CONSTANT_TAG_LONG: return new ConstantLongInfo(); case CONSTANT_TAG_DOUBLE: return new ConstantDoubleInfo(); case CONSTANT_TAG_UTF8: return new ConstantUtf8Info(); case CONSTANT_TAG_STRING: return new ConstantStringInfo(constantPool); case CONSTANT_TAG_CLASS: return new ConstantClassInfo(constantPool); case CONSTANT_TAG_FIELDREF: return new ConstantFieldRefInfo(constantPool); case CONSTANT_TAG_METHODREF: return new ConstantMethodRefInfo(constantPool); case CONSTANT_TAG_INTERFACEMETHODREF: return new ConstantInterfaceMethodRefInfo(constantPool); case CONSTANT_TAG_NAMEANDTYPE: return new ConstantNameAndTypeInfo(); case CONSTANT_TAG_METHODTYPE: return new ConstantMethodTypeInfo(); case CONSTANT_TAG_METHODHANDLE: return new ConstantMethodHandleInfo(); case CONSTANT_TAG_INVOKEDYNAMIC: return new ConstantInvokeDynamicInfo(); default: throw new ClassFormatError("constant pool tag"); } }}

    ClassFile.java

    package org.itstack.demo.jvm.classfile;import org.itstack.demo.jvm.classfile.attributes.AttributeInfo;import org.itstack.demo.jvm.classfile.constantpool.ConstantPool;/** * http://www.itstack.org * create by fuzhengwei on 2019/4/26 */public class ClassFile { private int minorVersion; private int majorVersion; private ConstantPool constantPool; private int accessFlags; private int thisClassIdx; private int supperClassIdx; private int[] interfaces; private MemberInfo[] fields; private MemberInfo[] methods; private AttributeInfo[] attributes; public ClassFile(byte[] classData) { ClassReader reader = new ClassReader(classData); this.readAndCheckMagic(reader); this.readAndCheckVersion(reader); this.constantPool = this.readConstantPool(reader); this.accessFlags = reader.readU2ToInt(); this.thisClassIdx = reader.readU2ToInt(); this.supperClassIdx = reader.readU2ToInt(); this.interfaces = reader.readUInt16s(); this.fields = MemberInfo.readMembers(reader, constantPool); this.methods = MemberInfo.readMembers(reader, constantPool); this.attributes = AttributeInfo.readAttributes(reader, constantPool); } private void readAndCheckMagic(ClassReader reader) { String magic = reader.readU4ToHexStr(); if (!"cafebabe".equals(magic)) { throw new ClassFormatError("magic!"); } } private void readAndCheckVersion(ClassReader reader) { this.minorVersion = reader.readU2ToInt(); this.majorVersion = reader.readU2ToInt(); switch (this.majorVersion) { case 45: return; case 46: case 47: case 48: case 49: case 50: case 51: case 52: if (this.minorVersion == 0) return; } throw new UnsupportedClassVersionError(); } private ConstantPool readConstantPool(ClassReader reader) { return new ConstantPool(reader); } public int minorVersion(){ return this.minorVersion; } public int majorVersion(){ return this.majorVersion; } public ConstantPool constantPool(){ return this.constantPool; } public int accessFlags() { return this.accessFlags; } public MemberInfo[] fields() { return this.fields; } public MemberInfo[] methods() { return this.methods; } public String className() { return this.constantPool.getClassName(this.thisClassIdx); } public String superClassName() { if (this.supperClassIdx <= 0) return ""; return this.constantPool.getClassName(this.supperClassIdx); } public String[] interfaceNames() { String[] interfaceNames = new String[this.interfaces.length]; for (int i = 0; i < this.interfaces.length; i++) { interfaceNames[i] = this.constantPool.getClassName(interfaces[i]); } return interfaceNames; }}

    ClassReader.java

    package org.itstack.demo.jvm.classfile;import java.math.BigInteger;/** * http://www.itstack.org * create by fuzhengwei on 2019/5/13 * 

    * java虚拟机定义了u1、u2、u4三种数据类型来表示;1字节、2字节、4字节,无符号整数。 * 在如下实现中,用增位方式表示无符号类型: * u1、u2可以用int类型存储,因为int类型是4字节 * u4 需要用long类型存储,因为long类型是8字节 */public class ClassReader { private byte[] data; public ClassReader(byte[] data) { this.data = data; } //u1 public int readUint8() { byte[] val = readByte(1); return byte2int(val); } //u2 public int readUint16() { byte[] val = readByte(2); return byte2int(val); } //u4 public long readUint32() { byte[] val = readByte(4); String str_hex = new BigInteger(1, val).toString(16); return Long.parseLong(str_hex, 16); } public float readUint64TFloat() { byte[] val = readByte(8); return new BigInteger(1, val).floatValue(); } public long readUint64TLong() { byte[] val = readByte(8); return new BigInteger(1, val).longValue(); } public double readUint64TDouble() { byte[] val = readByte(8); return new BigInteger(1, val).doubleValue(); } public int[] readUint16s() { int n = this.readUint16(); int[] s = new int[n]; for (int i = 0; i < n; i++) { s[i] = this.readUint16(); } return s; } public byte[] readBytes(int n) { return readByte(n); } private byte[] readByte(int length) { byte[] copy = new byte[length]; System.arraycopy(data, 0, copy, 0, length); System.arraycopy(data, length, data, 0, data.length - length); return copy; } private int byte2int(byte[] val) { String str_hex = new BigInteger(1, val).toString(16); return Integer.parseInt(str_hex, 16); }}

    MemberInfo.java

    package org.itstack.demo.jvm.classfile;import org.itstack.demo.jvm.classfile.attributes.AttributeInfo;import org.itstack.demo.jvm.classfile.attributes.impl.CodeAttribute;import org.itstack.demo.jvm.classfile.attributes.impl.ConstantValueAttribute;import org.itstack.demo.jvm.classfile.constantpool.ConstantPool;/** * http://www.itstack.org * create by fuzhengwei on 2019/4/26 */public class MemberInfo { private ConstantPool constantPool; private int accessFlags; private int nameIdx; private int descriptorIdx; private AttributeInfo[] attributes; public MemberInfo(ClassReader reader, ConstantPool constantPool) { this.constantPool = constantPool; this.accessFlags = reader.readU2ToInt(); this.nameIdx = reader.readU2ToInt(); this.descriptorIdx = reader.readU2ToInt(); this.attributes = AttributeInfo.readAttributes(reader, constantPool); } public static MemberInfo[] readMembers(ClassReader reader, ConstantPool constantPool) { int fieldCount = reader.readU2ToInt(); MemberInfo[] fields = new MemberInfo[fieldCount]; for (int i = 0; i < fieldCount; i++) { fields[i] = new MemberInfo(reader, constantPool); } return fields; } public int accessFlags() { return this.accessFlags; } public String name() { return this.constantPool.getUTF8(this.nameIdx); } public String descriptor() { return this.constantPool.getUTF8(this.descriptorIdx); } public CodeAttribute codeAttribute() { for (AttributeInfo attrInfo : attributes) { if (attrInfo instanceof CodeAttribute) return (CodeAttribute) attrInfo; } return null; } public ConstantValueAttribute ConstantValueAttribute() { for (AttributeInfo attrInfo : attributes) { if (attrInfo instanceof ConstantValueAttribute) return (ConstantValueAttribute) attrInfo; } return null; }}

    Main.java

    package org.itstack.demo.jvm;import org.itstack.demo.jvm.classfile.ClassFile;import org.itstack.demo.jvm.classfile.MemberInfo;import org.itstack.demo.jvm.classpath.Classpath;import java.util.Arrays;/** * http://www.itstack.org * create by fuzhengwei on 2019/4/24 */public class Main { public static void main(String[] args) { Cmd cmd = Cmd.parse(args); if (!cmd.ok || cmd.helpFlag) { System.out.println("Usage:  [-options] class [args...]"); return; } if (cmd.versionFlag) { //注意案例测试都是基于1.8,另外jdk1.9以后使用模块化没有rt.jar System.out.println("java version "1.8.0""); return; } startJVM(cmd); } private static void startJVM(Cmd cmd) { Classpath classpath = new Classpath(cmd.jre, cmd.classpath); System.out.printf("classpath:%s class:%s args:%s
    展开全文
  • 我们在学习动态代理的实现原理时往往希望能够将字节码文件反编译出来看一下代理类时如何调用handler的invoke方法来实现代理的,但是往往我们不知道如何下载字节码文件,或者下载来不知道下载路径,又或者使用javap...

    我们在学习动态代理的实现原理时往往希望能够将字节码文件反编译出来看一下代理类时如何调用handler的invoke方法来实现代理的,但是往往我们不知道如何下载字节码文件,或者下载来不知道下载路径,又或者使用javap反编译出来的结构并不是我们想要的,那么根据一下步骤可以轻松的得到字节码的反编译结果:

    1. 设置System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");或者在VMoptions中加入参数-Dsun.misc.ProxyGenerator.saveGeneratedFiles=true可以保存生成的动态代理类的class文件,生成的代理class文件在工程根目录的com\sun\proxy中。(JDK1.8)
    2. 反编译class文件(选择CFR反编译结果更可靠):在线反编译工具

     

    展开全文
  • java通过对字节码加密,不被轻易反编译出源代码。 分析: JVM运行java文件是通过加载.class文件实现程序运行的,而且这个过程被我们称为类加载机制。 执行加载这个动作的是类加载器(java.lang.ClassLoader): 除了...

    java通过对字节码加密,不被轻易反编译出源代码。

    分析:

    JVM运行java文件是通过加载.class文件实现程序运行的,而且这个过程被我们称为类加载机制
    执行加载这个动作的是类加载器(java.lang.ClassLoader):
    除了JVM自己实现的几个加载器,我们还能通过继承父类ClassLoader,重写其findClass方法,实现自定义的类加载器

    重点之一就是我们自己的类加载器,它在这其中扮演着解密被加密的class文件的角色(同时加载加密文件)。

    自然有加密.class文件步骤,写一个工具类完成这个角色。

    其他的步骤是一些基本的文件流读写。

    归纳一下思路:

    1.加密.class文件:写一个工具类,确定加密方法。
    2.解密·.class文件: 自定义的类加载器类。
    3.加载.class文件到JVM:自定义的类加载器类。(主要步骤)
    4.验证加载成功:测试类。

    实现

    1.加密.class文件:写一个工具类,确定加密方法(此处取反)。
    :根据路径字节读取class然后取反,再写回文件。
    :方法仅提供思路

      /**
         * 加密类文件
         *
         * @param name 类名
         * @return
         * @throws Exception
         */
        public void enCryptClass(String name) {
            // 类文件路径(绝对路径)
            String path = ROOT_DIR + name.replace('.', '/') + ".class";
            int temp = 0;
            // 类文件读写
            FileInputStream inputStream = null;
            FileOutputStream fileOutputStream = null;
            ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
            File file = null;
    
            try {
                // 读文件
                file = new File(path);
                inputStream = new FileInputStream(file);
                // 注意读写冲突
                while ((temp = inputStream.read()) != -1) {
                    // 写入字节取反
                    outputStream.write(temp^0XFF);
                }
                // 新建输出流
                fileOutputStream = new FileOutputStream(file);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (inputStream != null) {
                    // 关读
                   Util.inputStreamClose(inputStream);
                }
                if (fileOutputStream != null) {
                    // 写文件
                    try {
                        fileOutputStream.write(outputStream.toByteArray());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }finally {
                        // 关写
                        Util.outStreamClose(fileOutputStream);
                        Util.outStreamClose(outputStream);
                    }
                }
    
            }
        }
    

    2.解密·.class文件: 自定义的类加载器类。
    :取反,解密成功,返回明文class字节数组
    :类加载器的方法

    /**
         * 解密类文件
         *
         * @param name 类名
         * @return
         * @throws Exception
         */
        private byte[] deCryptClass(String name) {
            //字节写(缓冲32字节)
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            // 类文件路径
            String path = ROOT_DIR + name.replace('.', '/') + ".class";
            int temp = 0;
            FileInputStream inputStream = null;
            // 结果
            byte[] data = null;
            try {
                inputStream = new FileInputStream(path);
                while ((temp = inputStream.read()) != -1) {
                    // 取反
                    // 写入字节
                    outputStream.write(temp^0XFF);
                }
                data = outputStream.toByteArray();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (inputStream != null) {
                  Util.inputStreamClose(inputStream);
                }
                Util.outStreamClose(outputStream);
                return data;
            }
        }
    

    3.加载.class文件到JVM:自定义的类加载器类。(主要部分)
    :重写findClass
    :根据解密的字节数组,初始化类

    /**自定义类加载器*/
    public class CryptClassLoader extends ClassLoader {
    	//variable
      public CryptClassLoader(String root_dir) {
            this.ROOT_DIR = System.getProperty("user.dir") + root_dir+"/";
        }
     @Override
        protected Class<?> findClass(String name) throws ClassNotFoundException {
            Class<?> c = null;
    
            // 解密class
            byte[] classData = deCryptClass(name);
            if (classData == null) {
                throw new ClassNotFoundException();
            } else {
                // 定义加载class
               try {
                   // 初始化
                   c = defineClass(name.replace('/','.'), classData, 0, classData.length);
               }catch (ClassFormatError e){
                   e.printStackTrace();
               }
            }
    
            if (c==null){
                throw new ClassNotFoundException();
            }
    
            return c;
        }}
    

    4.验证加载成功:测试类。
    :先加密检查,再解密检查
    :测试代码
    :注意类名的确定

      CryptClassLoader cryptClassLoader = new CryptClassLoader("/target/classes");
            // // 加密
    		cryptClassLoader.enCryptClass("com/j/main/sign/TestClass");
            // // 解密
            // try {
            //     Class c = cryptClassLoader.findClass("com/j/main/sign/TestClass");
            //     System.out.println(c);
            //     System.out.println(c.newInstance().getClass().getClassLoader());
            //     System.out.println(c.newInstance().getClass().getName());
            // } catch (Exception e) {
            //     e.printStackTrace();
            // }
    

    加密效果:
    用idea打开.class后,没有传入的类的明文,但类确实不是0kb.

    解密效果:
    在这里插入图片描述
    如果对类加载器的实现不清楚的,可以去看一看MLet的findClass。

    展开全文
  • 前面反编译Smali文件其实都不是比较简单的,一步就可以获取到我们想要的,但是下面我们需要获取到源码(java)文件我们需要分几步来完成,我这里就不做文字型的描述了代码中都有详细的说明: 一 。我们要先获取...

    前面反编译Smali文件其实都不是比较简单的,一步就可以获取到我们想要的,但是下面我们需要获取到源码(java)文件我们需要分几步来完成,我这里就不做文字型的描述了代码中都有详细的说明:

    一 。我们要先获取class文件,这里需要用到工具enjarify

    def decompileClass(self):
            """反编译获取Class 文件"""
            jar_dir = self.class_dir + ".jar"  # 我们定义一个jar文件
            zip_dir = self.class_dir + ".zip"  # 我们需要将jar文件转换成zip  文件之后在解压
            if os.path.exists(jar_dir):   # 如果文件存在就删除它
                os.remove(jar_dir)
            if os.path.exists(zip_dir):
                os.remove(zip_dir)
            os.system("enjarify -o" + jar_dir + " -f " + self.apk_dir)     # 反编译出jar文件 
            shutil.copyfile(jar_dir, zip_dir)  # 将jar 文件转换成 zip文件
            os.remove(jar_dir)  # 删除jar文件
            f = zipfile.ZipFile(zip_dir, 'r')   # 解压之后遍历出来进行保存
            for file in f.namelist():
                try:
                    f.extract(file, self.class_dir)
                except:
                    pass
            f.close()
            os.remove(zip_dir)    # 删除zip文件
            return self.class_dir

    二 。我们需要将得到的class文件反编译成Java(如果做过混淆的话基本上就没戏了)

    def decompileJava(self):
            """反编译获取Java 文件"""
            class_dir = self.decompileClass()    # 获取到class文件目录
            for root, dirs, files in os.walk(class_dir):
                for file in files:
                    if re.search('\.class$', file):    # 遍历所有的class 文件 进行一个个的反编译 
                        class_dirs = os.path.join(root, file)
                        os.system("jad -o -r -s java -d " + self.java_dir + " -o " + class_dirs)
            return self.java_dir

    之后我们来试试吧!

    if __name__ == '__main__':
        decompile = apkDecompile("com.ytrain.wxns_1.2.2_3")
        decompile.decompileClass()

    稍等一会我们就可以看到控制台及文件目录中已包含相关文件
     

    可以看到我们一共得到了1491 个class  文件
    之后就是一堆的class 文件输入日志,其中会有部分说明(部分结构无法反编译)

    从目录上来看我们是成功了的,但是最终我们还是需要对这些目录文件进行一个了解,才能进入后续的工作。

    展开全文
  • 首先我们说一下我这边项目的一个目录结构:config(配置文件目录),res(反编译目录资源),util(工具目录),test(测试代码目录) 1.config目录:主要房租一些配置文件全局的获取部分需要的设置 2.res目录:...
  • Java代码加密与反编译(二) 用加密算法DES修改classLoader实现class文件加密
  •  我们知道Java是一门跨平台的语言,我们编写的Java代码会被编译成中间class文件以让Java虚拟机解析运行。而Java虚拟机规范仅仅描述了抽象的Java虚拟机,在实现具体的Java虚拟机时,仅指出了设计规范。Java虚拟机的...
  • Java代码加密与反编译(二):用加密算法DES修改classLoader实现对.class文件加密二、利用加密算法DES实现java代码加密 传统的C/C++自动带有保护机制,但java不同,只要使用反编译工具,代码很容易被暴露,这里需要...
  • 二、利用加密算法DES实现java代码加密传统的C/C++自动带有保护机制,但java不同,只要使用反编译工具,代码很容易被暴露,这里需要了解的就是Java的ClassLoader对象。Java运行时装入字节码的机制隐含地意味着可以对...
  • 将.class文件反编译为.java文件,可以实现将别人的文件反编译后查看里面的代码
  •  传统的C/C++自动带有保护机制,但java不同,只要使用反编译工具,代码很容易被暴露,这里需要了解的就是Java的ClassLoader对象。  Java运行时装入字节码的机制隐含地意味着可以对字节码进行修改。JVM每次装入...
  • 概述反编译是一个将目标代码转换成源代码的过程。而目标代码是一种用语言表示的代码 , 这种语言能通过实机或虚拟机直接执行。文本所要介绍的 JD-Eclipse 是一款反编译的开源软件,它是应用于 Eclipse 开发平台的插件...
  • 分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二...
  • 二、利用加密算法DES实现java代码加密传统的C/C++自动带有保护机制,但java不同,只要使用反编译工具,代码很容易被暴露,这里需要了解的就是Java的ClassLoader对象。Java运行时装入字节码的机制隐含地意味着可以对...
  • JAVA之CLASS文件反编译

    2009-05-07 16:56:08
    有时候会遇到个很郁闷的情况,源代码没了,又想看原来的代码是如何实现的。 我就遇到过好几次,无奈就到处搜罗反编译的... 敲入如下命令就可以对二进制文件进行反编译。 jad -o -r -dF:\src -sjava F:\classes\*...
  • 将可运行Jar包,反编译成项目,修改代码,再次编译,打包。需要工具:jd-gui、myeclipse具体步骤:1、使用jd-gui打开原始的Jar包,选择File-->Save All Sources,会生成一个zip压缩包2、解压这个压缩包,生成一个...
  • Java 开发语言以其安全性高、代码优化、跨平台等特性,迅速取代了很多传统高级...不过,Java 最突出的跨平台优势使其要以中间代码的形式运行在虚拟机环境中,因此 Java 代码反编译要比其他开发语言更容易实现,并...
  • 同时驱于对更底层知识的好奇与渴求,因此决定学习了一下 class 文件结构,并通过一周的不懈努力,已经掌握了class文件结构,并用 java 实现了一个简单的反编译器:读取 class 文件反编译成纯 java 代码。下面来...
  • 最近又有一种新的方法来实现直接从Android apk包里的classes.dex文件,把dex码反编译到java的.class二进制码,然后从.class二进制码反编译到java源码想必就不用我来多说了吧。 首先我们需要的工具是dex2jar和jd-gui ...
  • 这时候,我们可以在eclipse中安装反编译工具JadClipse,这样我们就可以打开.class文件了。 我们需要下载两个文件:jad和net.sf.jadclipse_3.3.0.jar。 下载完成后, 1.将jad解压放到eclipse安装根目录下,如图所示:...
  • 反编译工具小米人改之理: http://www.xiaomiren.net/apkmodifier/ 一 apk反编译 将apk文件解压后有两部分文件需要处理,一种是xml文件,另一种一个dex文件(....2.从dex到class公认dex2jar.bat,实现反编译;公认的

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 295
精华内容 118
关键字:

反编译class文件代码实现