0AOOUT反汇编CLASS初级教程 联系客服

发布时间 : 星期三 文章0AOOUT反汇编CLASS初级教程更新完毕开始阅读dabac903bed5b9f3f90f1ca6

楼主 ┑┒ 打印

发表于 2007-10-25 00:06 | 只看该作者

每一个男子全都有

过这样的两个女人,[教程] 反汇编CLASS初级教程

至少两个。娶了红引言:本文根据一个实际的例子:Digital Chocoate的疯狂企鹅发射(该玫瑰,久而久之,红游戏已经被汉:的变了墙上的一抹 http://forum.minisoyo.com/viewthread.php?tid=47786&highlight=Crazy%2 BPenguin)阐述了从class角度用反汇编来分析资源文件格式并编写插蚊子血,白的还是床件,以及字体修改的过程,为了叙述方便,分为上下2章,前篇主要论前明月光。娶了白述如何利用Class文件来分析资源文件的格式,后篇主要讲述修改游戏玫瑰,白的便是衣服字体的过程。本人水平有限,文中不足之处还望大家多指点!不胜感激。上的一粒饭粘子,红在此感谢bb,heart,小4以及所有minisoyo的成员,你们的支持永远是的却是心口上的 我前进的动力! *本文不是教授破解的教程,在JAVA反汇编上也只是管窥一斑,所以请一颗朱砂痣。 各位抱着兴趣研究的目的就好*。

《红玫瑰与白玫要求:有一定的计算机专业知识和编程基础,有耐心做反汇编,因为以瑰》 下的叙述都是从反汇编的角度来说的。 樱花树 再PS:本文讲述的是反汇编的过程和思考方式,可能有的步骤用其他工发短消息 具一步就能完成,但这不是目的。

加为好友

樱花树 当前离线 1.准备工作

XE的16进制流 之所以用DC的这个游戏来,是因为它比较特殊,按照bb的话来说―这UID 个比较简单‖。怎么个特殊法,后文会有说明。原版在这里: 51564 http://forum.minisoyo.com/viewthread.php?tid=47417&highlight=Crazy%2

BPenguin+Catapult 最后登录

2010-2-8 下载下来后,用RAR解压或者HALO打开,看到名字为从a到 m的

class文件,以及未知格式的资源文件。为了汉化它,我们需要编写插件,

要编写插件,则必须知道文本资源文件的格式(数据结构)。于是需要能16进制查看文件的工具:UE或者 HEX Workshop等均可。这里还需要JAVA的反汇编工具,常用的很多,这里使用DJ Java Decompiler。这里就不提供下载了,有兴趣的朋友可以自己上网找或者PM我。(顺带说一句,下载好的DJ和crack文件,先安装DJ,第一步不要选输入序列号,接下来选择I’m under 18 years…),等安装后再用crack文件crack之)

2.基础知识

2.1 Java字节码

我们写好的java文件经过编译后成为class文件,class文件就是JAVA头衔: [MiniSoYo汉字节码的集合。JVM可以加载并解释它。Java字节码( javabyte code),化组] 是一组工作在基于栈式的虚拟CPU的指令集,由Java文件编译后生成,(XE的16进制流) 和原生指令集有着相似之处。其指令格式为:<操作码> <操作数|操作

数…>

UID 51564 帖子 874 精华 0 积分 3938 迷你币 2358 MNB 威望 6 贡献值 0 人气值 106 DP 0 机型 N72

阅读权限 100

注册时间 2007-6-7

JVM读取Class文件后,便开始解释Java字节码。由于字节码只能被JVM运行,所以具有沙箱性,也就是说通过加载前的安全校验,使得恶意代码无法执行。基于栈式的指令集编码方便,解码简单,且独立于硬件。所以大多数类Java的语言都是采用这种机制,如.Net语言。由于其硬件独立性,通常我们也称这种字节码为中间语言。(Intermediate Language)。理论上,只要有中间语言的运行机,我们就能做到硬件无关和跨平台。实际上这也是Java的主要特征之一。中间语言还具有强类型和安全机制。由于中间语言往往需要抽象层的解释,故和原生语言(如C/C++)等,在运行效率上是无法相比的;但由于Java 所支持的开发库繁多,相对简单,开发周期短,安全性可控,所以拥有庞大的开发者阵营。 如图所示

