2014-10-16 4 views
0

회사의 데이터 복구를하고 있습니다. 그들은 정부의 Java 소프트웨어 패키지에서 작성된 파일의 한 유형을 구체적으로 필요로합니다. 파일 이름은 손실되지만 파일 자체에는 프로젝트 이름이 포함됩니다. 파일을 실제로 일반 텍스트가 포함되어 있지는 않지만 해당 소프트웨어에서 실제로 열 때만 찾을 수 있습니다. 수천 개의 파일이 있으므로 수동으로 열어 파일 이름을 업데이트 할 수는 없습니다.Java에 저장된 알 수없는 파일 열기

이러한 파일에는 여러 가지 다른 형식이 있습니다. 소프트웨어의 최신 버전은 이전 버전의 파일을 열 수 없으므로 파일을 "변환"해야합니다. 이것은 저에게 파일이 단순하게 저장된 객체라는 느낌을줍니다. 그리고 각 소프트웨어 버전으로 클래스를 변경하여 이전 파일을 새로운 클래스로 더 이상 캐스트 할 수 없게 만듭니다. 또는 뭔가. 내가 자바로 프로그래밍 한 이후로 꽤 오래되었습니다. :)

어쨌든 나는 "단순히"그 객체의 단일 속성을 읽고 싶다. 그러나 클래스를 파싱 할 클래스가 없습니다 (파일이 저장된 소프트웨어 버전에 따라 많은 클래스 중 하나 일 수 있음). 나는 그 소프트웨어의 항아리 파일을 가지고 있지만 그것이 정확히 무엇을하는지 전체 소프트웨어 패키지를 분석 할 필요가 없기를 바라고있다.

결국 나는 궁금한 점이 있습니다. 파일을 열어서 (실제로 "저장된 개체"라고 가정), 내용을 일반 텍스트로 구문 분석 할 수 있습니까? 한 번 완료되면 프로젝트 이름이 저장된 위치를 검색 할 수 있습니다. 소프트웨어 버전간에 동일한 위치에 있기를 바랍니다.

+1

경로가 더 쉬울 것이라고 말하기는 어렵지만 두 방향이 표시됩니다. 1) jar 클래스 파일을 디 컴파일하고 파일이 작성된 위치를 찾으십시오 (예를 들어 ObjectOutputStream을 검색하면 작동 할 수 있음). 이것은 나에게 더 쉬운 옵션처럼 보입니다 :) - 2) 파일 형식을 리버스 엔지니어링하려고합니다 (좋은 시작점은 여기의 직렬화 사양입니다 : http://docs.oracle.com/javase/7/docs/platform/serialization /spec/serialTOC.html 및보다 구체적으로 프로토콜 : http://docs.oracle.com/javase/7/docs/platform/serialization/spec/protocol.html – xpa1492

+0

파일이 실제로 작성된 경우 단순히 자바의 표준 직렬화를 사용하면 프로젝트 이름은 문자열 일 뿐이므로 "문자열 객체의 표현은 길이 정보와 수정 된 UTF-8로 인코딩 된 문자열의 내용으로 구성됩니다."이후로 UTF-8은 16 진수 편집기에서 열어 어딘가에 파일로 인코딩되어 있습니다. – xpa1492

+0

처음에 두려워했던 Decompiling은 가장 빠르고 최상의 결과를 제공합니다. 제안 해줘서 고마워. – Sygmoral

답변

0

직렬화 된 개체 인 경우 파일은 마법 값 0xACED로 시작하고 프로토콜 버전 번호 (현재 0x0005)로 시작합니다.

그렇다면 실제로 관련 버전의 CLASSPATH에서 사용할 수있는 모든 관련 클래스를 사용하여 Java 코드로 직렬화를 해제하는 것 이외의 다른 구문 분석은 할 수 없습니다. 그 이유는 모든 직렬화 가능 클래스가 스트림에 쓰는 자체 코드를 제공 할 수 있기 때문에 해당 클래스 만 올바르게 이해할 수 있기 때문입니다.

+0

파일이 항상 DFFC 6148 55BE 74F8로 시작한다는 것을 알았습니다. (아마도 필자는이 질문에 대해 언급 했어야합니다.) 그래서 직렬화 된 객체를 제외한다고 가정하고 있습니다. 정보 주셔서 감사합니다! 나는 xpa1492가 암시하는 것처럼, 디 컴파일해야하고 파일이 어디에 쓰여지는지 살펴야 할 것 같다. – Sygmoral

관련 문제