当前位置: 首页 > news >正文

.NET 程序保护实战系列 03 · 符号混淆:名称就是第一道防线

03 · 符号混淆:名称就是第一道防线

目录

  1. 为什么名称本身就能构成防线
  2. VTable:跨继承链的名称一致性
  3. NameService:ConditionalWeakTable 驱动的重命名引擎
  4. 六种命名模式
  5. 跨模块协同:ProtectionSession.RunRename
  6. 引用追踪:INameReference 体系
  7. 可见性过滤与不可重命名标记
  8. 结语

1. 为什么名称本身就能构成防线

混淆前:

MyApp.LicenseValidator.Validate(string key) MyApp.PaymentProcessor.ProcessTransaction(decimal amount) MyApp.CryptoHelper.Encrypt(byte[] data)

混淆后:

\u200b.\u200c\u200d(int a) \u200b.\u200b\u200c(decimal a)

消除名称中的语义信息 = 攻击者无法通过名称判断"该分析哪个类"。


2. VTable:跨继承链的名称一致性

基类和子类的 override 方法必须使用同一个新名称。我们的VTableAnalyzer追踪完整的继承链:

// 构建 VTable 关系链publicstaticvoidAnalyze(IEnumerable<TypeDef>types){foreach(vartypeintypes){foreach(varmethodintype.Methods){if(!method.IsVirtual||method.IsRuntime)continue;// 追溯基类中的原始方法声明varbaseMethod=method.GetBaseMethod();if(baseMethod==null)continue;// 收集整个 override 链上的所有方法varoverrides=FindAllOverrides(baseMethod);// 所有同链方法分配同一个 VTableSlot// 确保重命名后名称一致varslot=newVTableSlot(baseMethod,overrides);_vtableSlots.Add(slot);}}}

接口方法通过MethodImpl映射与隐式接口实现自动关联。


3. NameService:ConditionalWeakTable 驱动的重命名引擎

使用ConditionalWeakTable替代传统 Dictionary,实现零侵入的元数据注解:

