programing

디스어셈블러를 작성하는 방법?

nasanasas 2020. 11. 18. 09:13
반응형

디스어셈블러를 작성하는 방법?


저는 x86 dissembler를 교육 프로젝트로 작성하는 데 관심이 있습니다.

내가 찾은 유일한 리소스는 Spiral Space의 " 디스어셈블러 작성 방법 "입니다. 이것은 디스어셈블러의 다양한 구성 요소에 대한 높은 수준의 설명을 제공하지만 좀 더 자세한 리소스에 관심이 있습니다. 또한 NASM의 소스 코드 간략히 살펴 보았지만 이것은 배우기에는 다소 무거운 것입니다.

이 프로젝트의 주요 과제 중 하나는 내가 처리해야 할 다소 큰 x86 명령 세트라는 것을 알고 있습니다. 또한 기본 구조, 기본 디스어셈블러 링크 등에 관심이 있습니다.

x86 디스어셈블러 작성에 대한 자세한 리소스를 알려주는 사람이 있습니까?


80386 Programmer 's Reference Manual의 섹션 17.2살펴보십시오 . 디스어셈블러는 실제로 미화 된 유한 상태 기계입니다 . 분해 단계는 다음과 같습니다.

  1. 현재 바이트 명령 프리픽스 바이트인지 확인 ( F3, F2또는 F0); 그렇다면 REP/ REPE/ REPNE/ LOCK접두사가 있습니다. 다음 바이트로 이동합니다.
  2. 현재 바이트가 주소 크기 바이트 ( 67)인지 확인합니다. 그렇다면 현재 32 비트 모드에있는 경우 16 비트 모드에서 나머지 명령어의 주소를 디코딩하고 현재 16 비트 모드에있는 경우 32 비트 모드에서 주소를 디코딩합니다.
  3. 현재 바이트가 피연산자 크기 바이트 ( 66) 인지 확인하십시오 . 그렇다면 현재 32 비트 모드 인 경우 16 비트 모드에서 즉시 피연산자를 디코딩하고 현재 16 비트 모드 인 경우 32 비트 모드에서 즉시 피연산자를 디코딩합니다.
  4. 현재의 바이트는 세그먼트 재정의 바이트 있는지 확인하십시오 ( 2E, 36, 3E, 26, 64, 또는 65). 그렇다면 기본 세그먼트 레지스터 대신 해당 세그먼트 레지스터를 사용하여 주소를 디코딩하십시오.
  5. 다음 바이트는 opcode입니다. opcode가 0F이면 확장 된 opcode이고 다음 바이트를 확장 된 opcode로 읽습니다.
  6. 특정 opcode에 따라 Mod R / M 바이트, SIB (Scale Index Base) 바이트, 변위 (0, 1, 2 또는 4 바이트) 및 / 또는 즉치 값 (0, 1)을 읽고 디코딩합니다. , 2 또는 4 바이트). 이러한 필드의 크기는 이전에 디코딩 된 opcode, 주소 크기 재정의 및 피연산자 크기 재정의에 따라 다릅니다.

opcode는 수행중인 작업을 알려줍니다. opcode의 인수는 Mod R / M, SIB, 변위 및 즉치 값의 값으로 디코딩 될 수 있습니다. x86의 복잡한 특성으로 인해 많은 가능성과 특별한 경우가 있습니다. 더 자세한 설명은 위의 링크를 참조하십시오.


나는 몇몇 오픈 소스 디스어셈블러, 가급적 디 스토밍 , 특히 "disOps (Instructions Sets DataBase)"(ctrl + find it on the page)를 확인하는 것이 좋습니다 .

문서 자체는 opcode 및 지침에 대한 풍부한 정보로 가득 차 있습니다.

https://code.google.com/p/distorm/wiki/x86_x64_Machine_Code 에서 인용

80x86 명령 :

80x86 명령어는 여러 요소로 나뉩니다.

  1. 명령어 접두어는 명령어 작업의 동작에 영향을줍니다.
  2. SSE 명령어의 opcode 바이트로 사용되는 필수 접두사입니다.
  3. Opcode 바이트는 하나 이상의 바이트 일 수 있습니다 (최대 3 바이트).
  4. ModR / M 바이트는 선택 사항이며 때로는 opcode 자체의 일부를 포함 할 수 있습니다.
  5. SIB 바이트는 선택 사항이며 복잡한 메모리 간접 형식을 나타냅니다.
  6. 변위는 선택 사항이며 다양한 크기의 바이트 (byte, word, long) 값이며 오프셋으로 사용됩니다.
  7. 즉시는 선택 사항이며 다양한 크기의 바이트 (바이트, 단어, 긴)에서 빌드 된 일반 숫자 값으로 사용됩니다.

형식은 다음과 같습니다.

/-------------------------------------------------------------------------------------------------------------------------------------------\
|*Prefixes | *Mandatory Prefix | *REX Prefix | Opcode Bytes | *ModR/M | *SIB | *Displacement (1,2 or 4 bytes) | *Immediate (1,2 or 4 bytes) |
\-------------------------------------------------------------------------------------------------------------------------------------------/
* means the element is optional.

데이터 구조 및 디코딩 단계는 https://code.google.com/p/distorm/wiki/diStorm_Internals에 설명되어 있습니다.

인용문:

디코딩 단계

  1. [접두사]
  2. [오피 코드 가져 오기]
  3. [필터 Opcode]
  4. [피연산자 추출]
  5. [텍스트 서식]
  6. [16 진수 덤프]
  7. [디코딩 명령]

각 단계도 설명되어 있습니다.


원래 링크는 역사적인 이유로 유지됩니다.

http://code.google.com/p/distorm/wiki/x86_x64_Machine_Codehttp://code.google.com/p/distorm/wiki/diStorm_Internals


조립 된 작은 프로그램으로 시작하여 생성 된 코드와 지침을 모두 제공합니다. 지침 아키텍처에 대한 참조를 얻고 , 생성 된 코드 중 일부를 아키텍처 참조와 함께 직접 작업하십시오. 명령어는 피연산자의 수가 다양한 inst op op op 의 매우 전형적인 구조를 가지고 있음을 알 수 있습니다. 여러분이해야 할 일은 코드의 16 진수 또는 8 진수 표현을 명령어와 일치하도록 변환하는 것입니다. 조금 놀아 보면 알 수 있습니다.

That process, automated, is the core of a disassembler. Ideally, you're probably going to want to construct a n array of instruction structures internally (or externally, if the program is really large). You can then translate that array into the instructions in assembler format.


You need a table of opcodes to load from.

The fundamental lookup datastructure is a trie, however a table will do well enough if you don't care much about speed.

To get the base opcode type, beginswith match on the table.

There are a few stock ways of decoding register arguments; however, there are enough special cases to require implementing most of them individually.

Since this is educational, have a look at ndisasm.


Checkout objdump sources - it's a great tool, it contains many opcode tables and it's sources can provide a nice base for making your own disassembler.

참고URL : https://stackoverflow.com/questions/924303/how-to-write-a-disassembler

반응형