Assembly ARM disembler的带多个头的Processing.ELF

Assembly ARM disembler的带多个头的Processing.ELF,assembly,arm,elf,disassembly,Assembly,Arm,Elf,Disassembly,我正在编写一个简单的ARM分解器,它接受一个ELF文件,并将其恢复为ARM指令 我在处理包含多个程序头的ELF文件时遇到问题。我有一个.ELF文件示例来演示这一点,但我不确定在哪里上传它 我认为问题在于我将错误的起始地址传递到disemble()函数中 有人对此有什么想法吗 MAIN.c #包括 #包括 #包括 #包括 #包括“elf.h” 无效反汇编(无符号整数*armI、整数计数、无符号整数起始地址); 无效解码指令(无符号整数指令,无符号整数地址); 无效十六进制二进制(整数*位,无符号整

我正在编写一个简单的ARM分解器,它接受一个ELF文件,并将其恢复为ARM指令

我在处理包含多个程序头的ELF文件时遇到问题。我有一个.ELF文件示例来演示这一点,但我不确定在哪里上传它

我认为问题在于我将错误的起始地址传递到disemble()函数中

有人对此有什么想法吗

MAIN.c

#包括
#包括
#包括
#包括
#包括“elf.h”
无效反汇编(无符号整数*armI、整数计数、无符号整数起始地址);
无效解码指令(无符号整数指令,无符号整数地址);
无效十六进制二进制(整数*位,无符号整数十六进制);
int SignExtend(无符号整数x,整数位);
整数旋转(无符号整数旋转对象,整数金额);
无效打印ASCII(无符号整数指令);
无效进程SWI(整数*位,无符号整数指令,字符*指令PTR);
void ProcessBranch(int*位,无符号int instr,无符号int currentAddress,char*指令ptr);
void ProcessDP(int*位,无符号int instr,char*指令ptr);
无效进程LDR(整数*位,无符号整数指令,字符*指令PTR);
void ProcessMUL(整数*位,无符号整数指令,字符*指令ptr);
无效进程LDM(整数*位,无符号整数指令,字符*指令PTR);
int main(int argc,const char*argv[]
{
文件*fp;
小精灵头;
int i;
无符号int*armInstructions=NULL;
如果(argc<2)
{
fprintf(stderr,“用法:解除\n”);
返回1;
}
/*打开ELF文件进行二进制读取*/
if((fp=fopen(argv[1],“rb”))==NULL)
{
fprintf(stderr,“%s\n”,argv[1]);
退出(退出失败);
}
/*读入页眉*/
fread(&elfhead,1,sizeof(ELFHEADER),fp);
if(!(elfhead.magic[0]==0177&&elfhead.magic[1]='E'&&elfhead.magic[2]='L'&&elfhead.magic[3]='F'))
{
fprintf(stderr,“%s不是ELF文件\n”,argv[1]);
返回2;
}
printf(“\n文件类型:%d\n”,elfhead.filetype);
printf(“拱形类型:%d\n”,elfhead.archtype);
printf(“条目:%x\n”,elfhead.Entry);
printf(“程序头:%x\n”,elfhead.phdrpos);
printf(“程序头计数:%d\n”,elfhead.phdrcnt);
printf(“节头:%x\n”,elfhead.shdrpos);
/*查找和读取程序头*/
ELFPROGHDR*prgHdr[elfhead.phdrcnt];
对于(i=0;i偏移量);
printf(“文件大小:%d\n”,prgHdr[i]->filesize);
printf(“对齐:%d\n”,prgHdr[i]->Align);
/*分配内存并读入ARM指令*/
armInstructions=(unsigned int*)malloc(prgHdr[i]->filesize+3&~3);
if(armInstructions==NULL)
{
fclose(fp);
免费(prgHdr[elfhead.phdrcnt]);
fprintf(stderr,“内存不足”);
返回3;
}
fseek(fp,prgHdr[i]->偏移,寻道集);
fread(armInstructions,1,prgHdr[i]->filesize,fp);
/*拆开*/
printf(“\n说明\n\n”);
反汇编(armInstructions,(prgHdr[i]>filesize+3&~3)/4,prgHdr[i]>virtaddr);
printf(“\n”);
自由(武装指令);
免费(prgHdr[i]);
}
fclose(fp);
返回0;
}
无效反汇编(无符号整数*armI、整数计数、无符号整数起始地址)
{
int i;
printf(“地址十六进制ASCII\tDisassembly\n”);
printf(“=============================================================\n”);
对于(i=0;i=0;i--)
{
printf(“%d”,位[i]);
}*/
}
int SignExtend(无符号整数x,整数位)
{
INTR;
int m=1U i)和1;
}
}
无效打印代码(未签名的int instr,字符*指令PTR)
{
开关((仪表和0xF0000000)>>28)
{
案例(13):strcat(指令PTR,“LE”);中断;
案例(12):strcat(指示PTR,“GT”);中断;
案例(11):strcat(指示PTR,“LT”);中断;
案例(10):strcat(指令PTR,“GE”);中断;
案例(9):strcat(指示PTR,“LS”);中断;
案例(8):strcat(指令PTR,“HI”);中断;
案例(7):strcat(指令PTR,“VC”);中断;
案例(6):strcat(指令PTR,“VS”);中断;
案例(5):strcat(指示PTR,“PL”);中断;
案例(4):strcat(指示PTR,“MI”);中断;
案例(3):strcat(指令PTR,“CC/LO”);断路;
案例(2):strcat(指示PTR,“CS/HS”);中断;
案例(1):strcat(