我可以使用objdump反汇编平面二进制文件吗?
我熟悉使用以下方法反汇编结构化二进制可执行文件,例如ELF文件:
objdump -d file.elf
Run Code Online (Sandbox Code Playgroud)
但是,如果我有一个我知道应该加载的平面二进制文件,例如地址0xabcd1000,我可以请求objdump反汇编吗?我尝试提供诸如'--start-address = 0xabcd1000'之类的选项,但是objdump只是声明它不能识别格式.
我有关于如何反汇编文件的其他想法,但我想知道objdump是否可以提供一个简单的解决方案.
我是一名电气工程师,他最近发现需要修改MBR中的代码.基本上我需要能够在HDD之前执行代码,操作系统启动并接管.
我完全理解这需要在汇编中编写,并且考虑到MBR中的446个字节左右的代码空间我只希望调用MBR之外的其他代码.我的问题是什么是写入MBR的最佳方式?如果我想改变MBR,那就说磁盘HDD_1 ...将HDD_1引入另一台机器然后写入它,或者在当前机器中直接(在窗口外)写入它是否更好.基本上我想我会插入一个电话并留下MBR的其余部分.
任何建议,将不胜感激
克里斯
我很清楚这将是困难的.我的问题是将指令放入MBR的最佳方法是什么?不言而喻,Windows不允许直接访问磁盘.您如何建议我在MBR中写入指令?是否可以启动*nix的live CD并从那里写入MBR?
例如,使用BIOS打印a到屏幕的引导扇区main.asm:
org 0x7c00
bits 16
cli
mov ax, 0x0E61
int 0x10
hlt
times 510 - ($-$$) db 0
dw 0xaa55
Run Code Online (Sandbox Code Playgroud)
然后:
nasm -o main.img main.asm
qemu-system-i386 -hda main.img -S -s &
gdb -ex 'target remote localhost:1234' \
-ex 'break *0x7c00' \
-ex 'continue' \
-ex 'x/3i $pc'
Run Code Online (Sandbox Code Playgroud)
我明白了:
0x7c00: cli
0x7c01: mov $0x10cd0e61,%eax
0x7c06: hlt
Run Code Online (Sandbox Code Playgroud)
所以看起来它mov ax, 0x0E61被解释为32位mov %eax并且将下一条指令int 0x10作为数据.
我怎么能告诉GDB这是16位代码?
也可以看看:
objdump" https://www.sourceware.org/ml/gdb/2007-03/msg00308.html,如下所示:如何反汇编原始x86代码?也许这是在实施的同时实施的?是否有一些工具可以将原始十六进制分解为汇编指令?例如:假设我们有\xeb\x1d根据这个在线反汇编程序反汇编成jmp 0x1f。那么有没有一些离线工具?我试过 ndasm 它没有给我正确的输出。
ndisam -b32 foo 给了我:
输出:
00000000 5C pop esp<br>
00000001 7833 js 0x36<br>
00000003 315C7865 xor [eax+edi*2+0x65],ebx<br>
00000007 620A bound ecx,[edx]
Run Code Online (Sandbox Code Playgroud)
它应该是 jmp 0x1f。我也试过 objdump 像:
objdump -D -b binary -mi386 -M intel foo
输出:
00000000 <.data>:<br>
0: 5c pop esp <br>
1: 78 33 js 0x36 <br>
3: 31 5c 78 65 xor DWORD PTR [eax+edi*2+0x65],ebx<br>
7: 62 0a bound ecx,QWORD PTR [edx]<br>
Run Code Online (Sandbox Code Playgroud)
所以你能告诉我一些将原始十六进制代码反汇编成汇编语言的工具吗?
我也尝试过 gdb,但我想要更灵活的东西。
类似于我如何反汇编原始x86代码?,但是对于MIPS架构而言:我该如何反汇编原始MIPS代码objdump?我想查看vmlinux映像中的说明,但现在我必须这样做:
: > x.c
mipsel-linux-gnu-gcc -c -o x.o x.c
mipsel-linux-gnu-objcopy --add-section raw=vmlinux x.o
mipsel-linux-gnu-objcopy --remove-section .comment x.o
mipsel-linux-gnu-objdump -D x.o | less
Run Code Online (Sandbox Code Playgroud)
有更简单的方法吗?我尝试了以下无济于事:
mipsel-linux-gnu-objdump -b elf32-tradlittlemips -mmips -Mgpr-names=O32,cp0-names=mips1,cp0-names=mips1,hwr-names=mips1,reg-names=mips1 -D vmlinux | less
Run Code Online (Sandbox Code Playgroud)
它只是吐出来:
mipsel-linux-gnu-objdump: vmlinux: File format not recognized
Run Code Online (Sandbox Code Playgroud)
如果有帮助,这是一些命令的输出:
$ file x.o
x.o: ELF 32-bit LSB relocatable, MIPS, MIPS-I version 1 (SYSV), with unknown capability 0xf41 = 0x756e6700, with unknown capability 0x70100 = 0x1040000, not stripped
$ mipsel-linux-gnu-objdump -p x.o
x.o: file format elf32-tradlittlemips
private …Run Code Online (Sandbox Code Playgroud) 我有一个简单的程序集程序
.text
.globl _start
_start:
movl $1, %eax
movl $1, %ebx
int $0x80
Run Code Online (Sandbox Code Playgroud)
我已经组装好了.我已将其内容转储如下
root@bt:~# objdump -d out
out: file format elf32-i386
Disassembly of section .text:
08048054 <_start>:
8048054: b8 01 00 00 00 mov $0x1,%eax
8048059: bb 01 00 00 00 mov $0x1,%ebx
804805e: cd 80 int $0x80
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,如果只给出下面的机器代码,我能否找回助记符 \xb8\x01\x00\x00\x00\xbb\x01\x00\x00\x00\xcd\x80