분석중 만난 간단한 직렬화방식
2025년 7월 8일
자바 직렬화 #
바이트스트림 직렬화 #
복호화한 파일은 직렬화된 JAVA HashMap 객체이다. (이중 바이트배열로 감싸짐)
AC ED 는 Java 바이트스트림 직렬화의 시그니쳐이고, 00 05는 직렬화 버전을 의미한다. 이후 75부터 직렬화된 객체의 시작임.
역직렬화는 javaobj-py3 모듈을 사용해서 시도함
1def process_javaobj_value(key, value):
2 if key == 'm_TargetIP' or key == 'm_DynGateID':
3 return int_to_ip(int(value))
4 elif key[-4:] == 'Time':
5 return datetime.fromtimestamp(int.from_bytes(value.annotations[0].encode('latin1'), byteorder='big')/1000.0, tz=timezone.utc).strftime('%Y-%m-%d %H:%M:%S.%f %Z')
6 elif key == 'm_SessionResult' or key == 'm_ConnectionType':
7 return value.constant
8 else:
9 return value
10
11def deserialize_javaobj_dict(javaobj_dict):
12 result = {}
13 for key, value in javaobj_dict.items():
14 result[key] = process_javaobj_value(key, value)
15 return result
16
17def deserialize_data(serialized_data):
18 jbyte_array = javaobj.loads(serialized_data)
19 for x in jbyte_array:
20 inner_obj = javaobj.loads(bytes(b & 0xFF for b in x._data))
21 pprint.pprint(deserialize_javaobj_dict(inner_obj))
22 print()
23
24with open(filepath, 'rb') as file:
25 serialize_data = file.read()
26deserialize_data(serialize_data)
kryo #
고속 직렬화 방식이다.
어떤 타입이든 직렬화가 가능하고, 리스트 형태로 저장된 데이터를 직렬화 했을때의 이미지이다.
각 요소의 마지막 데이터는 0x80를 추가하여 문자열의 끝을 나타낸다.
ex) ArrayList → t(0x74) | 0x80 → 0xF4