Programing

원시 16 비트 x86 기계어 코드를 어떻게 분해합니까?

lottogame 2020. 9. 11. 19:24
반응형

원시 16 비트 x86 기계어 코드를 어떻게 분해합니까?


내가 가지고있는 부팅 가능한 x86 디스크의 MBR (처음 512 바이트)을 분해하고 싶습니다. 다음을 사용하여 MBR을 파일에 복사했습니다.

dd if=/dev/my-device of=mbr bs=512 count=1

파일을 분해 할 수있는 Linux 유틸리티에 대한 제안 사항이 mbr있습니까?


objdump를 사용할 수 있습니다. 이 기사 에 따르면 구문은 다음과 같습니다.

objdump -D -b binary -mi386 -Maddr16,data16 mbr

GNU 도구는 objdump 라고 합니다. 예를 들면 다음과 같습니다.

objdump -D -b binary -m i8086 <file>

나는 ndisasm이 목적을 좋아한다 . 무료이며 오픈 소스이며 대부분의 Linux 배포판의 패키지 저장소에 포함 된 NASM 어셈블러와 함께 제공됩니다.


ndisasm -b16 -o7c00h -a -s7c3eh mbr

설명 -ndisasm 맨 페이지에서

  • -b= 16 비트, 32 비트 또는 64 비트 모드를 지정합니다. 기본값은 16 비트 모드입니다.
  • -o= 파일의 명목상로드 주소를 지정합니다. 이 옵션을 사용하면 ndisasm이 왼쪽 여백 아래에 나열된 주소를 가져오고 오른쪽에 PC 상대 점프 및 호출의 대상 주소를 가져옵니다.
  • -a = 자동 (또는 지능형) 동기화 모드를 활성화합니다. ndisasm은 상대 점프의 대상 주소를 검사하고 디스 어셈블을 호출하여 동기화를 수행해야하는 위치를 추측합니다.
  • -s= ndisasm이 주소의 양쪽에있는 바이트를 포함하는 기계 명령어를 출력하지 않도록 동기화 주소를 수동으로 지정합니다. 따라서 해당 주소에서 시작하는 명령어는 올바르게 분해됩니다.
  • mbr = 분해 할 파일.

starbluehlovdal은 모두 정식 답변의 일부를 가지고 있습니다. 원시 i8086 코드를 분해하려는 경우 일반적으로 AT & T 구문이 아닌 Intel 구문이 필요하므로 다음을 사용하십시오.

objdump -D -Mintel,i8086 -b binary -m i386 mbr.bin
objdump -D -Mintel,i386 -b binary -m i386 foo.bin    # for 32-bit code
objdump -D -Mintel,x86-64 -b binary -m i386 foo.bin  # for 64-bit code

코드가 ELF (또는 a.out (또는 (E) COFF)) 인 경우 짧은 형식을 사용할 수 있습니다.

objdump -D -Mintel,i8086 a.out  # disassembles the entire file
objdump -d -Mintel,i8086 a.out  # disassembles only code sections

32 비트 또는 64 비트 코드의 경우 ,8086; ELF 헤더에는 이미이 정보가 포함되어 있습니다.

ndisasmjameslin이 제안한대로 jameslin 도 좋은 선택이지만 objdump일반적으로 OS와 함께 제공되며 GNU binutils (GCC에서 지원하는 항목의 상위 집합)에서 지원하는 모든 아키텍처를 처리 할 수 ​​있으며 해당 출력은 일반적으로 GNU에 공급 될 as수 있습니다 (일반적으로 nasm물론 먹이를 줄 수 있습니다 ).

Peter Cordes 는“ Agner Fog의 objconv 는 매우 훌륭합니다. 분기 대상에 레이블을 지정하여 코드가 수행하는 작업을 훨씬 쉽게 파악할 수 있습니다. NASM, YASM, MASM 또는 AT & T (GNU) 구문으로 분해 할 수 있습니다.”

멀티미디어 Mike는 이미 알게되었습니다 --adjust-vma. ndisasm동등한은입니다 -o옵션을 선택합니다.

분해, 말하자면, sh4코드 (예 :와 86 거의 모든 다른 디셈가 하나 개의 플랫폼으로 제한되며, GNU의 binutils 패키지와 함께 이것을 사용 (I 시험에 대한 데비안에서 하나의 바이너리를 사용) ndisasmobjconv) :

objdump -D -b binary -m sh -EL x

-m기계이며, -EL리틀 엔디안 (수단을 sh4eb사용 -EB하거나 엔디 언에 존재하는 구조와 관련이 대신).


다음 명령을 시도하십시오.

sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -

참고 URL : https://stackoverflow.com/questions/1737095/how-do-i-disassemble-raw-16-bit-x86-machine-code

반응형