Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Assuming you know the rules for Object Serialization, my aim in this article is to write an app in J# which does Object Serialization and then I shall decipher the serialized data.
Below is the app which does the object serialization. This app is inspired from :
https://www.visiblearea.com/visdoc/examples/Java/Thinking_in_Java/c12/documentation/Worm.html#Worm2
// Demonstrates Object Serialization
import java.io.*;
import java.util.*;
class Store implements Serializable {
private int n;
public Store(int n) { this.n = n; }
public String toString() { return Integer.toString(n); }
}
public class link implements Serializable {
private static int next_int = 0;
private Store[] d = {
new Store(next_int++),
new Store(next_int++),
new Store(next_int++)
};
private link next;
private char c;
// Value of i == number of segments
public link(int i, char x) {
c = x;
if(--i > 0)
next = new link(i, (char)(x + 1));
}
public link() {}
public static void main(String[] args) throws ClassNotFoundException, IOException {
link w = new link(4, 'a');
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("link.out"));
out.writeObject(w);
out.close();
}
}
Now using the app from my previous post, when I try to read the contents of the output file link.out, I get the following result:
>file_bytes.exe link.out
ac ed 0 5 73 72 0 4 6c 69 6e 6b c8 f1 6d e 38 aa 2f ca 2 0 3 43 0 1 63 5b 0 1 64 74 0 8 5b 4c 53 74 6f 72 65 3b 4c 0 4 6e 65 78 74 74 0 6 4c 6c 69 6e 6b 3b 78 70 0 61 75 72 0 8 5b 4c 53 74 6f 72 65 3b 29 20 b6 39 0 37 55 a0 2 0 0 78 70 0 0 0 3 73 72 0 5 53 74 6f 72 65 ee f5 85 2f 82 b5 ab 5a 2 0 1 49 0 1 6e 78 70 0 0 0 0 73 71 0 7e 0 6 0 0 0 1 73 71 0 7e 0 6 0 0 0 2 73 71 0 7e 0 0 0 62 75 71 0 7e 0 4 0 0 0 3 73 71 0 7e 0 6 0 0 0 3 73 71 0 7e 0 6 0 0 0 4 73 71 0 7e 0 6 0 0 0 5 73 71 0 7e 0 0 0 63 75 71 0 7e 0 4 0 0 0 3 73 71 0 7e 0 6 0 0 0 6 73 71 0 7e 0 6 0 0 0 7 73 71 0 7e 0 6 0 0 0 8 73 71 0 7e 0 0 0 64 75 71 0 7e 0 4 0 0 0 3 73 71 0 7e 0 6 0 0 0 9 73 71 0 7e 0 6 0 0 0 a 73 71 0 7e 0 6 0 0 0 b 70
Total no of bytes read :286
Now, let us decipher this data. I would use “à” as a notation for “implies”
ac ed à STREAM MAGIC
0 5 à STREAM VERSION
73 à Terminal constant for OBJECT
72 à Terminal constant for CLASSDESC
0 4 à length of the class name (“link”)
6c 69 6e 6b à ‘l’ ‘i’ ‘n’ ‘k’
c8 f1 6d e 38 aa 2f ca à serialVersionUID
2 à serializable flag
0 3 à No of serializable fields in class “link”
43 à ‘C’ , primitive type code for Char
0 1 à length of the char field name i.e 1 here
63 à ‘c’ , name of the char field
5b à ‘[‘ , object type code for array
0 1 à length of the array field name i.e 1 here
64 à ‘d’ , name of the array field
74 à Terminal constant for STRING
0 8 à Length of type name is 8
5b 4c 53 74 6f 72 65 3b à ‘[‘ ‘L’ ‘S’ ‘t’ ‘o’ ‘r’ ‘e’ ‘;’ (field descriptor format)
4c à ‘L’ , object type code for object
0 4 à length of the object field name i.e 4 here
6e 65 78 74 à ‘n’ ‘e’ ‘x’ ‘t’
74 à Terminal constant for STRING
0 6 à Length of type name is 6
4c 6c 69 6e 6b 3b à ‘L’ ‘l’ ‘i’ ‘n’ ‘k’ ‘;’ (field descriptor format)
78 à Terminal constant for ENDBLOCKDATA
70 à Terminal constant for NULL (null reference for super class)
0 61 à char value is ‘a’
75 à Terminal constant for ARRAY
72 à Terminal constant for CLASSDESC
0 8 à Length of type name is 8
5b 4c 53 74 6f 72 65 3b à ‘[‘ ‘L’ ‘S’ ‘t’ ‘o’ ‘r’ ‘e’ ‘;’ (field descriptor format)
29 20 b6 39 0 37 55 a0 à serialVersionUID
2 à serializable flag
0 0 à No of serializable fields in the array class
78 à Terminal constant for ENDBLOCKDATA
70 à Terminal constant for NULL (null reference for super class)
0 0 0 3 à No of fields in the array
73 à Terminal constant for OBJECT
72 à Terminal constant for CLASSDESC
0 5 à String length of “Store”
53 74 6f 72 65 à ‘S’ ‘t’ ‘o’ ‘r’ ‘e’
ee f5 85 2f 82 b5 ab 5a à serialVersionUID
2 à serializable flag for Store class
0 1 à No of serializable fields in Store class
49 à ‘I’ , primitive type code for integer
0 1 à length of the char field name i.e 1 here
6e à ‘n’ , name of the char field in Store class
78 à Terminal constant for ENDBLOCKDATA
70 à Terminal constant for NULL (null reference for super class)
0 0 0 0 à int value of the field ‘n’ ( which is 0 here )
73 à Terminal constant for OBJECT
71 à Terminal constant for REFERENCE
0 7e 0 6 à handle to the Store class
0 0 0 1 à int value of the field ‘n’ ( which is 1 here )
73 à Terminal constant for OBJECT
71 à Terminal constant for REFERENCE
0 7e 0 6 à handle to the Store class
0 0 0 2 à int value of the field ‘n’ ( which is 2 here )
73 à Terminal constant for OBJECT
71 à Terminal constant for REFERENCE
0 7e 0 0 à handle to the link class
0 62 à char value is ‘b’
75 à Terminal constant for ARRAY
71 à Terminal constant for REFERENCE
0 7e 0 4 à handle to the array class
0 0 0 3 à No of fields in the array
73 à Terminal constant for OBJECT
71 à Terminal constant for REFERENCE
0 7e 0 6 à handle to the Store class
0 0 0 3 à int value of the field ‘n’ ( which is 3 here )
73 à Terminal constant for OBJECT
71 à Terminal constant for REFERENCE
0 7e 0 6 à handle to the Store class
0 0 0 4 à int value of the field ‘n’ ( which is 4 here )
73 à Terminal constant for OBJECT
71 à Terminal constant for REFERENCE
0 7e 0 6 à handle to the Store class
0 0 0 5 à int value of the field ‘n’ ( which is 5 here )
73 à Terminal constant for OBJECT
71 à Terminal constant for REFERENCE
0 7e 0 0 à handle to the link class
0 63 à char value is ‘c’
75 à Terminal constant for ARRAY
71 à Terminal constant for REFERENCE
0 7e 0 4 à handle to the array class
0 0 0 3 à No of fields in the array
73 à Terminal constant for OBJECT
71 à Terminal constant for REFERENCE
0 7e 0 6 à handle to the Store class
0 0 0 6 à int value of the field ‘n’ ( which is 6 here )
73 à Terminal constant for OBJECT
71 à Terminal constant for REFERENCE
0 7e 0 6 à handle to the Store class
0 0 0 7 à int value of the field ‘n’ ( which is 7 here )
73 à Terminal constant for OBJECT
71 à Terminal constant for REFERENCE
0 7e 0 6 à handle to the Store class
0 0 0 8 à int value of the field ‘n’ ( which is 8 here )
73 à Terminal constant for OBJECT
71 à Terminal constant for REFERENCE
0 7e 0 0 à handle to the link class
0 64 à char value is ‘d’
75 à Terminal constant for ARRAY
71 à Terminal constant for REFERENCE
0 7e 0 4 à handle to the array class
0 0 0 3 à No of fields in the array
73 à Terminal constant for OBJECT
71 à Terminal constant for REFERENCE
0 7e 0 6 à handle to the Store class
0 0 0 9 à int value of the field ‘n’ ( which is 9 here )
73 à Terminal constant for OBJECT
71 à Terminal constant for REFERENCE
0 7e 0 6 à handle to the Store class
0 0 0 a à int value of the field ‘n’ ( which is 10 here )
73 à Terminal constant for OBJECT
71 à Terminal constant for REFERENCE
0 7e 0 6 à handle to the Store class
0 0 0 b à int value of the field ‘n’ ( which is 11 here )
70 à Terminal constant for NULL ( for the “next” member of this link object)
Comments
- Anonymous
April 11, 2006
Sometimes you just want to see the raw contents of a file. This is especially useful when you don’t have...