我正在编写一个ARMv7反汇编程序。在ARM参考手册中清楚地描述了在手臂和拇指模式之间切换的方法,但是您如何知道程序是以什么模式启动的呢?
我使用的是Xcode,它在默认情况下编译为拇指,所以我知道我自己的所有程序都将以拇指启动,除非我强制编译到ARM模式。但是,我希望能够采用任意的mach-o可执行文件,并在代码的开头找到指令集模式。
在mach-o头中是否有指定入口点上的指令集的地方?
发布于 2015-08-28 21:04:57
处理器通过打开程序计数器中最不重要的位,知道它处于拇指模式,从而导致程序计数器具有奇数值。为了获取指令,这个位被忽略了,您可以通过切换这个位在手臂和拇指模式之间切换。
创建ARM二进制文件时,链接器将根据该符号是指向ARM还是拇指代码来设置符号地址中最不重要的位,以便处理器在程序启动时自动选择正确的模式。你不需要关心这个。
发布于 2015-08-28 20:48:22
大多数操作系统在应用程序的入口点C运行时支持之前插入一些代码。他们将启动您的应用程序在任何模式下,代码是写的。然后,在调用main()或其他入口点时,该代码将根据需要更改模式。
在iOS的例子中,因为您使用的是Xcode,所以我假设您的目标是/usr/local/lib/crt0.o
,这段代码位于iOS SDK目录中的/usr/local/lib/crt0.o
中。拆解它显示符号start
是ARM代码。也就是说,iOS应用程序总是在ARM模式下开始运行,但是它们可以在以后很早就改变模式。
发布于 2015-08-29 00:20:12
取决于你所说的入口点是什么意思。答案就在这个定义中。操作系统必须有一个定义,因为它必须处于正确的模式。因此,无论是操作系统总是定义arm模式,例如,然后代码可以切换如果它想。或者,如果你使用像精灵这样的文件格式,有一个入口点,那么你就可以逃脱一个偶数地址是手臂,一个奇怪地址是拇指,与bx/blx指令相匹配。
如果你说的是其中一个核心,那么一个armv7m总是会启动,并且必须保持拇指模式。armv7a和r将以arm模式启动(重置,其他定义在arm文档中,可能是arm模式),然后代码可以切换。
如果您只是试图反汇编一些通用的对象文件,那么您可能无法找到它。当你看到大量的0XE(每个单词的开头)可能是arm代码,0x6或0x7,而不是很多0xE或无(每半个字),那么这可能是拇指代码。但是,这不是您可以依赖的任务,因为前几个指令很可能会切换模式,如果有一个切换将要发生。
此外,如果一个精灵文件,你可能能够从块头,我认为这是如何解决它的gnu工具,因为他们肯定不会在飞行中检测到它。所以这很可能是你想要做的,检查精灵文件。如果这是一个原始二进制,只是指令和data...good运气..。
https://stackoverflow.com/questions/32278382
复制相似问题