Arm64汇编:BFXIL指令

996.icu LICENSE

  • 问题背景
  • 解决方法
  • 总结

阅读之前注意:

本文阅读建议用时:10min
本文阅读结构如下表:

项目 下属项目 测试用例数量
问题背景 0
解决方法 1
总结 0

问题背景

复现一套加密算法时,遇到了BFXIL指令。
IDA中显示情况如下:

BFXIL           W9, W16, #2, #2

IDA使用Fn+F5操作得到伪代码如下:

v4 = v4 | ((v8 & 0xFC) >> 2) & 3;

其中v4就是w9,(v8 & 0xFC)这个整体就是w16,定义如下:

unsigned int v4; // w9

因为不太了解这条指令,所以也不知道解析的伪代码是不是正确的。

解决方法

IDA这样解析出来的伪代码是错误的。
先在armDeveloper搜索这条指令,知道了这是无符号位域提取指令。
有2种语法:

BFXIL Wd, Wn, #lsb, #width ; 32-bit
BFXIL Xd, Xn, #lsb, #width ; 64-bit

意思是:从Wn寄存器的第lsb位开始,提取width位,替换Wd寄存器的最低width位,剩余高位不改变。
下面分析我们的代码:

BFXIL           W9, W16, #2, #2

可以知道是从w16寄存器的第2位开始,提取2位,替换w14寄存器的最低2位,然后w14寄存器剩余高位不改变。这不就是先把w16寄存器先整体右移2位,然后w16&3从而保留最低2位,然后再用w14和前面“w16&3”的结果进行“|”操作吗?因此在IDA解析出来的如下结果:

v4 = v4 | ((v8 & 0xFC) >> 2) & 3;

做进一步修正得到以下结果:

v4 = v4 | (((v8 & 0xFC) >> 2) & 3);

测试后修正代码是能正确工作的!可以知道IDA在有些代码的解析还是会出错。

总结

Arm64汇编——BFXIL指令的意思是从Wn寄存器的第lsb位开始,提取width位,替换Wd寄存器的最低width位,剩余高位不改变。在逆向过程中遇到这种指令,在armDeveloper网站搜索指令了解意思后,即可复现。

如果本文对你有帮助,不如请我一罐可乐吧 🎃
在这里插入图片描述

发布了49 篇原创文章 · 获赞 28 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章