문서화없이 레거시 바이너리 데이터 파일을 어떻게 해석 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1801978

  •  05-07-2019
  •  | 
  •  

문제

데이터 문서가 거의 없거나 전혀없는 프로그램 별 이진 파일에 저장됩니다. 우리 분야의 전형적인 예는 악기에서 나오는 데이터이지만 문제가 일반적이라고 생각합니다. 데이터를 이해하고 해석하려는 방법은 무엇입니까?

경계를 설정합니다. 파일은 암호화되지 않았으며 DRM이 없습니다. 파일의 유형과 형식은 프로그램의 작가에만 해당됩니다 (즉, 신원이 손실 된 *.tar와 같은 "표준 파일"이 아닙니다). 고의적 인 난독 화는 없지만 공간을 절약하려는 아마추어 노력이있을 수 있습니다. 우리는 데이터가 무엇인지에 대한 일반적인 지식을 가지고 있다고 가정 할 수 있으며 필드와 어레이의 일부를 인식 할 수 있습니다.

대부분의 데이터는 스칼라와 어레이 (아마도 1- 및 2 차원 및 때로는 불규칙 또는 삼각형)를 가진 숫자라고 가정합니다. 또한 어떤 문자열, 아마도 사람, 사이트, 날짜 및 키워드의 이름이있을 것입니다. 프로그램에는 이진 파일을 읽는 코드가 있지만 소스 나 어셈블러에 액세스 할 수 없습니다. 예를 들어 VAX Fortran 프로그램 또는 일부 초기 UNIX 또는 Windows에 의해 Ole Objects에 의해 작성되었을 수 있습니다. 숫자는 크거나 작은 엔디안 (처음에는 알려지지 않은) 일 수 있지만 일관성이있을 수 있습니다. 우리는 다른 기계에 대해 다른 버전을 가질 수 있습니다 (예 : Cray).

우리는 우리가 합리적으로 큰 파일의 코퍼스를 가지고 있다고 가정 할 수 있습니다.

두 가지 시나리오를 가정 할 수 있습니다.

  1. 실험을 수행 할 수 있도록 프로그램을 다른 입력으로 다시 실행할 수 있습니다.
  2. 우리는 프로그램을 다시 실행할 수 없습니다 - 고정 된 문서 세트가 있습니다. 이것은 알려지지 않은 언어 (예 : 선형 b)로 역사적 문서를 해독하는 것과 유사합니다.

부분 솔루션은 허용 될 수 있습니다. 즉, 살아있는 사람이 이해하지 못하는 분야가있을 수 있지만 대부분은 해석 할 수 있습니다.

나는 오픈 소스 접근 방식에만 관심이 있습니다.

업데이트 관련 질문이 있습니다 (호환성 목적으로 이진 파일 형식을 역 엔지니어링하는 방법) 그러나 강조는 다소 다릅니다.업데이트 @brianegge에서 (1)까지 영리한 제안. 사용 truss (또는 아마도 strace Linux)에서 프로그램에서 모든 쓰기 () 및 유사한 통화를 덤프합니다. 이것은 최소한 디스크에 기록 된 레코드 모음을 허용해야합니다.

도움이 되었습니까?

해결책

이것은 흥미로운 질문입니다. 답은 리버스 엔지니어링 바이너리 형식이 Aquired Skill이지만 도움이되는 도구가 있다는 것입니다.

하나의 도구입니다 Winols, 차량 엔진 관리 컴퓨터 바이너리 이미지를 해석하고 편집하도록 설계되었습니다 (대부분 조회 테이블의 숫자 데이터). 다양한 Endian 형식 (PDP는 아니지만 생각합니다)을 지원하고 다양한 너비 및 오프셋에서 데이터를보고, 배열 영역 (맵)을 정의하고 모든 종류의 스케일링 및 오프셋 옵션으로 2D 또는 3D로 시각화합니다. 또한 휴리스틱/통계 자동 맵 파인더가있어 귀하에게 적합 할 수 있습니다.

상용 도구이지만 무료 데모를 사용하면 모든 것을 수행 할 수 있지만 이진에 대한 변경 사항을 저장하고 필요하지 않은 엔진 관리 기능을 사용합니다. 당신은 당신이 오픈 소스 솔루션에만 관심이 있다고 말했지만 이것은 stackoverflow이며 다른 사람은 그렇게 까다로울 수 있습니다.

다른 팁

모든 파일에는 헤더가 있습니다. 거기서부터 시작하여 두 파일 사이의 유사점을 확인하고 공통 "서명"을 제거하고 차이점을 사용하십시오. 그들은 기록 수, 수출 날짜 및 유사한 것들을 표시해야합니다.

두 헤더 사이의 일반적인 부품은 일반 서명으로 간주 될 수 있으며 무시할 수 있다고 생각합니다.

