Minisoyo社区's Archiver

bb 发表于 2006-10-6 00:25

反编译的一些知识。

把以前写的文章改改放在这里吧。
----------------------------------------------
我们都知道JAVA是一种解析型语言,这就决定JAVA文件编译后不是机器码,而是一个字节码文件,也就是CLASS文件。而这样的文件是存在规律的,经过反编译工具是可以还原回来的。例如Decafe、FrontEnd,YingJAD和Jode等等软件。下面是《Nokia中Short数组转换算法》
类中Main函数的ByteCode:
0 ldc #16
2 invokestatic #18
5 astore_1
6 return

其源代码是:short [] pixels = parseImage("/ef1s.png");
我们通过反编译工具是可以还原出以上源代码的。而通过简单的分析,我们也能自己写出源代码的。
第一行:ldc #16
ldc为虚拟机的指令,作用是:压入常量池的项,形式如下
ldc index
这个index就是上面的16,也就是在常量池中的有效索引,当我们去看常量池的时候,我们就会找到index为16的值为String_info,里面存了/ef1s.png.
所以这行的意思就是把/ef1s.pn作为一个String存在常量池中,其有效索引为16。
第二行:2 invokestatic #18
invokestatic为虚拟机指令,作用是:调用类(static)方法,形式如下
invokestatic indexbyte1 indexbyte2
其中indexbyte1和indexbyte2必须是在常量池中的有效索引,而是指向的类型必须有Methodref标记,对类名,方法名和方法的描述符的引用。
所以当我们看常量池中索引为18的地方,我们就会得到以下信息:
Class Name : cp_info#1
Name Type : cp_info#19
1 和19都是常量池中的有效索引,值就是右边<>中的值,再往下跟踪我就不多说了,有兴趣的朋友可以去JAVA虚拟机规范。
这里我简单介绍一下parseImage(Ljava/lang/String;)[S 的意思。
这就是parseImage这个函数的运行,我们反过来看看parseImage的原型就明白了
short [] parseImage(String)
那么Ljava/lang/String;就是说需要传入一个String对象,而为什么前面要有一个L呢,这是JAVA虚拟机用来表示这是一个Object。如果是基本类型,这里就不需要有L了。然后返回为short的一维数组,也就是对应的[S。是不是很有意思,S对应着Short类型,而“[”对应一维数组,那有些朋友要问了,两维呢,那就“[[”,呵呵,是不是很有意思。
好了,调用了函数,返回的值要保存下来吧。那么就是第三行要做的事情了。
第三行:5 astore_1
呵呵,很简单的。但是却有文章,也是比较容易混乱的地方。
astore_为虚拟机指令,作用为:将当前reference存储到局部变量中去。而必须是对当前框架的局部变量的有效索引。打个比方,可能我们这个函数中可能还要用到这个局部变量,我们可以通过来找到它。例如调用虚拟机指令:
aload_1,就能得到该值。
第四行:6 return
同样的,return也是虚拟机指令了,它的作用为:从方法返回void。
这里也就是退出main函数。
----------------------------------------------------------------------------
ok,终于啰嗦完毕了。有些朋友可能要问,这么复杂,才四行就说这么多,呵呵,可能是我这人废话过多,当然如果你熟悉了,一点就能看懂了。通过肉眼就可以反编译程序了。目前所有的反编译工具都无法做到完美反编译,在有问题的地方还需要人去修正。

heart 发表于 2006-10-11 11:39

互顶!!

yuanaoe 发表于 2006-10-13 01:11

:L ......楼主.....发错板块了吧

赤浪 发表于 2006-11-9 14:32

恩,写得不错!!
JAVA虚拟机规范,看来要研究一下!!!!

jerkin 发表于 2006-11-17 03:52

学习中。。。要顶顶!

443200530 发表于 2006-11-24 22:16

支持下 ....
    技术方面一直不是强项,管理倒还可以...:lol

臭臭 发表于 2006-11-25 02:04

:victory: 偶也支持一下~!~!

清清苹果香 发表于 2006-11-28 09:39

.....................:L 这么多管理员.....

小鑫鑫 发表于 2006-11-28 11:54

说的也是.走到哪里都是官官...也给我个当啊~

feiying145 发表于 2006-12-13 19:48

刚刚看到以后一定多学习学习:lol

443200530 发表于 2006-12-16 21:26

越看小FY越觉得可爱...:loveliness:

天上人间 发表于 2006-12-20 10:43

魔鬼。。。

arthurle 发表于 2006-12-21 09:59

bb教程真的很用....谢谢了啊...莫怪我黏贴下保存...半夜偷偷看..
哈哈

86053634 发表于 2006-12-21 11:22

学习学习!
:lol

443200530 发表于 2007-2-10 15:04

再来支持下~~~

wangqh007 发表于 2007-9-1 15:12

支持一个

千古绝恋 发表于 2007-9-11 00:31

写的得不错参考参考支持你

sbbz 发表于 2007-9-18 09:48

这个是反汇编么?

樱花树 发表于 2007-9-25 00:35

:困-_- 基于堆栈的中间语言,一看就懂。华丽支持下BB~~:生气 还是搞偶的X86反汇编吧:害羞

yiye919 发表于 2007-9-26 15:34

正在学习

页: [1] 2

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.