暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

反序列化之java学习&2G武器库分享

半杰学渗透 2021-07-27
346

————————————————

“我好像从来没有把一件事情做好过,这次我想专心做好一件事。”



启言:

由于最近在学习反序列的相关知识,看代码就头大,因为在几大流行语言中,我唯一没有碰过的就是java老大哥,于是我决定好好从头学习一下,简单的做一个学习记录。本篇记录来源于菜鸟教程。(下面记录的是我认为比较重要的,一些常规的语法我是忽略了的,建议还是可以自己去菜鸟教程里走一遍),然后为了庆祝我的前前文章的阅读量达到三百多,我就在本篇文章末尾分享我之前得到的一个武器库:1937CN(2个多G)。(考虑到各位应该都用不起百度网盘,于是我把它放在了天翼云盘上。),还有就是,各位可不可以点个赞呀。



java-1


Java 可运行于多个平台,如 Windows, Mac OS 及其他多种 UNIX 版本的系统,移动操作系统 Android 大部分的代码采用 Java 编程语言编程。

首先就是编辑好java文件后,存在两个执行命令(前提是java环境安装好了,我是直接在命令行里进行操作的),一个是javac,一个是java,javac Helloworld.java命令后,如果编译没有错误的话,会出现一个 HelloWorld.class 的文件。java 后面跟着的是java文件中的类名,例如 HelloWorld 就是类名,如: java HelloWorld。

注意:java命令后面不要加.class。


java版本分为标准版javase、企业版javaee、微型版javame


Java语法:一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。概念有对象,类,变量,方法,具体就不细讲了,接触语言都应该知道相应含义。


一些注意点:

大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的。


类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。


方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。


源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为 .java。(如果文件名和类名不相同则会导致编译错误)。


主方法入口:所有的 Java 程序由 public static void main(String[] args) 方法开始执行。


接口的概念:在 Java 中,接口可理解为对象间相互通信的协议。接口在继承中扮演着很重要的角色。接口只定义派生要用到的方法,但是方法的具体实现完全取决于派生类。



java-2


在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。

源文件声明规则

在这部分,我们将学习源文件的声明规则。当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。

一个源文件中只能有一个 public 类

一个源文件可以有多个非 public 类

源文件的名称应该和 public 类的类名保持一致。例如:源文件中 public 类的类名是 Employee,那么源文件应该命名为Employee.java。

如果一个类定义在某个包中,那么 package 语句应该在源文件的首行。

如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面。

import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。


Java 的两大数据类型:

内置数据类型:内置数据类型没什么好讲的,就是byte,short,int,float,double,boolean,char.


引用数据类型:在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。

对象、数组都是引用数据类型。

所有引用类型的默认值都是null。

一个引用变量可以用来引用任何与之兼容的类型。

申明常量用final关键词。类型转换分为自动的和强制的。


Java语言支持的变量类型有:(关于这几个变量的区别值得仔细看一下)

类变量:独立于方法之外的变量,用 static 修饰。

实例变量:独立于方法之外的变量,不过没有 static 修饰。

局部变量:类的方法中的变量。


Java 修饰符

修饰符用来定义类、方法或者变量,通常放在语句的最前端。

Java语言提供了很多修饰符,主要分为以下两类:

访问修饰符

Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

public : 对所有类可见。使用对象:类、接口、变量、方法

protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。

访问控制和继承

请注意以下方法继承的规则:

父类中声明为 public 的方法在子类中也必须为 public。

父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。

父类中声明为 private 的方法,不能够被继承。


非访问修饰符

static 修饰符,用来修饰类方法和类变量。

final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。

abstract 修饰符,用来创建抽象类和抽象方法。

synchronized 修饰符,synchronized 关键字声明的方法同一时间只能被一个线程访问。

transient修饰符(不持久化)序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。

volatile 修饰符,volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。一个 volatile 对象引用可能是 null。



java-3


我看了评论中一位大佬关于transient非访问修饰符的应用场景复现:



当对象被序列化时(写入字节序列到目标文件)时,transient阻止实例中那些用此关键字声明的变量持久化;当对象被反序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。


接下来看了java的运算符,循环结构,条件语句,switch case,大致和其他语言类似,就不在赘述了。


以下是介绍java中几种常见的类,它们的方法我就忽略了,基本上是看得懂英文就知道它方法的作用是什么。

Java Number & Math 类

当 x 被赋为整型值时,由于x是一个对象,所以编译器要对x进行装箱。然后,为了使x能进行加运算,所以要对x进行拆箱。(这句话,可以反复理解一下)


Java Math 类

Java 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。

Math 的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用。


Java Character 类

Character类提供了一系列方法来操纵字符。你可以使用Character的构造方法创建一个Character类对象。

同时,将一个char类型的参数传递给需要一个Character类型参数的方法时,那么编译器会自动地将char类型参数转换为Character对象。这种特征称为装箱,反过来称为拆箱。


在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。

上面介绍了使用不同的方式创建string对象的区别。注意:String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了(详看笔记部分解析)。如果需要对字符串做很多修改,那么应该选择使用StringBuffer & StringBuilder 类。字符串的输出包括printf和format,我们了解一下就行。


Java StringBuffer 和 StringBuilder 类(我开始尽然觉得这两个类一样,仔细一看,发现,确实不一样......)

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。(总的来说,这二者各有优点)



小结


今天就到这吧,然后下面是1937CN地址,最后工具虽好,但还是要靠自己,所以点点赞吧。

https://cloud.189.cn/t/3ENjamBfA7Vr (访问码:d6k6)(附上一些照片吧)




“对于可控的事情,要保持谨慎,对于不可控的事情,要保持乐观。”


1

END

1






文章转载自半杰学渗透,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论