默认情况下Assembly.Load需要传入标准的dll文件,意味着恶意破解者有办法获得完整的原始dll文件,或者加载恶意的第三方dll,这给开发者带来巨大的安全风险。 即使对dll文件进行加密,恶意破解者只要hook了Assembly.Load入口位置,仍然可以dump出完整的原始dll文件。
obfuz通过支持多态dll文件,有效对抗这种dump或者篡改dll的行为。
(1)勾上 Enable,启用多态DLL机制。
(2)设置生成多态DLL使用的随机化密钥 “Code Generation Secret Key”。
(3)勾上 “Disable Load Standard”,禁止加载标准结构的dll。
using HybridCLR.Editor;
using HybridCLR.Editor.AOT;
using HybridCLR.Editor.Commands;
using NUnit.Framework;
using Obfuz.Settings;
using Obfuz4HybridCLR;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
public class HybridCLREditor
{
// 进一步剔除AOT dll中非泛型函数元数据,输出到StrippedAOTAssembly2目录下
[MenuItem("HybridCLR/Strip AOT Assembly")]
public static void StripAOTAssembly()
{
BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
string srcDir = SettingsUtil.GetAssembliesPostIl2CppStripDir(target);
string dstDir = $"{SettingsUtil.HybridCLRDataDir}/StrippedAOTAssembly2/{target}";
foreach (var src in Directory.GetFiles(srcDir, "*.dll"))
{
string dllName = Path.GetFileName(src);
string dstFile = $"{dstDir}/{dllName}";
AOTAssemblyMetadataStripper.Strip(src, dstFile);
}
}
[MenuItem("HybridCLR/ObfuzExtension/CompileAndObfuscateAndCopyToStreamingAssets")]
public static void CompileAndObfuscateAndCopyToStreamingAssets()
{
BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
CompileDllCommand.CompileDll(target);
string obfuscatedHotUpdateDllPath = PrebuildCommandExt.GetObfuscatedHotUpdateAssemblyOutputPath(target);
ObfuscateUtil.ObfuscateHotUpdateAssemblies(target, obfuscatedHotUpdateDllPath);
Directory.CreateDirectory(Application.streamingAssetsPath);
string hotUpdateDllPath = $"{SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target)}";
List<string> obfuscationRelativeAssemblyNames = ObfuzSettings.Instance.assemblySettings.GetObfuscationRelativeAssemblyNames();
foreach (string assName in SettingsUtil.HotUpdateAssemblyNamesIncludePreserved)
{
string srcDir = obfuscationRelativeAssemblyNames.Contains(assName) ? obfuscatedHotUpdateDllPath : hotUpdateDllPath;
string srcFile = $"{srcDir}/{assName}.dll";
string dstFile = $"{Application.streamingAssetsPath}/{assName}.dll.bytes";
if (File.Exists(srcFile))
{
File.Copy(srcFile, dstFile, true);
Debug.Log($"[CompileAndObfuscate] Copy {srcFile} to {dstFile}");
}
}
}
//生成 混淆+多态 DLL
[MenuItem("HybridCLR/ObfuzExtension/CompileAndObfuscatePolymorphicDll")]
public static void CompileAndObfuscatePolymorphicDll()
{
BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
CompileDllCommand.CompileDll(target);
string obfuscatedHotUpdateDllPath = PrebuildCommandExt.GetObfuscatedHotUpdateAssemblyOutputPath(target);
//生成混淆DLL
ObfuscateUtil.ObfuscateHotUpdateAssemblies(target, obfuscatedHotUpdateDllPath);
Directory.CreateDirectory(Application.streamingAssetsPath);
string hotUpdateDllPath = $"{SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target)}";
List<string> obfuscationRelativeAssemblyNames = ObfuzSettings.Instance.assemblySettings.GetObfuscationRelativeAssemblyNames();
string srcDir = string.Empty;
string dstDir = string.Empty;
string srcFile = string.Empty;
string dstFile = string.Empty;
foreach (string assName in SettingsUtil.HotUpdateAssemblyNamesIncludePreserved)
{
srcDir = obfuscationRelativeAssemblyNames.Contains(assName) ? obfuscatedHotUpdateDllPath : hotUpdateDllPath;
srcFile = $"{srcDir}/{assName}.dll";
dstFile = $"{Application.streamingAssetsPath}/{assName}.dll.bytes";
if (File.Exists(srcFile))
{
//File.Copy(srcFile, dstFile, true);
//生成多态DLL
ObfuscateUtil.GeneratePolymorphicDll(srcFile, dstFile);
Debug.Log($"[ObfuscateAndPolymorphic] Copy {srcFile} to {dstFile}");
}
}
//需要生成多态DLL的补充元数据程序集
List<string> metadataAssemblies = new List<string> { "mscorlib" };
foreach (string assName in metadataAssemblies)
{
srcDir = SettingsUtil.GetAssembliesPostIl2CppStripDir(target);
dstDir = $"{SettingsUtil.HybridCLRDataDir}/StrippedAOTAssembly2/{target}";
srcFile = $"{srcDir}/{assName}.dll";
dstFile = $"{Application.streamingAssetsPath}/{assName}.dll.bytes";
if (!File.Exists(srcFile))
continue;
//生成多态DLL
ObfuscateUtil.GeneratePolymorphicDll(srcFile, dstFile);
Debug.Log($"[ObfuscateAndPolymorphic] Copy {srcFile} to {dstFile}");
}
}
}
依次执行菜单 【HybridCLR】->ObfuzExtension->GenerateAll 和 【HybridCLR】->ObfuzExtension->CompileAndObfuscatePolymorphicDll 命令。在工程的 StreamingAssets 目录下可以看到经混淆加多态后的dll。
HotUpdate.dll是逻辑程序集,mscorlib.dll是补充元数据程序集。
从 ILSpy 的反编译截图可看出,生成多态后的DLL已经无法被反编译。