분석중 만난 간단한 직렬화방식
자바 직렬화
바이트스트림 직렬화
복호화한 파일은 직렬화된 JAVA HashMap 객체이다. (이중 바이트배열로 감싸짐)
AC ED 는 Java 바이트스트림 직렬화의 시그니쳐이고, 00 05는 직렬화 버전을 의미한다. 이후 75부터 직렬화된 객체의 시작임.
역직렬화는 javaobj-py3 모듈을 사용해서 시도함
def process_javaobj_value(key, value):
if key == 'm_TargetIP' or key == 'm_DynGateID':
return int_to_ip(int(value))
elif key[-4:] == 'Time':
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')
elif key == 'm_SessionResult' or key == 'm_ConnectionType':
return value.constant
else:
return value
def deserialize_javaobj_dict(javaobj_dict):
result = {}
for key, value in javaobj_dict.items():
result[key] = process_javaobj_value(key, value)
return result
def deserialize_data(serialized_data):
jbyte_array = javaobj.loads(serialized_data)
for x in jbyte_array:
inner_obj = javaobj.loads(bytes(b & 0xFF for b in x._data))
pprint.pprint(deserialize_javaobj_dict(inner_obj))
print()
with open(filepath, 'rb') as file:
serialize_data = file.read()
deserialize_data(serialize_data)
kryo
고속 직렬화 방식이다.
어떤 타입이든 직렬화가 가능하고, 리스트 형태로 저장된 데이터를 직렬화 했을때의 이미지이다.
각 요소의 마지막 데이터는 0x80를 추가하여 문자열의 끝을 나타낸다.
ex) ArrayList → t(0x74) | 0x80 → 0xF4
Comments