분석중 만난 간단한 직렬화방식

분석중 만난 간단한 직렬화방식

2025년 7월 8일

자바 직렬화 #

바이트스트림 직렬화 #

복호화한 파일은 직렬화된 JAVA HashMap 객체이다. (이중 바이트배열로 감싸짐) AC ED 는 Java 바이트스트림 직렬화의 시그니쳐이고, 00 05는 직렬화 버전을 의미한다. 이후 75부터 직렬화된 객체의 시작임.

896ca281-ed85-40c3-8471-5dd571bc63e7

역직렬화는 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) ArrayListt(0x74) | 0x800xF4

14593f03-cda1-4b58-a72f-dee5259953af

comments powered by Disqus