Lunar DLL映射测试实战:xunit如何覆盖Basic、Exception、StaticTLS、TlsCallback四类场景

发布时间:2026/8/22 14:56:50
Lunar DLL映射测试实战:xunit如何覆盖Basic、Exception、StaticTLS、TlsCallback四类场景 Lunar DLL映射测试实战xunit如何覆盖Basic、Exception、StaticTLS、TlsCallback四类场景【免费下载链接】LunarA lightweight native DLL mapping library that supports mapping directly from memory项目地址: https://gitcode.com/gh_mirrors/luna/LunarLunar 是一款轻量级原生 DLL 映射库支持直接从内存将 DLL 映射进目标进程。它的测试工程 Lunar.Tests 用 xunit 框架构建通过一组 C 测试二进制文件完整覆盖了 Basic、Exception、StaticTLS、TlsCallback 四类映射场景。本文带你快速看懂这套测试是如何设计与运行的。为什么 DLL 映射库需要专门的测试工程Lunar 的核心是 LibraryMapper.cs 中的LibraryMapper类提供两个关键方法MapLibrary()把 DLL 从磁盘或内存映射进目标进程UnmapLibrary()把已映射的 DLL 从进程卸载映射过程涉及异常处理器初始化、安全 Cookie 生成、TLS 回调执行等底层细节见 README.md因此测试工程需要针对不同 PE 特性构造专门的测试 DLL并验证映射后DllBaseAddress是否有效。测试工程整体结构一览测试代码集中在Lunar.Tests/目录下结构非常清晰X64Tests.csx64 架构下的映射/卸载测试X86Tests.csx86 架构下的映射/卸载测试TestBinaries/C 测试二进制源文件Executables/Target.cpp被测宿主进程映射的载体Libraries/Basic.cpp、Exception.cpp、StaticTls.cpp、TlsCallback.cpp四类测试 DLLCMakeLists.txt构建配置Build.bat一键构建脚本项目引用关系定义在 Lunar.Tests.csproj 中引用了 xunit 2.4.2、Microsoft.NET.Test.Sdk 以及主库Lunar/Lunar.csproj。快速构建四类测试 DLL 的完整步骤测试 DLL 使用 CMake 构建编译参数特意开启了安全相关特性以验证 Lunar 对这些特性的支持。构建脚本Lunar.Tests/TestBinaries/Build.bat只有 5 行mkdir bin\x86 mkdir bin\x64 cmake -A Win32 -B bin\x86 cmake -A x64 -B bin\x64 cmake --build bin\x86 --config Release cmake --build bin\x64 --config Release在 CMakeLists.txt 中四个库以SHARED方式生成测试库构建目标验证特性Basic.dlladd_library(Basic SHARED)常规 DLL 映射Exception.dlladd_library(Exception SHARED)异常处理器初始化StaticTls.dlladd_library(StaticTls SHARED)静态 TLS 初始化TlsCallback.dlladd_library(TlsCallback SHARED)TLS 回调执行所有目标都启用了/guard:cf控制流保护、/GS栈缓冲区安全检查等编译选项确保映射逻辑能正确处理这些安全特性。xunit 测试用例设计Theory InlineData 的巧妙用法x64 测试位于 X64Tests.cs核心写法如下构造阶段启动TestBinaries\bin\x64\Release\Target.exe作为宿主进程等待 10 毫秒完成初始化测试阶段用[Theory][InlineData]展开 4 个参数化用例对每个 DLL 执行MapLibrary()断言DllBaseAddress不为 0卸载阶段TestUnmap用例在映射后再调用UnmapLibrary()断言基址回到 0清理阶段实现IDisposable测试结束后Kill()宿主进程。两个关键设计值得新手学习[Collection(LibraryMapper Tests)]让同一集合内的测试顺序执行避免多个测试并发抢同一个宿主进程造成干扰[Theory]参数化一份断言逻辑覆盖 4 种 DLL新增场景只需加一行[InlineData]。x86 测试 X86Tests.cs 结构完全一致仅将二进制目录换为bin\x86\Release从而同时验证 WoW64 与 x64 两种架构。四类映射场景分别在验证什么宿主进程 Target.cpp 非常简单——阻塞等待输入保证进程在测试期间保持存活。真正的设计亮点在四个测试 DLL 的DllMain上Basic.dllTestBinaries/Libraries/Basic.cpp最基础的 DLLDllMain只返回装载/卸载成功验证映射链路本身可用⚠️Exception.dllTestBinaries/Libraries/Exception.cpp在DllMain中主动throw并捕获异常验证 Lunar 的异常处理器SEH初始化是否正确否则异常会直接崩掉宿主进程StaticTls.dllTestBinaries/Libraries/StaticTls.cpp声明static thread_local变量并在DllMain中校验其值仍为初始值0xFCFC验证静态 TLS 初始化TlsCallback.dllTestBinaries/Libraries/TlsCallback.cpp注册 TLS 回调函数在装载/卸载时修改tls_value并在DllMain中校验回调确实执行过。每个 DLL 的DllMain返回值本身就是断言条件——只要返回 false映射就会失败并抛错测试随之失败。这是把验证逻辑放进被测对象内部的巧妙做法。运行测试两步即可验证全部场景构建完测试二进制后在项目根目录执行dotnet test Lunar.slnxunit 会自动发现 x64 与 x86 两个测试类共 16 个参数化用例2 架构 × 4 场景 × 映射/卸载。全部通过说明 Lunar 在两种架构下都能正确处理常规映射、异常处理、静态 TLS 与 TLS 回调。小结Lunar 的测试工程为如何为底层 PE 映射库写测试提供了一个可借鉴的模板用独立的 C 工程构造最小化测试 DLL每个 DLL 只验证一个 PE 特性把断言写进DllMain让被测对象自己自证用 xunit 的[Theory][InlineData]实现参数化覆盖[Collection]保证串行执行通过 x86/x64 双架构测试类一次跑通 WoW64 与 x64 全部场景。理解这套测试的构造方式有助于你在使用 Lunar 时正确选择MappingFlags如DiscardHeaders、SkipInitRoutines定义见 MappingFlags.cs并判断自己场景下的 DLL 能否被安全映射。【免费下载链接】LunarA lightweight native DLL mapping library that supports mapping directly from memory项目地址: https://gitcode.com/gh_mirrors/luna/Lunar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