Hikari-LLVM15动态测试框架:使用LLVM lit进行功能验证
【免费下载链接】Hikari-LLVM15 项目地址: https://gitcode.com/GitHub_Trending/hi/Hikari-LLVM15
你是否在开发编译期混淆工具时遇到过这些问题?辛辛苦苦实现的代码混淆逻辑,在实际应用中却导致程序崩溃;添加的反调试保护,在特定场景下失效;优化的控制流平坦化,反而降低了执行效率?Hikari-LLVM15项目提供了基于LLVM lit(Lightweight Integrated Tester)的动态测试框架,帮助开发者快速验证混淆功能的正确性和稳定性。本文将详细介绍如何使用这一框架进行功能验证,确保你的混淆工具在迭代过程中始终保持可靠。
读完本文你将获得:
- 了解Hikari-LLVM15测试框架的基本架构
- 掌握使用LLVM lit编写测试用例的方法
- 学会分析测试结果并定位问题
- 掌握测试驱动的混淆功能开发流程
测试框架概述
Hikari-LLVM15是HikariObfuscator的一个分支版本,专注于LLVM 15的混淆功能增强和优化。项目的核心目标是提供更强大、更稳定的代码混淆能力,同时保持对多种编程语言(尤其是Swift)的良好支持。为了实现这一目标,项目采用了LLVM lit作为动态测试框架,确保每一项混淆功能都经过充分验证。
为什么选择LLVM lit?
LLVM lit是LLVM项目自带的轻量级集成测试工具,专为编译器和相关工具的测试设计。它具有以下优势:
- 与LLVM生态系统无缝集成,支持LLVM IR(Intermediate Representation,中间表示)文件的直接测试
- 灵活的测试用例格式,支持自定义测试规则和断言
- 并行测试执行,提高测试效率
- 丰富的命令行选项,支持测试用例过滤和结果报告生成
测试框架结构
Hikari-LLVM15的测试框架主要包含以下组件:
- 测试用例集合:位于项目根目录下的
test目录,包含各种混淆功能的测试用例 - 测试驱动脚本:用于解析测试用例、执行测试并验证结果的Python脚本
- 测试辅助工具:用于生成测试报告、比较测试结果的辅助程序
测试用例编写
基本测试用例格式
一个典型的LLVM lit测试用例是一个以.ll为扩展名的LLVM IR文件,包含以下几个部分:
- 测试元数据:以
; RUN:开头的注释,指定测试命令 - LLVM IR代码:待测试的中间表示代码
- 测试断言:以
; CHECK:开头的注释,指定预期的测试结果
以下是一个简单的控制流平坦化测试用例示例:
; RUN: opt -load %loadPolly -polly-canonicalize -polly-codegen -S < %s | FileCheck %s
; ModuleID = 'test.c'
source_filename = "test.c"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @foo(i32 %a, i32 %b) #0 {
entry:
%cmp = icmp sgt i32 %a, %b
br i1 %cmp, label %if.then, label %if.else
if.then: ; preds = %entry
%add = add nsw i32 %a, %b
br label %if.end
if.else: ; preds = %entry
%sub = sub nsw i32 %a, %b
br label %if.end
if.end: ; preds = %if.else, %if.then
%retval.0 = phi i32 [ %add, %if.then ], [ %sub, %if.else ]
ret i32 %retval.0
}
; CHECK: entry:
; CHECK-NEXT: %cmp = icmp sgt i32 %a, %b
; CHECK-NEXT: br i1 %cmp, label %if.then, label %if.else
; CHECK: if.then:
; CHECK-NEXT: %add = add nsw i32 %a, %b
; CHECK-NEXT: br label %if.end
; CHECK: if.else:
; CHECK-NEXT: %sub = sub nsw i32 %a, %b
; CHECK-NEXT: br label %if.end
; CHECK: if.end:
; CHECK-NEXT: %retval.0 = phi i32 [ %add, %if.then ], [ %sub, %if.else ]
; CHECK-NEXT: ret i32 %retval.0
Hikari-LLVM15特定测试用例
对于Hikari-LLVM15的混淆功能测试,测试用例需要包含相应的混淆参数。以下是一个使用控制流平坦化(Flattening)和虚假控制流(BogusControlFlow)混淆的测试用例示例:
; RUN: opt -load %loadHikari -hikari -enable-flattening -enable-bcfobf -bcf_prob=100 -S < %s | FileCheck %s
; ModuleID = 'test.c'
source_filename = "test.c"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
define dso_local i32 @foo(i32 %a, i32 %b) {
entry:
%cmp = icmp sgt i32 %a, %b
br i1 %cmp, label %if.then, label %if.else
if.then:
%add = add nsw i32 %a, %b
br label %if.end
if.else:
%sub = sub nsw i32 %a, %b
br label %if.end
if.end:
%retval.0 = phi i32 [ %add, %if.then ], [ %sub, %if.else ]
ret i32 %retval.0
}
; CHECK: entry:
; CHECK-NEXT: %cmp = icmp sgt i32 %a, %b
; CHECK-NEXT: br i1 %cmp, label %if.then, label %if.else
; CHECK: if.then:
; CHECK-NEXT: %add = add nsw i32 %a, %b
; CHECK-NEXT: br label %if.end
; CHECK: if.else:
; CHECK-NEXT: %sub = sub nsw i32 %a, %b
; CHECK-NEXT: br label %if.end
; CHECK: if.end:
; CHECK-NEXT: %retval.0 = phi i32 [ %add, %if.then ], [ %sub, %if.else ]
; CHECK-NEXT: ret i32 %retval.0
测试执行与结果分析
执行测试命令
在Hikari-LLVM15项目根目录下,执行以下命令启动测试:
lit test/
如果需要指定特定的测试用例或测试目录,可以使用以下命令:
lit test/obfuscation/bcf/
测试结果解读
测试执行完成后,LLVM lit会生成详细的测试报告,包含以下信息:
- 测试用例总数
- 通过的测试用例数
- 失败的测试用例数
- 超时的测试用例数
以下是一个典型的测试报告示例:
Testing Time: 0.23s
Expected Passes : 123
Expected Failures : 4
Unsupported Tests : 2
Unexpected Failures: 1
问题定位与调试
当测试失败时,可以通过以下步骤定位问题:
- 查看详细的测试输出,找到失败的测试用例
- 分析测试用例的预期结果与实际结果的差异
- 使用调试工具(如lldb)单步执行混淆过程,定位问题代码
- 修改代码并重新运行测试,验证修复效果
高级测试技巧
参数化测试
LLVM lit支持通过lit.local.cfg文件定义参数化测试,实现对不同混淆参数组合的测试。例如,可以定义一个测试套件,自动测试不同bcf_prob值对控制流混淆效果的影响。
性能测试
除了功能验证,Hikari-LLVM15还支持对混淆后代码的性能测试。通过在测试用例中添加性能指标断言,可以确保混淆功能不会引入过度的性能开销。
集成测试
Hikari-LLVM15提供了端到端的集成测试,验证混淆工具在实际项目中的应用效果。例如,项目中的examples/optool目录包含了一个完整的混淆示例:
- 原始二进制文件:optool
- 混淆后的二进制文件:optool_obfuscated
- 剥离符号后的混淆二进制文件:optool_obfuscated_stripped
通过比较这些文件的大小、执行效率和反汇编结果,可以全面评估混淆效果。
总结与展望
Hikari-LLVM15的LLVM lit动态测试框架为混淆功能的开发和维护提供了强大的支持。通过编写全面的测试用例,开发者可以确保每一项混淆功能的正确性和稳定性。随着项目的不断发展,测试框架将进一步完善,支持更多类型的测试和更复杂的混淆场景。
官方文档:README.md 混淆示例配置:examples/optool/README.md
如果你对Hikari-LLVM15的测试框架有任何建议或改进,欢迎通过项目贡献指南参与贡献。让我们共同打造更可靠、更强大的代码混淆工具!
【免费下载链接】Hikari-LLVM15 项目地址: https://gitcode.com/GitHub_Trending/hi/Hikari-LLVM15
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



