원시 이진 코드에서 프로세서 유형을 식별 하시겠습니까?


19

실제로 칩과 관련이 없지만 여기에서 따라야 할 지침이 있습니다.

코드 덩어리가 있지만 어떤 프로세서를 사용해야하는지 모르겠습니다. 코드 유형을 식별하는 데 도움이되는 도구가 있습니까? 어떤 통계 방법이 도움이 될 수 있습니까? 바이트 배포? 페어 배포 등? 마르코프 체인?


7
원시 16 진수로 처음 200 바이트를 제공 할 수 있습니까?
pingswept

이것은 재미있는 질문입니다. 어떤 종류의 기기를 해킹하고 있습니까?
DavidEGrayson

1
몇 개의 다른 분해자에게 먹이를 줘서 어떻게되는지 볼 수 있습니다.
JustJeff

2
이 코드의 이름을 100 바이트로 지정하겠습니다! = P
JustJeff

좋은 질문입니다. 그러나 StackOverflow에 더 적합 할 수 있습니다.
sharptooth February

답변:


16

GNU 파일을 통해 실행 해보십시오. 표준 헤더가 있으면 선택합니다.

예 :

jrt@lin:~/src$ file foo
foo: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, not stripped

그것을 시도했다. GNU 파일은 "데이터"라고 말합니다.
mentalist

3
당신은 그것의 일부를 게시 할 수 있습니까? "문자열"을 사용하여 ASCII를 검색하려고하십니까?
Toby Jaffey

9

이것은 매우 흥미로운 질문입니다. 거기에는 수백만 개의 명령 세트가 있지만 매우 일반적으로 사용되는 소수의 명령 세트 만 있습니다.

가장 먼저 살펴볼 것은 원점과 의도 된 사용입니다. 미국에서 설계된 것으로 의심되는 경우 , 예를 들어 영어로 제공되는 데이터 시트가있는 프로세서를 주로 타겟팅하는 것입니다. 아시아에서 설계된 경우 미국 엔지니어가 거의 볼 수없는 대량 제조 장치에 사용되는 프로세서가 많이 있습니다. 유럽에도 다른 프로세서보다 일반적인 프로세서가 몇 개 있습니다.

그런 다음 코드 크기와 기능을 살펴 보겠습니다 (코드의 기능을 어느 정도 알고 있다고 가정). 코드가 몇 메가 바이트라면 대부분의 임베디드 8 비트 프로세서를 거의 할인 할 수 있고 외부 메모리가있는 더 큰 장치를 살펴볼 수 있습니다. 몇 킬로바이트 이하이면 더 작고 저렴한 장치에 집중하고 싶을 것입니다. 기능이 단순하면 4 비트 프로세서 용 코드 일 수도 있습니다.

이 시점에서 메모리 구조를 살펴 보는 것이 좋습니다. 최소한 프로그램 섹션과 데이터 섹션이있을 수 있습니다. 이진 파일 (인텔 16 진수 또는 모토로라 레코드와 비교) 인 경우 메모리에서 특정 데이터 덩어리가 배치되는 위치에 대한 통찰력이 거의 없습니다. 16 진 편집기에 일부 패턴이 표시 될 수 있습니다. 16 진 또는 s 레코드 형식으로 된 경우 프로세서의 메모리 구조에 대한 자세한 정보가있을 수 있습니다. 일부 프로세서는 프로그램 메모리 위치 0에서 재설정하고 일부 프로세서는 가장 높은 메모리 위치에서 재설정합니다. 프로그램은 별도의 메모리 위치에 EEPROM 초기 값을 포함 할 수 있습니다. 보안 프로세서 (뱅킹에 사용됨)를위한 것이면 홀수 메모리 위치에 대한 보안 키가있을 수도 있습니다.

프로그래밍 된 언어에 따라 추가 힌트가있을 수 있습니다. C 또는 유사한 절차 언어로 프로그래밍 된 경우 함수는 거의 항상 특정 레지스터를 스택 (많은 푸시)에 저장하는 명령 시퀀스로 시작한 다음 많은 팝을 반환하기 전에 스택에서 원래 값을 반환합니다 . 패턴 인식을 수행 할 수있는 경우 이러한 시퀀스 중 많은 부분을 찾을 수 있으며 푸시 / 팝 명령어, 리턴 등의 명령어를 선택하여 선택 범위를 조금 좁힐 수 있습니다.

