我有一个精灵文件,当我使用readelf -h文件名时,我得到了入口点。 现在,让我说我想自己计算这个地址[使用汇编,但语言并不重要]。
我怎样才能做到这一点?
我知道入口点是从文件中的偏移量24开始的4个字节,但是我不知道如何将这个数据转换成地址。
我可以使用一个寄存器作为循环计数器吗?
输出数据寄存器值在NASM
nasm系统调用Linux
Windows ASM printf与浮动
如何进行testing以确保只input一个整数,并确保input的长度在Assembly中的长度不超过5个字节?
如何比较Gasm(Gnu Assembler)中的string?
如何在Windowsexception处理程序中设置MMX寄存器以模拟不支持的3DNow! 说明
什么是程序启动时的默认寄存器状态(asm,linux)?
简单的多态引擎
通过程序集以编程方式检测上下文切换
我知道入口点是从文件中的偏移量24开始的4个字节,但是我不知道如何将这个数据转换成地址。
当您在与构建可执行文件的目标( x86 )相同的目标( x86 )上运行时,不需要任何翻译。
int fd = open(path,O_RDONLY); lseek(fd,24,SEEK_SET); unsigned long entry_point; read(fd,&entry_point,sizeof(entry_point)); printf("entry: 0x%lxn",entry_point);
PS 24只是Elf32正确补偿; 通过从偏移量0读取整个Elf32_Ehdr或Elf64_Ehdr (取决于字节5是ELFCLASS32还是ELFCLASS64 ),然后使用.e_entry成员来写这个更好。
你的问题不清楚。 如果你问如何从ELF文件读取这个值,你应该解析ELF文件(可能使用libelf或其他现有的帮助软件)。 如果你问如何使用一些关于二进制程序内容的知识来形成它,这个“魔术”就是从输入的偏移量如何编译到结果二进制文件中来计算的。
Linux中的二进制文件(使用标准工具链,即gcc + GNU binutils)是作为主要二进制文件的总和,后者的重定位表,prolog模块( crtbegin.o , crti.o ), crtend.o模块( crtend.o , crtn.o )。 入口点在序言中,但可以通过链接器放在主二进制内容之后(我在OpenSuSE上的/ bin / sh上看到这个内容),所以它实际上是在生成的二进制文件的末尾。 除非明确规定,否则这是链接器的选择权。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。