我有一个嵌入式设备的可执行文件 它没有gdb识别的头信息,而是使用供应商指定的专有头。
我可以使用IDA-pro分析文件,但是我想运行一些代码来查看它的功能。
可执行文件加载到地址0x52000000
但是如果我只是使用
加载文件exec-file myfile
我得到了
“myfile”:不是可执行格式:无法识别文件格式
如果我使用以下方法将内存恢复到正确的位置:
restore myfile 52000000
我明白了:
如果没有调试过程,就无法做到这一点。
如何摆脱这种鸡蛋问题?
我只想跳到代码中间,将一些寄存器设置为预定值并运行一些代码以查看会发生什么。
请注意,我正在使用ARM自身的gdb ARM工具链。
答案 0 :(得分:2)
根据@artless_noise建议,我做了以下事情:
objcopy.exe
--output-target=elf32-bigarm
--input-target=binary
--change-start=0x52000000
INPUTFILE OUTPUTFILE
这会在文件中添加elf
标题
但它并不能解决整个问题
readelf.exe -a OUTPUTFILE
给出:
ELF Header:
Magic: 7f 45 4c 46 01 02 01 61 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, big endian
Version: 1 (current)
OS/ABI: ARM
ABI Version: 0
Type: REL (Relocatable file)
Machine: ARM
Version: 0x1
Entry point address: 0x52000000
Start of program headers: 0 (bytes into file)
Start of section headers: 57316 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 0 (bytes)
Number of program headers: 0
Size of section headers: 40 (bytes)
Number of section headers: 5
Section header string table index: 2
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .data PROGBITS 00000000 000034 00df8c 00 WA 0 0 1
.....
请注意,.data
部分的地址仍为0x00000000
。这应该是0x52000000
为了解决这个问题,我在地址0xdf8c打开了一个十六进制编辑器
这与节标题的位置非常接近。
节标题的结构如下,以及我期望的数据。
typedef struct {
Elf32_Word sh_name;
Elf32_Word sh_type; = 1 {.data}
Elf32_Word sh_flags; = ?
Elf32_Addr sh_addr; = 0x00000000
Elf32_Off sh_offset; = 0x00000034
Elf32_Word sh_size; = 0x0000df8c
Elf32_Word sh_link;
Elf32_Word sh_info;
Elf32_Word sh_addralign;
Elf32_Word sh_entsize;
} Elf32_Shdr;
第一个标题始终为全零,第二个标题为.data
部分。
所以我寻找神奇的数字并填写起始地址,保存文件并将其重新加载到gdb中。
现在可行