本文阅读量
反序列化篇1#
反序列化方法的对比#
Java设计readObject的思路和PHP的wakeup不同点在于:readObject倾向于解决“反序列化时如何还原一个完整对象”这个问题,而PHP的wakeup更倾向于解决“反序列化后如何初始化这个对象”的 问题。
php反序列化#
略
java反序列化#
package top.longlone;
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Person implements Serializable {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
private void writeObject(ObjectOutputStream s) throws IOException{
s.defaultWriteObject();
s.writeObject("This is a object");
}
private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
s.defaultReadObject();
String message = (String) s.readObject();
System.out.println(message);
}
}
package top.longlone;
import java.io.*;
public class SerializeDemo {
private static String bytesToHexString(byte[] bytes) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
String strHex = Integer.toHexString(bytes[i]);
if (strHex.length() > 3) {
sb.append(strHex.substring(6));
} else {
if (strHex.length() < 2) {
sb.append("0" + strHex);
} else {
sb.append(strHex);
}
}
}
return sb.toString();
}
public static void main(String[] args) {
Person person = new Person("Tom", 18);
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(baos);
out.writeObject(person);
byte[] bytes = baos.toByteArray();
out.close();
baos.close();
System.out.print(bytesToHexString(bytes));
} catch (IOException i) {
i.printStackTrace();
}
}
}
这个特性就让Java的开发变得非常灵活。比如后面将会讲到的HashMap,其就是将Map中的所有键、 值都存储在objectAnnotation中,而并不是某个具体属性里。关于一些具体类是如何使用readObject方法的,我们后面在说到gadget的时候会详细分析。
python反序列化#
略