인터럽트가있는 임베디드 장치 인 경우 인터럽트 벡터 테이블이있을 수 있습니다. 인터페이스 테이블은 큰 블록에서 다른 메모리 위치로 이동하는 것처럼 보입니다. 아마도 편리한 위치 (예 : 주소 0x ??? 0) . 점프 테이블은 다른 용도로도 사용되지만 점프 할 주소를 제외하고 동일하게 보이는 명령 시퀀스를 찾을 수있는 경우 점프 명령이 어떻게 보이는지 유추하고 다시 좁힐 수 있습니다 아래로 당신의 선택.

이 시점에서 가장 일반적인 프로세서 아키텍처부터 시작하여 상관 관계가 있는지 확인합니다. x86, arm, mips, 8051, avr, pic, powerpc, Z80, 68k, 6502 등 등. 적어도 영어권 세계에서는 유용한 프로세서와 명령어 세트가 있습니다.

나는 이것에 도움이되는 자동화 된 도구를 알지 못하지만 MAME는 많은 프로세서 아키텍처를 에뮬레이트하며 가능한 한 가지 방법은 여러 프로세서를 통해 코드를 실행하고 레지스터가 무엇을 따라 클릭하는지 확인하는 것입니다 당신은 디자인에 대해 알고 있습니다.


"유럽에도 다른 프로세서보다 더 많은 프로세서가 있습니다." 유럽에 살면서 이것은 결코 일어나지 않았습니다. 예를 들어 줄 수 있습니까?
stevenvh

@stevenvh Acorn과 Sinclair 회사로 인해 6502 및 Z80 기반 임베디드 시스템은 매우 인기가있었습니다. 물론 ARM 프로세서는 Acorn Computers에서 시작했습니다.
Adam Davis

5

아이디어 : 소스 코드 의 수명 , 즉 생성 된 시간 / 년 정도 를 알고 있습니까?

오래 되었으면 어떤 프로세서를 사용했는지에 대한 힌트를 얻을 수 있습니다. 작성된 연령 / 연도를 고려하여 해당 기간 동안 어떤 프로세서가 인기가 있었는지 판별하고 16 진 파일을로드 / 실행하십시오.

두 번째로, 지난 20 년 동안 프로세서의 대량 확산을 고려할 때, 이것은 건초 더미 기술 일 수 있으며 그다지 유익하지 않습니다.


4

여러 달 전에 여러 프로세서 코어가 없었을 때 주파수 분석을 통해 Z80 코드를 몇 번 식별했습니다 . Z80의 경우 CD에 대한 기계 코드 call subroutineC9이다 return from subroutine(나는 결코 잊지 않을 것이다), 이들은 종종 가장 발생하는 코드입니다. 그러나 머신 코드 레벨의 명령어 세트에 익숙해야합니다. 손으로 조립 한 경험이 도움이됩니다 (많은 것을 알고 있지만 오프셋을 계산하기 위해 16 진수로 거꾸로 계산할 수 있습니다).


3

파일이 12 비트 또는 14 비트 PIC 용인 경우 모든 바이트 쌍은 12 비트 또는 14 비트 워드이며 일반적으로 LSB를 먼저 저장하며 2 개 또는 4 개의 최상위 비트는 지워집니다.


1

C 또는 Pascal과 같은 언어로 컴파일 된 경우 특정 표준 이진 시퀀스를 찾을 수 있습니다. 예를 들어 C를 사용하면 거의 모든 함수가 스택 포인터를 "프레임"또는 "링크"포인터에 저장하는 것으로 시작합니다. 특정 프로세서에 대해 일반적으로이 작업을 수행하는 몇 가지 방법이 있습니다. 따라서이 시퀀스에 대해 X의 이진을 찾아 "프로세서 X의이 코드입니까?"라고 대답 할 수 있습니다.

즉, 막대 그래프를 사용하여 8088, 6502 및 68000 이진을 구분하는 행운을 얻었습니다. 특정 프로세서에는 특정 법적 명령 opcode가 있으며 평균보다 약간 더 자주 사용되는 경향이 있습니다. 충분히 큰 이진 덩어리를 사용하면 특정 추세를 볼 수 있습니다. 그러나, 주어진 이진 조각의 모든 피연산자 가 주어진 프로세서 유형과 상관 관계가없는 경향이 있기 때문에 이것은 어렵다. 이것은 본질적으로 히스토그램 데이터에서 노이즈를 발생시킨다. 또한 동일한 프로세서에 대해 서로 다른 두 개의 프로그램조차도 막대한 히스토그램을 가질 수 있습니다. 아직도, 그것은 당신에게 시작의 장소를 줄 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.