我使用IDA拆解了一个android库,并希望在其中一个函数的末尾执行一些额外的步骤。目前,最后一个指令字节是BD E8 F0 8F,在拇指模式下,IDA会将其分解为POP.W {R4-R11,PC}。记得在程序开始时放置了POP.W.thumb,并用.arch armv7a完成了我的代码。不幸的是,从手臂工具链中使用gnu会导致POP.W {R4-R11,PC}

好吧,gnu因为不喜欢.w后缀,所以我将指令替换为Error: bad instruction pop.w '{R4-R11,PC}'。这会将错误消息更改为错误:无效的寄存器列表以推送/弹出指令-POP {R4-R11,PC}

我知道某些较旧的ARM芯片对从R8开始的寄存器的操作有限制。为了进行验证,我将指令替换为pop {R4-R11,PC}。而且确实可以很好地组装。

现在我不知道如何继续?


也许我必须给as提供另一个体系结构选择。但是.arch armv7a似乎是最新的,适用于android armv7a库。 。但是,将单个两字节指令(POP {R4-R7,PC}BD E8)输入到在线反汇编程序中的结果似乎与从堆栈中弹出无关。 ,但没有任何改变。因此,我倾向于认为字节序列是真正的4字节拇指模式操作码。

我还需要在程序中指定什么才能使gnu识别指令?

#1 楼

默认情况下,as对手臂和拇指指令使用旧的“ divided”语法。因此,它无法识别您的pop.w指令。

要使其正常运行,请在程序开头添加.syntax unified。这告诉它使用新的统一语法,并且您应该找到它成功地组装了pop.w