Skip to main content

Obfuz+HybridCLR

本工程演示如何将Obfuz与HybridCLR一起使用,完整示例项目参见WorkWithHybridCLR

详细文档见与HybridCLR协同工作

安装

安装以下插件:

  • com.code-philosophy.hybridclr https://github.com/focus-creative-games/hybridclr_unity.git
  • com.code-philosophy.obfuz https://github.com/focus-creative-games/obfuz.git?path=com.code-philosophy.obfuz
  • com.code-philosophy.obfuz4hybridclr https://github.com/focus-creative-games/obfuz.git?path=com.code-philosophy.obfuz4hybridclr

obufz4hybridclr是一个Obfuz扩展包,用于支持HybridCLR热更新工作流。

warning

Obfuz和HybridCLR插件都包含了dnlib插件。对于Unity 2021及更早版本,当两个package中包含同名插件时会产生错误。 解决办法为将这两个插件之一(不必两个都改为本地安装)改为本地安装,即将Obfuz或HybridCLR下载到本地,移除其中包含的dnlib.dll,再放到Packages目录下。

创建代码

  • 创建HotUpdate程序集,并在程序集内创建一个类型Entry
  • Assets目录下创建Bootstrap.cs

详细代码内容见示例项目。

配置

  • 将HotUpdate加入HybridCLRSettings的热更新程序集列表
  • 将HotUpdate和Assembly-CSharp加入ObfuzSettings.AssembliesToObfuscate列表

添加混淆热更新代码的构建代码


using HybridCLR.Editor;
using Obfuz4HybridCLR;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

public static class BuildCommand
{
[MenuItem("Build/CompileAndObfuscateAndCopyToStreamingAssets")]
public static void CompileAndObfuscateAndCopyToStreamingAssets()
{
BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
ObfuscateUtil.CompileAndObfuscateHotUpdateAssemblies(target);

Directory.CreateDirectory(Application.streamingAssetsPath);

string hotUpdateDllPath = $"{SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target)}";
foreach (string assName in SettingsUtil.HotUpdateAssemblyNamesIncludePreserved)
{
string srcFile = $"{hotUpdateDllPath}/{assName}.dll";
string dstFile = $"{Application.streamingAssetsPath}/{assName}.dll.bytes";
File.Copy(srcFile, dstFile, true);
Debug.Log($"[CompileAndObfuscate] Copy {srcFile} to {dstFile}");
}
}
}

生成加密虚拟机及密钥

  • 运行菜单Obfuz/GenerateEncryptionVM生成加密虚拟机代码,默认生成的代码文件为Assets/Obfuz/GeneratedEncryptionVirtualMachine.cs
  • 运行菜单Obfuz/GenerateSecretKeyFile生成两个密钥文件。默认输出文件为Assets/Resources/Obfuz/defaultStaticSecretKey.bytesAssets/Resources/Obfuz/defaultDynamicSecretKey.bytes

生成HybridCLR相关的代码

HybridCLR默认的HybridCLR/Generate/All命令基于未混淆的程序集生成link.xml。如果有一部分AOT程序集被混淆了,基于未混淆代码生成link.xml中保留的类型和函数都是混淆前的名字, 这导致link.xml无法真正保留那些混淆后的AOT类型和函数。构建后运行热更新代码有可能出现类型和函数被裁剪的情况。

解决办法是使用Obfuz4HybridCLR专门提供的HybridCLR/ObfuzExtension/GenerateAll命令。

  • 运行HybridCLR/ObfuzExtension/GenerateAll

生成混淆后的热更新程序集并且放到StreamingAssets目录下

  • 运行Build/CompileAndObfuscateAndCopyToStreamingAssets

打包&运行

Build Settings中运行Build And Run构建并且运行,查看player.log验证其确实正确运行。

查看混淆后的HotUpdate程序集

打开上一步打包&运行的输出目录,使用ILSpy打开ObfuzDemo_Data\StreamingAssets\HotUpdate.dll.bytes 查看混淆后的程序集。

Entry类被混淆后的代码如下:

using Obfuz;
using UnityEngine;

public class Entry : MonoBehaviour
{
private void Start()
{
$c.$a((object)$B.$a, EncryptionService<DefaultStaticEncryptionScope>.Decrypt(1718597184, 154, 2114032877));
}

private void Update()
{
}
}