1
- # Copyright 2010-2013 Volodymyr Buell
2
- #
3
1
# Licensed under the Apache License, Version 2.0 (the "License");
4
2
# you may not use this file except in compliance with the License.
5
3
# You may obtain a copy of the License at
@@ -54,6 +52,7 @@ def load(file_object, *args):
54
52
marshaller .add_transformer (DefaultObjectTransformer ())
55
53
return marshaller .readObject ()
56
54
55
+
57
56
def load_all (file_object ):
58
57
marshaller = JavaObjectUnmarshaller (file_object )
59
58
marshaller .add_transformer (DefaultObjectTransformer ())
@@ -64,7 +63,6 @@ def load_all(file_object):
64
63
return res
65
64
66
65
67
-
68
66
def loads (string , * args ):
69
67
"""
70
68
Deserializes Java objects and primitive data serialized by ObjectOutputStream
@@ -150,6 +148,7 @@ def copy(self, new_object):
150
148
for name in self .classdesc .fields_names :
151
149
new_object .__setattr__ (name , getattr (self , name ))
152
150
151
+
153
152
class JavaString (str ):
154
153
def __init__ (self , * args , ** kwargs ):
155
154
str .__init__ (self , * args , ** kwargs )
@@ -159,17 +158,20 @@ def __eq__(self, other):
159
158
return False
160
159
return str .__eq__ (self , other )
161
160
161
+
162
162
class JavaEnum (JavaObject ):
163
163
def __init__ (self , constant = None ):
164
164
super (JavaEnum , self ).__init__ ()
165
165
self .constant = constant
166
166
167
+
167
168
class JavaArray (list , JavaObject ):
168
169
def __init__ (self , classdesc = None ):
169
170
list .__init__ (self )
170
171
JavaObject .__init__ (self )
171
172
self .classdesc = classdesc
172
173
174
+
173
175
class JavaObjectConstants :
174
176
175
177
STREAM_MAGIC = 0xaced
@@ -262,15 +264,15 @@ def readObject(self):
262
264
the_rest = self .object_stream .read ()
263
265
if len (the_rest ):
264
266
log_error ("Warning!!!!: Stream still has %s bytes left. Enable debug mode of logging to see the hexdump." % len (the_rest ))
265
- log_debug (self ._create_hexdump (the_rest ))
267
+ log_debug (self ._create_hexdump (the_rest , position_bak ))
266
268
self .data_left = True
267
269
else :
268
270
log_debug ("Java Object unmarshalled succesfully!" )
269
271
self .data_left = False
270
272
self .object_stream .seek (position_bak )
271
273
272
274
return res
273
- except Exception , e :
275
+ except Exception as e :
274
276
self ._oops_dump_state ()
275
277
raise
276
278
@@ -283,8 +285,9 @@ def _readStreamHeader(self):
283
285
raise IOError ("The stream is not java serialized object. Invalid stream header: %04X%04X" % (magic , version ))
284
286
285
287
def _read_and_exec_opcode (self , ident = 0 , expect = None ):
288
+ position = self .object_stream .tell ()
286
289
(opid , ) = self ._readStruct (">B" )
287
- log_debug ("OpCode: 0x%X" % opid , ident )
290
+ log_debug ("OpCode: 0x%X (at offset: 0x%X) " % ( opid , position ) , ident )
288
291
if expect and opid not in expect :
289
292
raise IOError ("Unexpected opcode 0x%X" % opid )
290
293
handler = self .opmap .get (opid )
@@ -390,7 +393,6 @@ def do_blockdata_long(self, parent=None, ident=0):
390
393
ba = self .object_stream .read (length )
391
394
return ba
392
395
393
-
394
396
def do_class (self , parent = None , ident = 0 ):
395
397
# TC_CLASS classDesc newHandle
396
398
log_debug ("[class]" , ident )
@@ -527,14 +529,14 @@ def do_enum(self, parent=None, ident=0):
527
529
enum .constant = enumConstantName
528
530
return enum
529
531
530
- def _create_hexdump (self , src , length = 16 ):
531
- FILTER = '' .join ([(len (repr (chr (x )))== 3 ) and chr (x ) or '.' for x in range (256 )])
532
+ def _create_hexdump (self , src , start_offset = 0 , length = 16 ):
533
+ FILTER = '' .join ([(len (repr (chr (x )))== 3 ) and chr (x ) or '.' for x in range (256 )])
532
534
result = []
533
535
for i in xrange (0 , len (src ), length ):
534
536
s = src [i :i + length ]
535
- hexa = ' ' .join (["%02X" % ord (x ) for x in s ])
537
+ hexa = ' ' .join (["%02X" % ord (x ) for x in s ])
536
538
printable = s .translate (FILTER )
537
- result .append ("%04X %-*s %s\n " % (i , length * 3 , hexa , printable ))
539
+ result .append ("%04X %-*s %s\n " % (i + start_offset , length * 3 , hexa , printable ))
538
540
return '' .join (result )
539
541
540
542
def _read_value (self , field_type , ident , name = "" ):
@@ -589,10 +591,10 @@ def _oops_dump_state(self):
589
591
log_error ("References: %s" % str (self .references ))
590
592
log_error ("Stream seeking back at -16 byte (2nd line is an actual position!):" )
591
593
self .object_stream .seek (- 16 , 1 )
594
+ position = self .object_stream .tell ()
592
595
the_rest = self .object_stream .read ()
593
596
if len (the_rest ):
594
- log_error ("Warning!!!!: Stream still has %s bytes left." % len (the_rest ))
595
- log_error (self ._create_hexdump (the_rest ))
597
+ log_error (self ._create_hexdump (the_rest , position ))
596
598
log_error ("=" * 30 )
597
599
598
600
@@ -693,7 +695,7 @@ def write_object(self, obj, parent=None):
693
695
for name , type in zip (all_names , all_types ):
694
696
try :
695
697
self ._write_value (type , getattr (obj , name ))
696
- except AttributeError , e :
698
+ except AttributeError as e :
697
699
log_error ("%s e, %s %s" % (str (e ), repr (obj ), repr (dir (obj ))))
698
700
raise
699
701
0 commit comments