// IL指令分析器核心逻辑
public class ILAnalyzer
{
public void AnalyzeMethod(MethodBody methodBody)
{
// 提取控制流图
var controlFlowGraph = BuildControlFlowGraph(methodBody);
// 识别敏感结构
var sensitiveStructures = FindSensitiveStructures(controlFlowGraph);
// 构建混淆策略
var obfuscationStrategy = GenerateStrategy(sensitiveStructures);
// 执行代码重构
ApplyTransformations(methodBody, obfuscationStrategy);
}
private ControlFlowGraph BuildControlFlowGraph(MethodBody body)
{
// 创建基本块
var basicBlocks = new List<BasicBlock>();
int currentOffset = 0;
while (currentOffset < body.GetMaximumStackSize())
{
var startInstruction = body.Instructions[currentOffset];
var endInstruction = FindEndOfBlock(startInstruction);
basicBlocks.Add(new BasicBlock
{
Start = currentOffset,
End = endInstruction.Offset,
Instructions = body.Instructions.Skip(currentOffset)
.Take(endInstruction.Offset - currentOffset)
.ToList()
});
currentOffset = endInstruction.Offset + 1;
}
return new ControlFlowGraph { Blocks = basicBlocks };
}
}
核心特性:
<ObfuscationConfig>
<General>
<Input>MyApp.dllInput>
<Output>ObfuscatedApp.dllOutput>
<StrongNameKey>mykey.snkStrongNameKey>
General>
<Rename>
<Mode>AllMode>
<PrefixType>$$TPrefixType>
<PrefixMember>$$MPrefixMember>
<Exclude>
<Namespace>SystemNamespace>
<Namespace>MicrosoftNamespace>
<Class>MyApp.Core.LicenseValidatorClass>
Exclude>
Rename>
<StringEncryption>
<Enabled>trueEnabled>
<Algorithm>AESAlgorithm>
<KeySize>256KeySize>
<EncryptionMode>CBCEncryptionMode>
<PaddingMode>PKCS7PaddingMode>
StringEncryption>
<ControlFlow>
<Enabled>trueEnabled>
<ComplexityLevel>HighComplexityLevel>
<InsertDeadCode>trueInsertDeadCode>
<MaxDeadCodeBlocks>10MaxDeadCodeBlocks>
ControlFlow>
<Resources>
<Enabled>trueEnabled>
<EncryptionAlgorithm>RC4EncryptionAlgorithm>
<ResourceFilter>
<Include>
<Pattern>*.resourcesPattern>
<Pattern>*.configPattern>
Include>
<Exclude>
<Pattern>*.licensesPattern>
Exclude>
ResourceFilter>
Resources>
<Advanced>
<MergeAssemblies>
<Include>Newtonsoft.Json.dllInclude>
<Include>EntityFramework.dllInclude>
MergeAssemblies>
<CorFlags>9CorFlags>
<Subsystem>3Subsystem>
Advanced>
ObfuscationConfig>
配置说明:
// AES加密器实现
public class AesStringEncryptor : IStringEncryptor
{
private readonly byte[] _key;
private readonly byte[] _iv;
public AesStringEncryptor(string key, string iv)
{
_key = Convert.FromBase64String(key);
_iv = Convert.FromBase64String(iv);
}
public string Encrypt(string plainText)
{
using (var aes = Aes.Create())
{
aes.Key = _key;
aes.IV = _iv;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
var encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
{
using (var sw = new StreamWriter(cs))
{
sw.Write(plainText);
}
return Convert.ToBase64String(ms.ToArray());
}
}
}
}
public string Decrypt(string cipherText)
{
var data = Convert.FromBase64String(cipherText);
using (var aes = Aes.Create())
{
aes.Key = _key;
aes.IV = _iv;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
var decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
using (var ms = new MemoryStream(data))
{
using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
{
using (var sr = new StreamReader(cs))
{
return sr.ReadToEnd();
}
}
}
}
}
}
加密策略:
// 控制流混淆器
public class ControlFlowObfuscator
{
public void Obfuscate(ControlFlowGraph graph, int complexityLevel)
{
// 插入跳转指令
InsertJumpInstructions(graph, complexityLevel);
// 添加无效分支
AddDummyBranches(graph, complexityLevel);
// 打乱基本块顺序
ShuffleBasicBlocks(graph);
// 添加死代码块
AddDeadCodeBlocks(graph, complexityLevel);
}
private void InsertJumpInstructions(ControlFlowGraph graph, int level)
{
foreach (var block in graph.Blocks)
{
if (level > 3 && new Random().Next(10) < 7)
{
// 插入无意义跳转
block.Instructions.Insert(
new Random().Next(block.Instructions.Count),
new ILInstruction(OpCodes.Br_S, block.End)
);
}
}
}
private void AddDummyBranches(ControlFlowGraph graph, int level)
{
if (level >= 5)
{
foreach (var block in graph.Blocks)
{
var dummyBlock = CreateDummyBlock();
block.Successors.Add(dummyBlock);
dummyBlock.Predecessors.Add(block);
}
}
}
}
混淆效果:
# Azure Pipeline脚本示例
trigger:
- main
pool:
vmImage: 'windows-latest'
variables:
buildConfiguration: 'Release'
obfuscationKey: 'your-base64-encoded-key'
obfuscationIV: 'your-base64-encoded-iv'
steps:
- task: UseDotNet@2
inputs:
version: '6.x'
- task: NuGetCommand@2
inputs:
restoreSolution: '**/*.sln'
- task: VSBuild@1
inputs:
solution: '**/*.sln'
msbuildArgs: '/p:Configuration=$(buildConfiguration)'
platform: 'Any CPU'
configuration: '$(buildConfiguration)'
- script: |
# 执行JIEJIE.NET混淆
JIEJIE.NET.exe input=bin/Release/MyApp.dll output=bin/Obfuscated/MyApp.dll \
switch=+controlflow,+strings,+rename \
snk=snk/MyKey.snk \
mapxml=logs/obfuscation_map.xml \
debugmode=true
displayName: 'Obfuscate with JIEJIE.NET'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: 'bin/Obfuscated'
ArtifactName: 'drop'
publishLocation: 'Container'
部署优势:
// 性能监控器
public class ObfuscationPerformanceMonitor
{
private readonly PerformanceCounter _cpuCounter;
private readonly PerformanceCounter _memoryCounter;
public ObfuscationPerformanceMonitor()
{
_cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
_memoryCounter = new PerformanceCounter("Memory", "Available MBytes");
}
public void MonitorObfuscationProcess(Action obfuscationAction)
{
var startTime = DateTime.Now;
var startCpu = _cpuCounter.NextValue();
var startMemory = _memoryCounter.NextValue();
obfuscationAction();
var duration = DateTime.Now - startTime;
var cpuUsage = _cpuCounter.NextValue() - startCpu;
var memoryUsage = startMemory - _memoryCounter.NextValue();
LogPerformanceMetrics(duration, cpuUsage, memoryUsage);
}
private void LogPerformanceMetrics(TimeSpan duration, double cpuUsage, double memoryUsage)
{
Console.WriteLine($@"
Obfuscation Performance Report:
-----------------------------
Duration: {duration.TotalSeconds:F2} seconds
CPU Usage: {cpuUsage:F2}%
Memory Usage: {memoryUsage:F2} MB
");
}
}
优化建议:
// 防反混淆检测模块
public class AntiDeobfuscationGuard
{
private static readonly string[] SignaturePatterns = {
"JIEJIE.NET",
"ObfuscatedByJIEJIE",
"DecryptionKey"
};
public void DetectAndReact()
{
var assembly = Assembly.GetExecutingAssembly();
foreach (var type in assembly.GetTypes())
{
foreach (var method in type.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance))
{
var il = method.GetMethodBody();
if (il == null) continue;
var instructions = il.GetILAsByteArray();
if (CheckForSignatures(instructions))
{
TriggerProtection();
return;
}
}
}
}
private bool CheckForSignatures(byte[] data)
{
foreach (var pattern in SignaturePatterns)
{
if (Encoding.UTF8.GetString(data).Contains(pattern))
return true;
}
return false;
}
private void TriggerProtection()
{
// 自毁机制
File.Delete(Assembly.GetExecutingAssembly().Location);
// 异常抛出
throw new CryptographicException("Anti-deobfuscation protection triggered.");
}
}
防护措施:
// 医疗图像处理模块
[Obfuscation(Exclude = false, ApplyToMembers = true)]
public class ImageProcessor
{
private readonly AesStringEncryptor _keyEncryptor;
public ImageProcessor()
{
_keyEncryptor = new AesStringEncryptor(
"U2FsdGVkX1+/3KQmYw==",
"QVdTSW5mbyUqJCo="
);
}
[Obfuscation(Feature = "rename", Exclude = false)]
public byte[] ProcessImage(byte[] imageData)
{
// 解密密钥
var decryptedKey = _keyEncryptor.Decrypt("U2FsdGVkX1+");
// 执行图像处理算法
var result = ApplyAlgorithm(imageData, decryptedKey);
return result;
}
[Obfuscation(Feature = "controlflow", Exclude = false)]
private byte[] ApplyAlgorithm(byte[] data, string key)
{
// 核心算法逻辑(已混淆)
// ...
return data;
}
}
保护重点:
# 错误示例
JIEJIE.NET.exe input=MyApp.dll output=ObfuscatedApp.dll snk=mykey.snk
Error: Strong name validation failed.
# 解决方案
# 1. 生成强名称密钥
sn -k mykey.snk
# 2. 签名原始程序集
signTool sign /k mykey.snk MyApp.dll
# 3. 执行混淆
JIEJIE.NET.exe input=MyApp.dll output=ObfuscatedApp.dll snk=mykey.snk
# 4. 验证签名
sn -v ObfuscatedApp.dll
注意事项:
在2025年的软件战争中,代码混淆已经从防御手段升级为战略武器。通过JIEJIE.NET的1500+行核心代码实践,我们展示了:
记住:真正的代码保护不是一次性的操作,而是持续演进的体系。当你的代码像瑞士银行保险箱一样安全时,就是企业核心竞争力的最佳证明。现在,是时候用这些知识武装你的.NET应用了!