初始化仓库
parent
ec323d4a43
commit
05de462cf1
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 067341936b8cb2242be3bdc83f3ca3cd
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,79 @@
|
||||||
|
using HybridCLR.Editor;
|
||||||
|
using Obfuz.Settings;
|
||||||
|
using Obfuz;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
using System.IO;
|
||||||
|
using UnityEngine;
|
||||||
|
using Obfuz.Unity;
|
||||||
|
|
||||||
|
namespace Obfuz4HybridCLR
|
||||||
|
{
|
||||||
|
public static class ObfuscateUtil
|
||||||
|
{
|
||||||
|
public static bool AreSameDirectory(string path1, string path2)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var dir1 = new DirectoryInfo(path1);
|
||||||
|
var dir2 = new DirectoryInfo(path2);
|
||||||
|
|
||||||
|
return dir1.FullName.TrimEnd('\\') == dir2.FullName.TrimEnd('\\');
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ObfuscateHotUpdateAssemblies(BuildTarget target, string outputDir)
|
||||||
|
{
|
||||||
|
string hotUpdateDllPath = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target);
|
||||||
|
|
||||||
|
AssemblySettings assemblySettings = ObfuzSettings.Instance.assemblySettings;
|
||||||
|
ObfuscationProcess.ValidateReferences(hotUpdateDllPath, new HashSet<string>(assemblySettings.GetAssembliesToObfuscate()), new HashSet<string>(assemblySettings.GetObfuscationRelativeAssemblyNames()));
|
||||||
|
var assemblySearchPaths = new List<string>
|
||||||
|
{
|
||||||
|
hotUpdateDllPath,
|
||||||
|
};
|
||||||
|
if (AreSameDirectory(hotUpdateDllPath, outputDir))
|
||||||
|
{
|
||||||
|
throw new Exception($"hotUpdateDllPath:{hotUpdateDllPath} can't be same to outputDir:{outputDir}");
|
||||||
|
}
|
||||||
|
Obfuscate(target, assemblySearchPaths, outputDir);
|
||||||
|
foreach (string hotUpdateAssemblyName in SettingsUtil.HotUpdateAssemblyNamesExcludePreserved)
|
||||||
|
{
|
||||||
|
string srcFile = $"{hotUpdateDllPath}/{hotUpdateAssemblyName}.dll";
|
||||||
|
string dstFile = $"{outputDir}/{hotUpdateAssemblyName}.dll";
|
||||||
|
// only copy non obfuscated assemblies
|
||||||
|
if (File.Exists(srcFile) && !File.Exists(dstFile))
|
||||||
|
{
|
||||||
|
File.Copy(srcFile, dstFile, true);
|
||||||
|
Debug.Log($"[CompileAndObfuscateDll] Copy nonObfuscated assembly {srcFile} to {dstFile}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Obfuscate(BuildTarget target, List<string> assemblySearchPaths, string obfuscatedAssemblyOutputPath)
|
||||||
|
{
|
||||||
|
var obfuzSettings = ObfuzSettings.Instance;
|
||||||
|
|
||||||
|
var assemblySearchDirs = assemblySearchPaths;
|
||||||
|
ObfuscatorBuilder builder = ObfuscatorBuilder.FromObfuzSettings(obfuzSettings, target, true);
|
||||||
|
builder.InsertTopPriorityAssemblySearchPaths(assemblySearchDirs);
|
||||||
|
builder.CoreSettingsFacade.obfuscatedAssemblyOutputPath = obfuscatedAssemblyOutputPath;
|
||||||
|
|
||||||
|
foreach (var assemblySearchDir in builder.CoreSettingsFacade.assemblySearchPaths)
|
||||||
|
{
|
||||||
|
if (AreSameDirectory(assemblySearchDir, obfuscatedAssemblyOutputPath))
|
||||||
|
{
|
||||||
|
throw new Exception($"assemblySearchDir:{assemblySearchDir} can't be same to ObfuscatedAssemblyOutputPath:{obfuscatedAssemblyOutputPath}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Obfuscator obfuz = builder.Build();
|
||||||
|
obfuz.Run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b7f5fe18513bcdd4c8960d908e88402e
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "Obfuz4HybridCLR.Editor",
|
||||||
|
"rootNamespace": "",
|
||||||
|
"references": [
|
||||||
|
"GUID:2373f786d14518f44b0f475db77ba4de",
|
||||||
|
"GUID:66e09fc524ec6594b8d6ca1d91aa1a41"
|
||||||
|
],
|
||||||
|
"includePlatforms": [
|
||||||
|
"Editor"
|
||||||
|
],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": false,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": [],
|
||||||
|
"noEngineReferences": false
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3743e71edcd5bd8499007797ef02cbfb
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,124 @@
|
||||||
|
using HybridCLR.Editor.Commands;
|
||||||
|
using HybridCLR.Editor;
|
||||||
|
using Obfuz.Settings;
|
||||||
|
using Obfuz;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using System.Reflection;
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using HybridCLR.Editor.Link;
|
||||||
|
using HybridCLR.Editor.Meta;
|
||||||
|
using UnityEditor.Build;
|
||||||
|
using HybridCLR.Editor.Installer;
|
||||||
|
using HybridCLR.Editor.MethodBridge;
|
||||||
|
using System.Linq;
|
||||||
|
using Analyzer = HybridCLR.Editor.MethodBridge.Analyzer;
|
||||||
|
using HybridCLR.Editor.Settings;
|
||||||
|
using Obfuz.Utils;
|
||||||
|
using FileUtil = Obfuz.Utils.FileUtil;
|
||||||
|
using IAssemblyResolver = HybridCLR.Editor.Meta.IAssemblyResolver;
|
||||||
|
using CombinedAssemblyResolver = HybridCLR.Editor.Meta.CombinedAssemblyResolver;
|
||||||
|
using MetaUtil = HybridCLR.Editor.Meta.MetaUtil;
|
||||||
|
using AssemblyCache = HybridCLR.Editor.Meta.AssemblyCache;
|
||||||
|
|
||||||
|
namespace Obfuz4HybridCLR
|
||||||
|
{
|
||||||
|
public static class PrebuildCommandExt
|
||||||
|
{
|
||||||
|
public static string GetObfuscatedHotUpdateAssemblyOutputPath(BuildTarget target)
|
||||||
|
{
|
||||||
|
return $"{ObfuzSettings.Instance.ObfuzRootDir}/{target}/ObfuscatedHotUpdateAssemblies";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[MenuItem("HybridCLR/ObfuzExtension/GenerateAll")]
|
||||||
|
public static void GenerateAll()
|
||||||
|
{
|
||||||
|
var installer = new InstallerController();
|
||||||
|
if (!installer.HasInstalledHybridCLR())
|
||||||
|
{
|
||||||
|
throw new BuildFailedException($"You have not initialized HybridCLR, please install it via menu 'HybridCLR/Installer'");
|
||||||
|
}
|
||||||
|
BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
|
||||||
|
CompileDllCommand.CompileDll(target);
|
||||||
|
Il2CppDefGeneratorCommand.GenerateIl2CppDef();
|
||||||
|
LinkGeneratorCommand.GenerateLinkXml(target);
|
||||||
|
StripAOTDllCommand.GenerateStripedAOTDlls(target);
|
||||||
|
AOTReferenceGeneratorCommand.GenerateAOTGenericReference(target);
|
||||||
|
|
||||||
|
string obfuscatedHotUpdateDllPath = GetObfuscatedHotUpdateAssemblyOutputPath(target);
|
||||||
|
ObfuscateUtil.ObfuscateHotUpdateAssemblies(target, obfuscatedHotUpdateDllPath);
|
||||||
|
GenerateMethodBridgeAndReversePInvokeWrapper(target, obfuscatedHotUpdateDllPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
[MenuItem("HybridCLR/ObfuzExtension/CompileAndObfuscateDll")]
|
||||||
|
public static void CompileAndObfuscateDll()
|
||||||
|
{
|
||||||
|
BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
|
||||||
|
CompileDllCommand.CompileDll(target);
|
||||||
|
|
||||||
|
string obfuscatedHotUpdateDllPath = GetObfuscatedHotUpdateAssemblyOutputPath(target);
|
||||||
|
ObfuscateUtil.ObfuscateHotUpdateAssemblies(target, obfuscatedHotUpdateDllPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAssemblyResolver CreateObfuscatedHotUpdateAssemblyResolver(BuildTarget target, List<string> obfuscatedHotUpdateAssemblies, string obfuscatedHotUpdateDllPath)
|
||||||
|
{
|
||||||
|
return new FixedSetAssemblyResolver(obfuscatedHotUpdateDllPath, obfuscatedHotUpdateAssemblies);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAssemblyResolver CreateObfuscatedHotUpdateAndAOTAssemblyResolver(BuildTarget target, List<string> hotUpdateAssemblies, List<string> assembliesToObfuscate, string obfuscatedHotUpdateDllPath)
|
||||||
|
{
|
||||||
|
return new CombinedAssemblyResolver(
|
||||||
|
CreateObfuscatedHotUpdateAssemblyResolver(target, hotUpdateAssemblies.Intersect(assembliesToObfuscate).ToList(), obfuscatedHotUpdateDllPath),
|
||||||
|
MetaUtil.CreateHotUpdateAssemblyResolver(target, hotUpdateAssemblies.Except(assembliesToObfuscate).ToList()),
|
||||||
|
MetaUtil.CreateAOTAssemblyResolver(target)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void GenerateMethodBridgeAndReversePInvokeWrapper(BuildTarget target, string obfuscatedHotUpdateDllPath)
|
||||||
|
{
|
||||||
|
string aotDllDir = SettingsUtil.GetAssembliesPostIl2CppStripDir(target);
|
||||||
|
List<string> aotAssemblyNames = Directory.Exists(aotDllDir) ?
|
||||||
|
Directory.GetFiles(aotDllDir, "*.dll", SearchOption.TopDirectoryOnly).Select(Path.GetFileNameWithoutExtension).ToList()
|
||||||
|
: new List<string>();
|
||||||
|
if (aotAssemblyNames.Count == 0)
|
||||||
|
{
|
||||||
|
throw new Exception($"no aot assembly found. please run `HybridCLR/Generate/All` or `HybridCLR/Generate/AotDlls` to generate aot dlls before runing `HybridCLR/Generate/MethodBridge`");
|
||||||
|
}
|
||||||
|
AssemblyReferenceDeepCollector collector = new AssemblyReferenceDeepCollector(MetaUtil.CreateAOTAssemblyResolver(target), aotAssemblyNames);
|
||||||
|
|
||||||
|
var methodBridgeAnalyzer = new Analyzer(new Analyzer.Options
|
||||||
|
{
|
||||||
|
MaxIterationCount = Math.Min(20, SettingsUtil.HybridCLRSettings.maxMethodBridgeGenericIteration),
|
||||||
|
Collector = collector,
|
||||||
|
});
|
||||||
|
|
||||||
|
methodBridgeAnalyzer.Run();
|
||||||
|
|
||||||
|
List<string> hotUpdateDlls = SettingsUtil.HotUpdateAssemblyNamesExcludePreserved;
|
||||||
|
var cache = new AssemblyCache(CreateObfuscatedHotUpdateAndAOTAssemblyResolver(target, hotUpdateDlls, ObfuzSettings.Instance.assemblySettings.GetAssembliesToObfuscate(), obfuscatedHotUpdateDllPath));
|
||||||
|
|
||||||
|
var reversePInvokeAnalyzer = new MonoPInvokeCallbackAnalyzer(cache, hotUpdateDlls);
|
||||||
|
reversePInvokeAnalyzer.Run();
|
||||||
|
|
||||||
|
var calliAnalyzer = new CalliAnalyzer(cache, hotUpdateDlls);
|
||||||
|
calliAnalyzer.Run();
|
||||||
|
var pinvokeAnalyzer = new PInvokeAnalyzer(cache, hotUpdateDlls);
|
||||||
|
pinvokeAnalyzer.Run();
|
||||||
|
var callPInvokeMethodSignatures = pinvokeAnalyzer.PInvokeMethodSignatures;
|
||||||
|
|
||||||
|
string templateFile = $"{SettingsUtil.TemplatePathInPackage}/MethodBridge.cpp.tpl";
|
||||||
|
string outputFile = $"{SettingsUtil.GeneratedCppDir}/MethodBridge.cpp";
|
||||||
|
|
||||||
|
var callNativeMethodSignatures = calliAnalyzer.CalliMethodSignatures.Concat(pinvokeAnalyzer.PInvokeMethodSignatures).ToList();
|
||||||
|
|
||||||
|
var generateMethodBridgeMethod = typeof(MethodBridgeGeneratorCommand).GetMethod("GenerateMethodBridgeCppFile", BindingFlags.NonPublic | BindingFlags.Static);
|
||||||
|
generateMethodBridgeMethod.Invoke(null, new object[] { methodBridgeAnalyzer.GenericMethods, reversePInvokeAnalyzer.ReversePInvokeMethods, callNativeMethodSignatures, templateFile, outputFile });
|
||||||
|
|
||||||
|
MethodBridgeGeneratorCommand.CleanIl2CppBuildCache();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: afc965e1afdfc8e47b8a70be7a93cf25
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,7 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3036602f815e31341b4445f0e331b58e
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"name": "com.code-philosophy.obfuz4hybridclr",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"displayName": "Obfuz4HybridCLR",
|
||||||
|
"description": "Obfuz4HybridCLR is a obfuz extension for HybridCLR",
|
||||||
|
"category": "Scripting",
|
||||||
|
"documentationUrl": "https://www.obfuz.com",
|
||||||
|
"changelogUrl": "https://github.com/focus-creative-games/obfuz/commits/main/",
|
||||||
|
"licensesUrl": "https://github.com/focus-creative-games/obfuz/blob/main/com.code-philosophy.obfuz4hybridclr/LICENSE",
|
||||||
|
"keywords": [
|
||||||
|
"obfuz",
|
||||||
|
"obfuscation",
|
||||||
|
"obfuscator",
|
||||||
|
"confuser",
|
||||||
|
"code-philosophy"
|
||||||
|
],
|
||||||
|
"author": {
|
||||||
|
"name": "Code Philosophy",
|
||||||
|
"email": "obfuz@code-philosophy.com",
|
||||||
|
"url": "https://code-philosophy.com"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9ac66e213a764b840b2533ee30123717
|
||||||
|
PackageManifestImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
Loading…
Reference in New Issue