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

자바 직렬화

바이트스트림 직렬화

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

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

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

14593f03-cda1-4b58-a72f-dee5259953af
14593f03-cda1-4b58-a72f-dee5259953af

Comments

ESC
Type to search...