실제로 칩과 관련이 없지만 여기에서 따라야 할 지침이 있습니다.
코드 덩어리가 있지만 어떤 프로세서를 사용해야하는지 모르겠습니다. 코드 유형을 식별하는 데 도움이되는 도구가 있습니까? 어떤 통계 방법이 도움이 될 수 있습니까? 바이트 배포? 페어 배포 등? 마르코프 체인?
실제로 칩과 관련이 없지만 여기에서 따라야 할 지침이 있습니다.
코드 덩어리가 있지만 어떤 프로세서를 사용해야하는지 모르겠습니다. 코드 유형을 식별하는 데 도움이되는 도구가 있습니까? 어떤 통계 방법이 도움이 될 수 있습니까? 바이트 배포? 페어 배포 등? 마르코프 체인?
답변:
GNU 파일을 통해 실행 해보십시오. 표준 헤더가 있으면 선택합니다.
예 :
jrt@lin:~/src$ file foo
foo: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, not stripped
이것은 매우 흥미로운 질문입니다. 거기에는 수백만 개의 명령 세트가 있지만 매우 일반적으로 사용되는 소수의 명령 세트 만 있습니다.
가장 먼저 살펴볼 것은 원점과 의도 된 사용입니다. 미국에서 설계된 것으로 의심되는 경우 , 예를 들어 영어로 제공되는 데이터 시트가있는 프로세서를 주로 타겟팅하는 것입니다. 아시아에서 설계된 경우 미국 엔지니어가 거의 볼 수없는 대량 제조 장치에 사용되는 프로세서가 많이 있습니다. 유럽에도 다른 프로세서보다 일반적인 프로세서가 몇 개 있습니다.
그런 다음 코드 크기와 기능을 살펴 보겠습니다 (코드의 기능을 어느 정도 알고 있다고 가정). 코드가 몇 메가 바이트라면 대부분의 임베디드 8 비트 프로세서를 거의 할인 할 수 있고 외부 메모리가있는 더 큰 장치를 살펴볼 수 있습니다. 몇 킬로바이트 이하이면 더 작고 저렴한 장치에 집중하고 싶을 것입니다. 기능이 단순하면 4 비트 프로세서 용 코드 일 수도 있습니다.
이 시점에서 메모리 구조를 살펴 보는 것이 좋습니다. 최소한 프로그램 섹션과 데이터 섹션이있을 수 있습니다. 이진 파일 (인텔 16 진수 또는 모토로라 레코드와 비교) 인 경우 메모리에서 특정 데이터 덩어리가 배치되는 위치에 대한 통찰력이 거의 없습니다. 16 진 편집기에 일부 패턴이 표시 될 수 있습니다. 16 진 또는 s 레코드 형식으로 된 경우 프로세서의 메모리 구조에 대한 자세한 정보가있을 수 있습니다. 일부 프로세서는 프로그램 메모리 위치 0에서 재설정하고 일부 프로세서는 가장 높은 메모리 위치에서 재설정합니다. 프로그램은 별도의 메모리 위치에 EEPROM 초기 값을 포함 할 수 있습니다. 보안 프로세서 (뱅킹에 사용됨)를위한 것이면 홀수 메모리 위치에 대한 보안 키가있을 수도 있습니다.
프로그래밍 된 언어에 따라 추가 힌트가있을 수 있습니다. C 또는 유사한 절차 언어로 프로그래밍 된 경우 함수는 거의 항상 특정 레지스터를 스택 (많은 푸시)에 저장하는 명령 시퀀스로 시작한 다음 많은 팝을 반환하기 전에 스택에서 원래 값을 반환합니다 . 패턴 인식을 수행 할 수있는 경우 이러한 시퀀스 중 많은 부분을 찾을 수 있으며 푸시 / 팝 명령어, 리턴 등의 명령어를 선택하여 선택 범위를 조금 좁힐 수 있습니다.
인터럽트가있는 임베디드 장치 인 경우 인터럽트 벡터 테이블이있을 수 있습니다. 인터페이스 테이블은 큰 블록에서 다른 메모리 위치로 이동하는 것처럼 보입니다. 아마도 편리한 위치 (예 : 주소 0x ??? 0) . 점프 테이블은 다른 용도로도 사용되지만 점프 할 주소를 제외하고 동일하게 보이는 명령 시퀀스를 찾을 수있는 경우 점프 명령이 어떻게 보이는지 유추하고 다시 좁힐 수 있습니다 아래로 당신의 선택.
이 시점에서 가장 일반적인 프로세서 아키텍처부터 시작하여 상관 관계가 있는지 확인합니다. x86, arm, mips, 8051, avr, pic, powerpc, Z80, 68k, 6502 등 등. 적어도 영어권 세계에서는 유용한 프로세서와 명령어 세트가 있습니다.
나는 이것에 도움이되는 자동화 된 도구를 알지 못하지만 MAME는 많은 프로세서 아키텍처를 에뮬레이트하며 가능한 한 가지 방법은 여러 프로세서를 통해 코드를 실행하고 레지스터가 무엇을 따라 클릭하는지 확인하는 것입니다 당신은 디자인에 대해 알고 있습니다.
C 또는 Pascal과 같은 언어로 컴파일 된 경우 특정 표준 이진 시퀀스를 찾을 수 있습니다. 예를 들어 C를 사용하면 거의 모든 함수가 스택 포인터를 "프레임"또는 "링크"포인터에 저장하는 것으로 시작합니다. 특정 프로세서에 대해 일반적으로이 작업을 수행하는 몇 가지 방법이 있습니다. 따라서이 시퀀스에 대해 X의 이진을 찾아 "프로세서 X의이 코드입니까?"라고 대답 할 수 있습니다.
즉, 막대 그래프를 사용하여 8088, 6502 및 68000 이진을 구분하는 행운을 얻었습니다. 특정 프로세서에는 특정 법적 명령 opcode가 있으며 평균보다 약간 더 자주 사용되는 경향이 있습니다. 충분히 큰 이진 덩어리를 사용하면 특정 추세를 볼 수 있습니다. 그러나, 주어진 이진 조각의 모든 피연산자 가 주어진 프로세서 유형과 상관 관계가없는 경향이 있기 때문에 이것은 어렵다. 이것은 본질적으로 히스토그램 데이터에서 노이즈를 발생시킨다. 또한 동일한 프로세서에 대해 서로 다른 두 개의 프로그램조차도 막대한 히스토그램을 가질 수 있습니다. 아직도, 그것은 당신에게 시작의 장소를 줄 수 있습니다.