publicclassNameService{// ConditionalWeakTable 不阻止 GC 回收,比 Dictionary 更安全readonlyConditionalWeakTable<IDnlibDef,NameAnnotation>_annotations=new();// 6 种命名模式staticreadonlychar[]unicodeCharset={'\u200b','\u200c','\u200d','\u200e','\u200f','\u202a','\u202b','\u202c','\u202d','\u202e',...};staticreadonlychar[]letterCharset=...;// 字母表staticreadonlychar[]asciiCharset=...;// ASCIIstaticreadonlychar[]alphaNumCharset=...;// 字母+数字// 核心方法:根据哈希值和模式生成新名称stringObfuscateNameInternal(byte[]hash,RenameModemode){returnmodeswitch{RenameMode.Empty=>"",RenameMode.Unicode=>NameUtils.EncodeString(hash,unicodeCharset),RenameMode.Letters=>NameUtils.EncodeString(hash,letterCharset),RenameMode.ASCII=>NameUtils.EncodeString(hash,asciiCharset),RenameMode.Decodable=>"_"+NameUtils.EncodeString(hash,alphaNumCharset),RenameMode.Sequential=>"_"+Interlocked.Increment(ref_seqCounter),};}// AnalyzeAll 三阶段:收集 → 构建VTable → 分析引用publicvoidAnalyzeAll(){...}// RenameAll:延迟重命名 + 迭代收敛 + 死锁检测publicvoidRenameAll(){...}}

4. 六种命名模式

模式字符集示例名称适用
Empty“”空字符串极简
UnicodeU+200B-U+206F\u200b\u200c\u200d不可见最大隐蔽性
ASCIIa-zabc,xyz,aab轻型混淆
Letters拉丁字符cnffjbe(ROT13 风格)可读但无意义
Decodable字母+数字_A1B2C3D4调试友好
Sequential递增数字_1,_2,_3调试友好

通过--rename-mode <mode>选择。


5. 跨模块协同:ProtectionSession.RunRename

publicclassProtectionSession{publicIList<ProtectionContext>Contexts{get;}// 所有模块上下文publicNameService?NameService{get;}// 共享名称服务publicRandomServiceRandom{get;}// 共享随机数publicvoidRunRename(){if(NameService==null)return;// 阶段1:收集所有模块的可重命名成员// 阶段2:构建跨模块 VTable 关系图NameService.AnalyzeAll();// 阶段3:统一分配新名称 + 更新所有跨模块引用NameService.RenameAll();}}

关键:EXE 中引用的 DLL 类型,在 DLL 重命名后同步更新引用。


6. 引用追踪:INameReference 体系

// 每种引用类型实现 INameReferencepublicinterfaceINameReference{stringName{get;set;}boolShouldUpdate{get;}voidUpdateName(stringnewName);}// TypeRef 引用:A.dll 的 TypeRef "MyClass" 在 B.exe 中classTypeRefReference:INameReference{...}// MemberRef 引用:如调用 A.dll 的方法classMemberRefReference:INameReference{...}// Override 指令:.override IL 指令classOverrideDirectiveReference:INameReference{...}// 兄弟方法:同 class 中隐藏/重写的方法classMemberSiblingReference:INameReference{...}

7. 可见性过滤与不可重命名标记

// 默认不重命名 public 成员if(member.IsPublic&&!options.RenamePublic)continue;// 标记为不可重命名(运行时注入类型)MarkAsNotRenameable(injectedType);MarkAsNotRenameable(injectedMethod);// 在 ObfuscationStep.IsEnabled 中检查boolCanRename(IDnlibDefdef)=>!HasAttribute<NotRenameableAttribute>(def);

8. 结语

符号混淆看似简单,实际上要处理 VTable 继承链、接口映射、跨模块引用、ConditionalWeakTable 注解等大量细节。好的混淆器不是"全改就完事",而是精准地只改该改的部分

下一篇将深入控制流混淆——如何打乱方法的执行逻辑。


本文由 TWSoft.AssemblyProtector 驱动。完整源码和工具请访问项目主页。

http://www.cnnetsun.cn/news/3224082.html

相关文章:

  • 杰理之做特殊按键只响应单击事件处理【篇】
  • 存储突围+材料破卡!安徽集成电路构建全链竞争优势|半导体展会·2027合肥
  • Windows 11 LTSC企业版安装微软商店:3分钟完整终极指南
  • 彻底告别DLL缺失噩梦:VisualCppRedist AIO一站式解决方案终极指南
  • SpringBoot项目实践:如何优雅地处理全局异常
  • 工信局在推动产业链技术升级时,如何识别关键断点与卡脖子环节?
  • HarmonyOS7 ArkUI 实战:Flex Row 商品信息卡片不被长文案挤变形
  • 5分钟快速激活Windows和Office:KMS_VL_ALL_AIO智能激活指南
  • Micronaut Data:把数据库查询挪到编译期去做
  • 开源项目 Riddle 让 Remarkable 电子墨水屏平板秒变“邪恶日记”,能与你对话!
  • GCC MingGW-w64 8.1安装调试
  • 幻兽帕鲁存档编辑器:5分钟学会安全修改游戏数据的终极方案
  • btp.exe打开时闪退无法登录问题及解决方法。
  • Scikit-learn Pipeline:构建可复用的 ML 流水线
  • 直播带货,知识与销售并行
  • 457. Java 反射 - 深度访问
  • 智融交通·绿动未来 | 智能新能源车辆数字主线技术与产业论坛成功举办
  • 高压隔离技术:ISOM8710与PIC32MZ的工业应用解析
  • IQR与MAD异常值检测实战:3种数据分布场景下的Python代码与效果对比
  • 萨科微slkor2026年7月6日“每日芯闻”。国际芯闻:
  • KMS_VL_ALL_AIO:Windows系统一键激活的终极解决方案
  • 户外LED广告牌尺寸规格大全
  • NAS / 服务器断电数据丢失?UPS 配套 USB关机保护板,市电断电池低自动提示服务器/电脑关机
  • easyMarkets平台评测:工具体验与平台稳定性有哪些观察重点
  • VLM增强的语义蒙特卡洛定位:让机器人真正看懂环境
  • 人生解释器的最小单位是什么?
  • 直击零线过载隐患 中线安防保护器综合治理方案
  • 细胞系vs原代:原代牙周韧带成纤维细胞,为什么不能用细胞系代替?
  • 2026年无锡干细胞机构如何考量?解析行业布局与合规焦点
  • 数字人制作公司哪家好?2026年聚焦全栈能力与行业落地的服务商推荐