Page 124 - 《软件学报》2024年第6期
P. 124
2700 软件学报 2024 年第 35 卷第 6 期
在验证研究中, Kim 等人 [115] 基于符号执行方法将多个不同版本的代码全部提升至 IR, 通过比较 IR 语义差异,
找出代码翻译过程中可能存在的错误, 但是该方法不支持浮点运算指令的语义等价性验证. Chen 等人 [116] 同时执
行翻译前和翻译后的代码, 逐个对比二者的执行过程状态变化和内存操作行为, 以确定翻译前后代码语义的等价
性. Koltunov 等人 [117] 以同一份代码在不同平台上的运行行为一致为前提, 将 C 语言代码编译后分别在目标平台
和 QEMU 上模拟运行, 通过比较两个版本的代码控制流和运行输出来检测 TCG IR 的语义正确性. Dasgupta 等人 [118]
使用符号执行和定理证明方法验证单条指令翻译前后的等价性, 然后基于经过验证的指令形成参考标准语义. 最
后基于图同构检查方法验证翻译后的代码与参考标准语义的等价性. 傅立国等人 [119] 通过形式化验证方法构建能
够涵盖动态二进制翻译和静态二进制翻译的统一抽象模型, 为二进制翻译的功能扩展和性能提升研究提供了理论
支撑, 但其并未就该抽象模型对具体的二进制翻译器进行实践证明.
此外, 针对二进制翻译过程对应用程序原有安全防护功能的影响, Chen 等人 [120] 逐项分析二进制翻译对缓冲
区溢出防护、恶意代码攻击检测、系统调用防护、防止逆向和安全断言检查功能的影响, 总结如表 6 所示. 研究
发现, 对于软件静态防护、加载时防护以及由软件自身发起的运行时防护措施, 原有安全功能不受二进制翻译过
程影响, 而依赖第三方应用的安全防护以及二进制翻译系统无法识别的安全防护在翻译过程中会被禁用或失效.
表 6 二进制翻译对软件安全防护措施功能影响
软件安全防护类型 防护手段 基于二进制翻译运行效果
StackShield [121] 有效
Propolice和StackGuard [122] 有效
缓冲区溢出防护
Libsafe [123] 有效
地址随机化 [124] 有效
自校验 [125] 在自引用属性保证前提下有效
恶意代码攻击检测
水印技术 [126] 有效
系统调用沙箱 [127] 有效
系统调用防护
系统调用认证 [128] 失效
代码混淆和代码变形 [129] 部分有效
[130]
防止逆向 基于二进制翻译执行时间
除基于时间方法之外有效
反调试
指令随机化 [131] 部分有效
安全断言检查 携带证明代码 [132] 有效
3.7 翻译效率提升
翻译效率是度量二进制翻译系统性能优劣最常用的指标 [12,17,37] . 翻译效率越高, 则表明二进制翻译系统越优
秀. 因此, 翻译效率的提升是业界持续关注的热点问题. 当前成熟的二进制翻译系统在翻译效率上取得了显著提
升, 例如, 基于 SPEC2006 测试集测试, ExaGear 实现 x86-to-ARM64 的平均翻译效率达 82% [12] ; Tango 实现
[5]
ARM32-to-ARM64 的平均翻译效率达 80% [37] ; Rosetta 2 实现 x86-64-to-ARM64 的平均翻译效率超过 75% ; LAT
实现 x86-to-LoongArch 的平均翻译效率超过 65% [17] .
本文将二进制翻译效率计算公式定义如下:
本地原生代码执行时间
翻译效率 = ×100% (1)
其中, 本地原生代码执行是指在目标平台上直接运行原生编译的二进制代码; 基于二进制翻译执行是指在目标平
台上利用二进制翻译技术模拟执行源程序的过程, 涉及开销包括指令翻译、运行时维护和目标代码执行这 3 部
分. 其中, 翻译开销包括对指令的翻译、程序状态模拟、运行环境准备等开销. 运行时开销包括控制流切换、缓存
代码查找、跳转目标地址计算等开销. 目标代码执行开销与本地原生代码执行类似. 理想情况下, 目标代码执行越
接近本地原生代码执行效果, 表示翻译生成的代码质量越高.
然而, 提升翻译效率并非易事, 主要原因有: (1) 二进制翻译系统自身在指令翻译、代码优化中引发了大量开