文章总结: 文章给出在IDA微码中构造lnot(zf.1)并反控制流平坦化的完整Python脚本,重点解决mreg名到数字编号的映射难题:通过遍历0-850调用get_mreg_name()建立id-name表,避免硬编码;指出mop_d.size=1与mop_r.size=NOSIZE差异需照抄IDA行为,可直接get_mreg_id(‘zf’)替换原1值,实现跨架构通用。 综合评分: 82 文章分类: 逆向分析,安全工具,漏洞分析,二进制安全,AI安全
IDA微码从mreg名获取数字编号
原创
沈沉舟
青衣十三楼飞花堂
2026年1月9日 17:24 北京
创建: 2026-01-09 12:12
链接: https://scz.617.cn/python/202601091212.txt
用IDA微码反控制流平坦化(CFF)时,可能碰上自己构造条件跳转minsn的情形。更复杂时,像”jcnd lnot(zf.1), @xxx”这种,minsn.l的类型是mop_d。那如何构造”lnot(zf.1)”呢?我的实现如下:
def make_special_lnot ( ea ) :
mop_l = ida_hexrays.mop_t()
mop_l.t = ida_hexrays.mop_r
mop_l.r = 1
mop_l.size = 1
mop_r = ida_hexrays.mop_t()
mop_r.t = ida_hexrays.mop_z
mop_r.size = ida_hexrays.NOSIZE
mop_d = ida_hexrays.mop_t()
mop_d.t = ida_hexrays.mop_z
mop_d.size = 1
minsn = ida_hexrays.minsn_t( ea )
minsn.opcode \
= ida_hexrays.m_lnot
minsn.l = mop_l
minsn.r = mop_r
minsn.d = mop_d
return minsn
有两处比较莫明其妙。一是mop_d.size未设成NOSIZE,作为对比,mop_r.t是mod_z,mop_r.size是NOSIZE。同样是mod_z类型,为什么mop_d.size特殊了?我也不知道,只知IDA就这么设的,可在调试IDAPython脚本时手工检查之。
另一处是mop_l.r设为1,这是mreg zf的数字编号。微码有自己的mreg,不要与CPU的reg搞混。微码编程,操作的是mreg。mreg与reg之间有映射关系,在ida_hexrays.py中看这几个函数:
reg2mreg
mreg2reg
get_mreg_name
目标样本是AARCH64,mreg zf的数字编号是1。起初我是在调试器中看来的,不方便,因为下次可能处理其他mreg。暂未找到合适的API,用了个笨但有效的办法,遍历数字,调用get_mreg_name()获取mreg名,手工建立id->name的映射表,封装函数从表中根据name获取匹配id。
MREG = list(filter(lambda item: '^' not in item[1] and '[' not in item[1], ((i, ida_hexrays.get_mreg_name(i, 4)) for i in range(850))))
def get_mreg_id ( mreg ) :
for id, name in MREG :
if mreg == name :
return id
return None
遍历数字时,实测最大上限是850,若超过,将触发51283内部错。我看到的MREG长这样:
(0x0, 'cf'), (0x1, 'zf'), (0x2, 'nf'), (0x3, 'vf'), (0x4, 'pf'),
(0x5, 'cc'), (0x8, 'w0'), (0x10, 'w1'), (0x18, 'w2'), (0x20, 'w3'),
(0x28, 'w4'), (0x30, 'w5'), (0x38, 'w6'), (0x40, 'w7'), (0x48, 'w8'),
曾经懒得在调试器中看,已知w0是8,凭空猜测w0到w9按1步进;但看上表,错得离谱。幸亏取了全量映射。
最终make_special_lnot()中可以改写成
mop_l.r = get_mreg_id( 'zf' )
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:青衣十三楼飞花堂 沈沉舟《IDA微码从mreg名获取数字编号》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论