可能重复:
反汇编,修改然后重新组装Linux可执行文件
我被告知装配和拆卸不是反转.显然,你不能解组程序,将输出直接放入汇编程序,并期望它能够正确运行,因为信息丢失了.
我的问题是,为什么信息会丢失?还有什么信息丢失了?
我们如何使用objdump输出到二进制文件?
这绝对不是正确的方法:
objdump -s -j .text /path/firmware.ko > /content.bin
因为它只呈现文本格式.我只需要提取文本段的字节并以二进制形式设置.
我正在尝试创建一个调度表,该表更改由AllocateMemoryOnRemoteProcess.
其中的一个问题,我遇到的是几乎所有的Calls都挺Jumps都near和relative和,只要我加载新的位置的组件,然后这些指令将无法正常工作。
据我所知,我应该将这些说明转换为far jump或far call我在谷歌搜索期间看到的解决方案之一正在使用push并ret喜欢:
push 0xdeadbeef
ret
Run Code Online (Sandbox Code Playgroud)
或者有人建议使用寄存器进行绝对寻址,例如:
mov %eax,0xdeadbeef
jmp %eax
Run Code Online (Sandbox Code Playgroud)
这些解决方案在我的情况下不起作用,因为只要我在函数例程中,更改堆栈状态或在第二种情况下更改寄存器%eax就会导致失败。
有人在这个问题中写道:
- call far(使用操作码 9A)跳转到一个绝对段和偏移量。即,这就像一次设置 CS 和 ?IP。
所以看来我应该将操作码与9Afor一起使用far calls,但这仅适用于调用,我不知道使用此方法转换各种跳转!
我经常objdump用来反汇编二进制文件,然后使用clang以下命令用作汇编程序:
clang -c MyAsm.asm -m32
Run Code Online (Sandbox Code Playgroud)
但是当我用上面的命令组装时,结果是相对的。
例如什么时候MyAsm.asm是:
call 0x402af2
Run Code Online (Sandbox Code Playgroud)
结果objdump是:
MyAsm.o: file format Mach-O 32-bit i386
Disassembly of section __TEXT,__text:
__text:
0: e8 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 riscv64-unknown-elf-objdump 反汇编 risc-v 二进制文件,并且我想获取硬件中看到的寄存器名称(如 x0-x31),而不是像 abi 中那样(sp、s0、a. .)。
objdump手册似乎没有针对RISC-V的这样的选项。事实上,手册中似乎没有任何与RISC-V相关的信息。ARM 有 -M reg-names-raw,有谁知道这样的标志是否可用?
riscv64-unknown-elf-objdump -M"no-aliases" -M"gpr-names-raw" -d hello
-> 返回
0: riscv64-unknown-elf-objdump: 无法识别的反汇编程序选项: gpr-names-raw gpr-names-raw 或 reg-names=ARCH 都不是可识别的选项
我想要这样的东西:
addi x1,x1,-32
sw x2,28(x3)
addi x5,x5,32
Run Code Online (Sandbox Code Playgroud)
而不是这个
addi sp,sp,-32
sw s0,28(sp)
addi s0,sp,32
Run Code Online (Sandbox Code Playgroud) 测试.S
.text
.global _start
_start:
xor %ax, %ax
mov %ax, %ds
mov %ax, %ss
mov %ax, %es
mov %ax, %fs
mov %ax, %gs
Run Code Online (Sandbox Code Playgroud)
我通过这样做得到了反汇编代码文件
$ x86_64-elf-gcc -g -c -O0 -m32 -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables .\test.S
$ x86_64-elf-ld .\test.o -m elf_i386 -Ttext=0x7c00 -o test.elf
$ x86_64-elf-objdump -x -d -S -m i386 ./test.elf > test_dis.txt
Run Code Online (Sandbox Code Playgroud)
测试_dis.txt
./test.elf: file format elf32-i386
./test.elf
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x00007c00
Program Header:
LOAD off 0x00000000 vaddr 0x00007000 paddr 0x00007000 align 2**12
filesz …Run Code Online (Sandbox Code Playgroud) 使用objdump来理解二进制文件,我意识到我在ASM语法方面不够流畅.以下概念意味着什么?
xor %al,-0x1(%edx,%ecx,1)
Run Code Online (Sandbox Code Playgroud)
当你在它的时候 - 我应该搜索什么才能找到关于这些概念的文档?
我想在cygwin上使用objdump命令.我得到了例外:
-bash:objdump:找不到命令
为什么cygwin无法找到objdump?
编辑----我可以在http://cygwin.com/packages/上看到binutils .一旦我找到binutils包,我点击它就会把我带到这里.我该如何安装?我到那儿后该怎么办?
elf文件是静态链接的
目前objdump的输出是这样的:
Disassembly of section: .init:
xxxxxx
Disassembly of section: .plt:
xxxxxx
Disassembly of section: .text:
xxxxxx
Run Code Online (Sandbox Code Playgroud)
基本上我想要实现的是
"elf-file - (通过objdump反汇编) - >汇编文件 - (重新编译) - > 相同的功能 "
我不需要重新编译的二进制文件具有与原始二进制文件相同的二进制内容,只有相同的功能就足够了.
经过快速搜索,基本上答案是否定的,他们认为反汇编文件丢失了一些像符号信息或其他东西,但我认为通过静态链接,我可以摆脱这个问题......
谢谢!
我有很多关于gdb和objdump的问题.
objdump中的地址
如果我这样做:objdump -d binary-file-name,那么我得到包含这部分的输出:
Disassembly of section .text:
080484a0 <_start>:
80484a0: 31 ed xor %ebp,%ebp
80484a2: 5e pop %esi
80484a3: 89 e1 mov %esp,%ecx
Run Code Online (Sandbox Code Playgroud)
我假设第一列中的这些数字是地址?但是我不明白这些地址是如何知道的,因为当一个进程被加载时它被放在内存中的一个随机位置,这意味着代码每次都有不同的地址?或者这些地址是相对于进程'地址空间?
<_start>下列出的值是什么?
GDB逐步执行代码
我有一个二进制文件,其中没有源代码.我想逐步完成该程序,但没有符号信息.我无法在功能名称或亚麻布上设置断点.我试图在地址上设置一个断点,这很有效,但我无法弄清楚如何逐步完成该程序.当我这样做:(gdb)s或(gdb)n它说它没有行信息,只运行整个函数.有没有办法逐步完成它,或逐步完成装配说明?
我正在阅读有关位置独立代码的文章,并且遇到了此函数的汇编清单。
0000043c <ml_func>:
43c: 55 push ebp
43d: 89 e5 mov ebp,esp
43f: e8 16 00 00 00 call 45a <__i686.get_pc_thunk.cx>
444: 81 c1 b0 1b 00 00 add ecx,0x1bb0
44a: 8b 81 f0 ff ff ff mov eax,DWORD PTR [ecx-0x10]
450: 8b 00 mov eax,DWORD PTR [eax]
452: 03 45 08 add eax,DWORD PTR [ebp+0x8]
455: 03 45 0c add eax,DWORD PTR [ebp+0xc]
458: 5d pop ebp
459: c3 ret
0000045a <__i686.get_pc_thunk.cx>:
45a: 8b 0c 24 mov …Run Code Online (Sandbox Code Playgroud)