下载 (13.71 KB) 2007-10-25 00:12

这是从DJ反汇编出的JAVA字节码片段(按F12或者选择view->BytecodeView),可以看到,JAVA字节码简单,没有繁琐的寻址方式。基于堆栈式的存储空间,使得指令很精巧。比如第一行:iconst_0 就是加载常量0到栈顶,接着istore_1,把0从栈顶取出,放在标号为1的变量中。看起来写成高级代码就是:byte a = 0 这样的。又如 iconst_0 ; iconst_1 ; iadd ;istore_2

这行代码,分别把0,1入栈,接着iadd将栈顶2个元素相加,结果等于1,并存储到2号变量里。Java字节码有200种之多,在这里无法一一解释,请读者自行参考Sun Java 开发文档。但由―2-8定理‖,我们实际程序中,80%的代码也只用了那20%的字节码而已。所以常用的一些我们还是有必要研究的。

2.2 字节码的操作码

用UE打开一个class是看不到任何字节码的,字节码的表示形式是操作码(Opcode)。我们用数字对字节码编码,这样JVM就能解释,这就是操作码。

下载 (13.34 KB) 2007-10-25 00:12

如上图反选的字节就是图1给出的字节码的操作码。在SunJava文献中查找Opcode可以得到进一步的资料。由于每个字节码都有独一无二的操作码,所以我们能通过在class中查找操作码,来定位其代码的位置,通过修改操作数,操作码来达到我们的目的。常用的Opcode 如下: 0(0x00) nop

1(0x01) aconst_null 2 (0x02) iconst_m1 3 (0x03) iconst_0 4 (0x04) iconst_1 5 (0x05) iconst_2 6 (0x06) iconst_3 7 (0x07) iconst_4 8 (0x08) iconst_5 16(0x10) bipush 17 (0x11) sipush 18 (0x12) ldc 21(0x15) iload 22 (0x16) lload 23 (0x17) fload 24 (0x18) dload 25 (0x19) aload 26 (0x1a) iload_0 27 (0x1b) iload_1 28 (0x1c) iload_2 29 (0x1d) iload_3 54(0x36) istore 58(0x3a) astore 59 (0x3b) istore_0 60 (0x3c) istore_1 61 (0x3d) istore_2 62 (0x3e) istore_3 75(0x4b) astore_0 76 (0x4c) astore_1 77 (0x4d) astore_2 78 (0x4e) astore_3

79 (0x4f) iastore 87(0x57) pop 89(0x59) dup 95(0x5f) swap 96 (0x60) iadd 100(0x64) isub 104(0x68) imul 153(0x99) ifeq 154 (0x9a) ifne 155 (0x9b) iflt 156 (0x9c) ifge 157 (0x9d) ifgt 158 (0x9e) ifle 167(0xa7) goto 168 (0xa8) jsr 169 (0xa9) ret 172(0xac) ireturn 178(0xb2) getstatic 179 (0xb3) putstatic 180 (0xb4) getfield 181 (0xb5) putfield

182 (0xb6) invokevirtual 183 (0xb7) invokespecial 184 (0xb8) invokestatic 185 (0xb9) invokeinterface 187 (0xbb) new 188 (0xbc) newarray 189 (0xbd) anewarray 190 (0xbe) arraylength 191 (0xbf) athrow 198(0xc6) ifnull 199 (0xc7) ifnonnull

更多请参考

http://java.sun.com/docs/books/j ... /Mnemonics.doc.html

看懂Opcode是一个好的Java程序员的基本功,我们不能完全依靠反汇编软件,如果代码经过混淆过,我们只能通过Opcode来查看。如上所说,知道了 Opcode,我们就能通过16进制查找来定位代码在class中的位置,为了确保唯一性,我们通常提取3-6个字节,从理论上来说,这样的字节块在一个良好的Java Class文件中是唯一的。

2.3 J2ME基础

作为JAVA阵营的一部分,j2me在嵌入式领域有着无可比拟的优势。现在支持MIDP2.0的手机越来越多,所以我们有必要大概了解下J2ME