원시 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
= 분해 할 파일.
starblue 와 hlovdal은 모두 정식 답변의 일부를 가지고 있습니다. 원시 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 헤더에는 이미이 정보가 포함되어 있습니다.
ndisasm
jameslin이 제안한대로 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 시험에 대한 데비안에서 하나의 바이너리를 사용) ndisasm
과 objconv
) :
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
'Programing' 카테고리의 다른 글
pdb를 종료하고 프로그램을 계속하는 방법은 무엇입니까? (0) | 2020.09.11 |
---|---|
iOS에서 프로그래밍 방식으로 이미지에 색조를 지정하려면 어떻게해야합니까? (0) | 2020.09.11 |
WPF의 표준 컨트롤에 DockStyle.Fill을 사용하는 방법은 무엇입니까? (0) | 2020.09.11 |
Linq : 조건부로 where 절에 조건 추가 (0) | 2020.09.11 |
버튼에서 테두리 제거 (0) | 2020.09.11 |