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) 二进制翻译系统自身在指令翻译、代码优化中引发了大量开
   119   120   121   122   123   124   125   126   127   128   129