diff --git a/Obfuz/Packages/com.code-philosophy.obfuz/Editor/Obfuscator.cs b/Obfuz/Packages/com.code-philosophy.obfuz/Editor/Obfuscator.cs index e79f62c..6b7bcb8 100644 --- a/Obfuz/Packages/com.code-philosophy.obfuz/Editor/Obfuscator.cs +++ b/Obfuz/Packages/com.code-philosophy.obfuz/Editor/Obfuscator.cs @@ -77,10 +77,12 @@ namespace Obfuz public void Run() { + Debug.Log($"Obfuscator Run. begin"); FileUtil.RecreateDir(_obfuscatedAssemblyOutputPath); RunPipeline(_pipeline1); _assemblySearchPaths.Insert(0, _obfuscatedAssemblyOutputPath); RunPipeline(_pipeline2); + Debug.Log($"Obfuscator Run. end"); } private void RunPipeline(Pipeline pipeline) diff --git a/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor.meta b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor.meta new file mode 100644 index 0000000..ec94239 --- /dev/null +++ b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 067341936b8cb2242be3bdc83f3ca3cd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/ObfuscateUtil.cs b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/ObfuscateUtil.cs new file mode 100644 index 0000000..89853bb --- /dev/null +++ b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/ObfuscateUtil.cs @@ -0,0 +1,82 @@ +using HybridCLR.Editor; +using Obfuz.Settings; +using Obfuz; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEditor; +using HybridCLR.Editor.Commands; +using HybridCLR.Editor.Installer; +using System.IO; +using HybridCLR.Editor.ABI; +using UnityEngine; + +namespace ObfuzExtension4HybridCLR +{ + 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 CompileAndObfuscateHotUpdateAssemblies(BuildTarget target) + { + string hotUpdateDllPath = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target); + BashUtil.RemoveDir(hotUpdateDllPath); + CompileDllCommand.CompileDll(target); + var assemblySearchPaths = new List + { + SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target), + }; + Obfuscate(target, assemblySearchPaths, hotUpdateDllPath); + } + + public static void Obfuscate(BuildTarget target, List assemblySearchPaths, string outputPath) + { + var obfuzSettings = ObfuzSettings.Instance; + + var assemblySearchDirs = assemblySearchPaths; + ObfuscatorBuilder builder = ObfuscatorBuilder.FromObfuzSettings(obfuzSettings, target, true); + builder.InsertTopPriorityAssemblySearchPaths(assemblySearchDirs); + + string obfuscatedAssemblyOutputPath = obfuzSettings.GetObfuscatedAssemblyOutputPath(target); + if (AreSameDirectory(outputPath, obfuscatedAssemblyOutputPath)) + { + throw new Exception($"outputPath:{outputPath} can't be same to ObfuscatedAssemblyOutputPath:{obfuscatedAssemblyOutputPath}"); + } + foreach (var assemblySearchDir in builder.AssemblySearchPaths) + { + if (AreSameDirectory(assemblySearchDir, obfuscatedAssemblyOutputPath)) + { + throw new Exception($"assemblySearchDir:{assemblySearchDir} can't be same to ObfuscatedAssemblyOutputPath:{obfuscatedAssemblyOutputPath}"); + } + } + + Obfuscator obfuz = builder.Build(); + obfuz.Run(); + + Directory.CreateDirectory(outputPath); + foreach (string srcFile in Directory.GetFiles(obfuscatedAssemblyOutputPath, "*.dll")) + { + string fileName = Path.GetFileName(srcFile); + string destFile = $"{outputPath}/{fileName}"; + File.Copy(srcFile, destFile, true); + Debug.Log($"Copy {srcFile} to {destFile}"); + } + } + } +} diff --git a/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/ObfuscateUtil.cs.meta b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/ObfuscateUtil.cs.meta new file mode 100644 index 0000000..3702fdd --- /dev/null +++ b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/ObfuscateUtil.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b7f5fe18513bcdd4c8960d908e88402e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/ObfuzExtension4HybridCLR.asmdef b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/ObfuzExtension4HybridCLR.asmdef new file mode 100644 index 0000000..1a1c9e5 --- /dev/null +++ b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/ObfuzExtension4HybridCLR.asmdef @@ -0,0 +1,19 @@ +{ + "name": "ObfuzExtension4HybridCLR", + "rootNamespace": "", + "references": [ + "GUID:2373f786d14518f44b0f475db77ba4de", + "GUID:66e09fc524ec6594b8d6ca1d91aa1a41" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/ObfuzExtension4HybridCLR.asmdef.meta b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/ObfuzExtension4HybridCLR.asmdef.meta new file mode 100644 index 0000000..cc375a6 --- /dev/null +++ b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/ObfuzExtension4HybridCLR.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3743e71edcd5bd8499007797ef02cbfb +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/PrebuildCommandExt.cs b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/PrebuildCommandExt.cs new file mode 100644 index 0000000..6f90d21 --- /dev/null +++ b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/PrebuildCommandExt.cs @@ -0,0 +1,64 @@ +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; + +namespace ObfuzExtension4HybridCLR +{ + + public static class PrebuildCommandExt + { + [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; + ObfuscateUtil.CompileAndObfuscateHotUpdateAssemblies(target); + //CompileDllCommand.CompileDll(target, EditorUserBuildSettings.development); + + //// obfuscate hot update assemblies + //string hotUpdateAssemblyOutputPath = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target); + //string obfuscatedAssemblyOutputPath = ObfuzSettings.Instance.GetObfuscatedAssemblyOutputPath(target); + //var assemblySearchPaths = new List + //{ + // hotUpdateAssemblyOutputPath, + //}; + //ObfuscateUtil.Obfuscate(target, assemblySearchPaths, obfuscatedAssemblyOutputPath); + //// override assembly in hot update path with obfuscated assembly + //foreach (string hotUpdateAssName in SettingsUtil.HotUpdateAssemblyNamesIncludePreserved) + //{ + // string srcFile = $"{obfuscatedAssemblyOutputPath}/{hotUpdateAssName}.dll"; + // string dstFile = $"{hotUpdateAssemblyOutputPath}/{hotUpdateAssName}.dll"; + // // not all assemblies are obfuscated + // if (File.Exists(srcFile)) + // { + // File.Copy(srcFile, dstFile, true); + // File.SetLastWriteTimeUtc(dstFile, new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)); + // File.SetCreationTimeUtc(dstFile, new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)); + // Debug.Log($"[ObfuzExtension] Copy {srcFile} to {dstFile}"); + // } + //} + + Il2CppDefGeneratorCommand.GenerateIl2CppDef(); + LinkGeneratorCommand.GenerateLinkXml(target); + StripAOTDllCommand.GenerateStripedAOTDlls(target); + MethodBridgeGeneratorCommand.GenerateMethodBridgeAndReversePInvokeWrapper(target); + AOTReferenceGeneratorCommand.GenerateAOTGenericReference(target); + } + } +} diff --git a/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/PrebuildCommandExt.cs.meta b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/PrebuildCommandExt.cs.meta new file mode 100644 index 0000000..2bcd1c7 --- /dev/null +++ b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/Editor/PrebuildCommandExt.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: afc965e1afdfc8e47b8a70be7a93cf25 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/LICENSE b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/LICENSE new file mode 100644 index 0000000..093e599 --- /dev/null +++ b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Code Philosophy(代码哲学) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/LICENSE.meta b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/LICENSE.meta new file mode 100644 index 0000000..dd09461 --- /dev/null +++ b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/LICENSE.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3036602f815e31341b4445f0e331b58e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/package.json b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/package.json new file mode 100644 index 0000000..76fed77 --- /dev/null +++ b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/package.json @@ -0,0 +1,21 @@ +{ + "name": "com.code-philosophy.obfuz4hybridclr", + "version": "1.0.0-alpha", + "displayName": "Obfuz4HybridCLR", + "description": "Obfuz Extension for HybridCLR", + "category": "Editor", + "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/LICENSE", + "keywords": [ + "obfuscation", + "obfuscator", + "confuser", + "code-philosophy" + ], + "author": { + "name": "Code Philosophy", + "email": "obfuz@code-philosophy.com", + "url": "https://code-philosophy.com" + } +} \ No newline at end of file diff --git a/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/package.json.meta b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/package.json.meta new file mode 100644 index 0000000..5577b3b --- /dev/null +++ b/Obfuz/Packages/com.code-philosophy.obfuz4hybridclr/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9ac66e213a764b840b2533ee30123717 +PackageManifestImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: