就很好奇反编译出来自己写的代码,这里主要使用了五个工具,idea intellij、010edit、jgui、bytecode viewer、eclipse。
HelloWorld
package com.google; import java.util.ArrayList; import java.util.List; public class HelloWorld { public String hi(String val) { String p = val; System.out.println("val" + p); List<Integer> list = new ArrayList<Integer>(); list.add(1); for (Integer i : list) { int value = say(i); int ck3 = 9; if (value > ck3) { System.out.println(i); } } return p; } public int say(int p) { if (p > 1) { return p; } else { return 0; } } }
jdgui 反编译出来:
package com.google; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; public class HelloWorld { public String hi(String val) { String p = val; System.out.println("val" + p); List<Integer> list = new ArrayList(); list.add(Integer.valueOf(1)); for (Integer i : list) { int value = say(i.intValue()); int ck3 = 9; if (value > ck3) { System.out.println(i); } } return p; } public int say(int p) { if (p > 1) { return p; } return 0; } }
- 如果没有混淆,几乎是一模一样的代码, 只要编译环境一样,修改下全量替换,运行环境就能够很顺利的运行一样。
- 加了混淆,其实也一样,并不会修改主逻辑,只是把变量修改为IIIIIIIIIIIIIIIII这类没有字面意义的意思,但是不影响逻辑
- 自定义Classloader+混淆,但是没有加密,其实效果一样,因为Classloader能够反编译出来破解
- 自定义Classloader+加密+混淆,达到基础效果,但是秘钥如果被拿到其实本质一样
- 自定义Classloader+多重加密+混淆,可以放心了吗?
接下来我就是要告诉大家如何破解哪些(自定义Classloader+多重加密+混淆),其实这个工作主要是帮助国外的朋友,所以不能讲得太细!
用bytecode viewer工具展示出来效果,say方法:
aload_1 astore_2 getstatic java/lang/System/out Ljava/io/PrintStream; new java/lang/StringBuilder dup invokespecial java/lang/StringBuilder/<init>()V ldc "val" invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder; aload_2 invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder; invokevirtual java/lang/StringBuilder/toString()Ljava/lang/String; invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V new java/util/ArrayList dup invokespecial java/util/ArrayList/<init>()V astore_3 aload_3 iconst_1 invokestatic java/lang/Integer/valueOf(I)Ljava/lang/Integer; invokeinterface java/util/List/add(Ljava/lang/Object;)Z 2 pop aload_3 invokeinterface java/util/List/iterator()Ljava/util/Iterator; 1 astore 4 aload 4 invokeinterface java/util/Iterator/hasNext()Z 1 ifeq 46 aload 4 invokeinterface java/util/Iterator/next()Ljava/lang/Object; 1 checkcast java/lang/Integer astore 5 aload_0 aload 5 invokevirtual java/lang/Integer/intValue()I invokevirtual com/google/HelloWorld/say(I)I istore 6 bipush 9 istore 7 iload 6 iload 7 if_icmple 45 getstatic java/lang/System/out Ljava/io/PrintStream; aload 5 invokevirtual java/io/PrintStream/println(Ljava/lang/Object;)V goto 25 aload_2 areturn
这里简单讲述下Class类结构
ClassFile { u4 magic; //魔数,固定值0xCAFEBABE u2 minor_version; //次版本号 u2 major_version; //主版本号 u2 constant_pool_count; //常量的个数 cp_info constant_pool[constant_pool_count-1]; //具体的常量池内容 u2 access_flags; //访问标识 u2 this_class; //当前类索引 u2 super_class; //父类索引 u2 interfaces_count; //接口的个数 u2 interfaces[interfaces_count]; //具体的接口内容 u2 fields_count; //字段的个数 field_info fields[fields_count]; //具体的字段内容 u2 methods_count; //方法的个数 method_info methods[methods_count]; //具体的方法内容 u2 attributes_count; //属性的个数 attribute_info attributes[attributes_count]; //具体的属性内容 }
具体的说明请参照http://blog.jamesdbloom.com/JavaCodeToByteCode_PartOne.html
使用010Editor:
第一个箭头就是magic
第二个箭头就是major version
需要修改的constants pool,method info
假设需要加入如下的java代码
public int say(int p) { p = 123; if (p > 1) { return p; } else { return 0; } }
可以看到加入了p=123;
bipush 123 istore_1 iload_1 iconst_1 if_icmple 8 iload_1 ireturn iconst_0 ireturn
查看指令表bipush 0x10
通过计算得到123,对应的字节码为7B
通过010editor分析,很快定位到say方法,以及很快找到数值
接下来你要干的事情就很容易了,使用010Editor改完保存,再使用jdgui查看下,当然如果值超出length,就需要修改attribute info表的信息
相关推荐
深入理解JVM之Class类文件结构详解 Java虚拟机(JVM)是一种运行Java字节码的虚拟机器,Class文件是JVM执行Java程序的基础。Class文件结构是JVM的核心组件之一,对于Java开发者来说,理解Class文件结构是非常重要的...
### PE文件结构详解 #### 一、概述 随着Windows NT的发布,一种新的可执行文件格式——PE(Portable Executable)文件格式应运而生。PE文件格式在设计上借鉴了UNIX操作系统常用的COFF(Common Object File Format...
一个简单的分析工具,用于分析”.class/.cap/.exp”格式的Java文件。 对于CAP文件,支持version 2.1 and 2.2. 适用于JCVM的学习。 使用工具时,需保证“C:\Program Files\WinZip\WINZIP32.EXE”存在,用于解压CAP...
《.doc文件内部结构解析与二进制流查看工具详解》 在信息技术领域,文档格式是数据交换的重要载体,其中,.doc文件是Microsoft Word应用软件广泛使用的文档格式。了解.doc文件的内部结构有助于我们更好地理解和处理...
理解BMP文件结构对于开发图像处理软件或进行图像数据操作至关重要。开发者可以通过解析这些头部信息来读取和写入BMP文件,从而实现对图像的显示、编辑或转换。此外,由于BMP文件格式是无损的,它常用于保存原始图像...
PE文件是portable File ...了解PE文件格式有助于加深对操作系统的理解,掌握可执行文件的数据结构机器运行机制,对于逆向破解,加壳等安全方面方面的同学极其重要。接下来我将通过接下来几篇详细介绍PE文件的格式。
总之,理解和解析BMP文件结构是图像处理领域的一个基础技能。通过学习和掌握,我们可以更好地进行图像读取、修改和保存,进一步应用于图像分析、图像合成等高级任务。对于开发者来说,熟悉BMP文件结构能够增强处理...
关于EXCEL文件的wookbook区块的记录结构定义,最关键的几个记录的文件结构,
解析TTF文件需要对它的结构有充分的了解,以下是TrueType字体文件结构的主要知识点。 首先,TrueType字体文件以一个 Offset Table(偏移表)开始,从字节0开始,它的存在使得字形渲染器可以更容易地遍历各个表。...
android的 tombstone文件解析结构说明
《解析db文件结构工程》 在信息技术领域,数据库文件(如.db文件)是存储和管理数据的核心组件。本文将深入探讨.db文件的结构,旨在帮助读者理解这些文件的工作原理,以便进行更有效的数据操作和分析。 首先,我们...
NTFS文件系统的结构详解,这个文档里详细介绍了NTFS文件系统的各个组成结构
解析PE文件结构(开发语言为C++,开发工具为QtCreator),代码完成了PE文件各个头结构的解析,数据目录解析,导出表,导入表,资源表等常见表的解析。代码中难免有BUG,由于时间关系,本人未修复,但是对于那些想...
### Index.dat 文件结构解析 #### 一、引言 随着信息技术的发展,计算机取证成为了一个重要的研究领域。在这一过程中,index.dat文件作为一种特殊的文件类型,因其包含了大量的用户浏览历史和其他重要信息而备受...
首先,让我们来看一下`class类文件结构.png`这张图片。它可能展示了一个清晰的视觉表示,列出了Class文件的各个组成部分,如魔数(Magic Number)、版本号、常量池(Constant Pool)、访问标志(Access Flags)、...
在C++中解析PDF文件结构涉及到深入理解PDF规范和利用编程技巧来处理其复杂的编码方式。PDF文件由多个对象组成,如页、字典、数组、字符串、流等,这些对象构成了PDF的逻辑结构。 首先,PDF的源码是由一系列的指令和...
PDF格式的PE文件结构图及工具源码是一个深入解析PE(Portable Executable)文件格式的资源,涵盖了C和C++编程语言的相关知识。PE文件格式是Windows操作系统中用于执行程序和动态链接库(DLLs)的主要文件格式。下面...
3DS文件结构解析及程序,对3DS文件结构做了详细的描述,并有示例代码(C++)
网上收集的mp4文件结构的资料 mp4文件结构跟mpeg、MOV、AVI视频格式框架结构大致一样
自己做的一个介绍SWF文件结构的PPT,仅供交流使用。