당신이 제공하는 시스템에있는 경우 지붕틀, 단순히 시스템 통화가 글을 쓰는 것을 보면 아마 좋은 생각이있을 것입니다. 프로그램이 파일을 MMAP로 만들고 메모리에서 직접 복사 할 수도 있지만 덜 일반적입니다.

$ truss -t write echo foo
foowrite(1, " f o o", 3)                                = 3
write(1, "\n", 1)                               = 1

또한 이진을 살펴 보는 것이 합리적 일 수 있습니다. UNIX 시스템에서는 사용할 수 있습니다 objdump 이진의 레이아웃을 보려면. 이것은 코드 및 데이터 섹션을 가리 킵니다. 그런 다음 바이너리를 열면 16 진 편집기를 열고 특정 오프셋으로 이동할 수 있습니다. 당신은 내 것에 관심이있을 수 있습니다 Solaris 이진 파일에 대한 팁.

  • 유사성을 찾기 위해 2 개 이상의 파일이 있습니다. 이것은 종종 파일의 헤더 블록과 다른 섹션을 식별하는 데 도움이됩니다.

  • Endianness는 일반적으로 운동하기가 매우 쉽습니다. 더 중요하지 않은 바이트는 덜 중요하지 않은 것보다 훨씬 더 자주 0 인 경향이 있으므로 "00 78"또는 "78 00"과 같은 패턴을 보면 좋은 추측을 할 수 있습니다. 바이트는 MSB입니다. 그러나 이것은 미리 데이터가 무엇인지 (대략적으로) 해결했을 때만 도움이되므로 데이터가 어떻게 정렬되는지 알 수 있습니다.

  • 쉽게 식별 된 데이터를 찾으십시오 - 문자열은 쉽게 찾을 수 있기 때문에 시작하는 첫 번째 장소입니다. 이들은 일반적으로 관련 데이터에 가까워지고 헤더의 stanadard 항목으로 사용되기 때문에 종종 단서를 제공합니다. 문자열이 유니 코드 인 경우 일반적으로 제로 바이트로 분리 된 텍스트 문자가 표시됩니다. 및 데이터의 데이터 정렬.

  • 일반적인 형식 접근법 (예 : IFF)은 각각 작은 헤더 (예 : 2 또는 4 바이트 ID, 블록의 2 또는 4 바이트 크기, 블록의 데이터)를 보유하는 데이터 청크를 저장하는 것입니다. 일반적으로 사람들은 의미있는 (그들에게) 청크 ID를 사용하므로 쉽게 찾을 수 있습니다. 태그처럼 보이는 것을 찾으면 다음 데이터를 확인하여 길이처럼 보이는지 확인하십시오 (데이터에서 많은 바이트가 켜져있는 것 같습니다. 다른 헤더가있는 것처럼 보이는지 확인하십시오). 이러한 형식을 식별 할 수 있다면 "하나의 큰 파일"문제를 "많은 작은 파일"문제로 나누어 훨씬 쉽게 만들어냅니다. (그러나 많은 장치 데이터가 컴팩트하게 만들기 위해 "최적화"되는 경향이 있습니다.이 경우 프로그래머는 종종 편리한 확장 가능한 형식을 버리고 모든 것을 함께 모으고 비트를 포장하고 일반적으로 물건을 훨씬 더 어려워집니다).

  • 알려진 값을 찾으십시오. 장치가 "온도 : 40"을 표시하는 경우 파일에 직접 저장된 값을 찾을 수 있습니다. (스케일링 계수 또는 고정점 값을 사용하는 것이 일반적이므로 40은 (예 : 40*10 = 400 또는 40*256 = 10240으로 표시 될 수 있습니다)

  • 장치를 충분히 제어 할 수있는 경우 : 간단한 파일을 만듭니다. 달성하려는 것은 장치에서 얻을 수있는 가장 작은 파일입니다. 검사해야 할 데이터를 최소화합니다. 그런 다음 파일이 변경되는 장치를 변경하여 변경 수를 최소화하고 파일을 다시 가져옵니다. 파일 형식이 "열기"(압축 또는 암호화되지 않음) 인 경우 변경된 바이트를 식별 할 수 있어야합니다.

  • 장치에 파일을 "로드"할 수있는 경우 자신의 파일을 만들 수 있으며 장치의 동작 변경을 알 수 있는지 확인하기 위해 하나의 값을 변경할 수도 있습니다. 간단한 값을 누르면 이렇게하면 잘 작동 할 수 있지만 종종 파일 형식을 깨뜨릴 수 있으며 장치가 데이터를 전혀 읽을 수 없습니다.

나는 패턴을 해결하고 다른 엔디 니언을 시도 할 수있는 마법의 유용성이 있기를 바랐다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top