using System; using System.Collections.Generic; using System.IO; using System.Text; using Framework; using Gameplay.UI.Common; using Gameplay.Unit.Data; using PhxhSDK.AOT; using PhxhSDK.AOT.Encrypt; using PhxhSDK.AOT.PreConfig; using UnityEditor; using UnityEngine; using UnityFS; using Object = UnityEngine.Object; public class TestCode: Editor { // [MenuItem("GameObject/LTTest/检查材质路径", false, 0)] public static void Test6() { Object selectObj = Selection.activeObject; if (null == selectObj) { DebugUtil.Log("尚未选择任何对象"); return; } var selectGo = selectObj as GameObject; if (selectGo == null) { DebugUtil.Log("选择的对象不是GameObject类型"); return; } var render = selectGo.GetComponent(); var materials = render.sharedMaterials; if (materials == null || materials.Length == 0) { DebugUtil.LogError("渲染器没有材质:" + selectGo.name); return; } foreach (var mat in materials) { var materialPath = AssetDatabase.GetAssetPath(mat); DebugUtil.LogError("材质路径:" + materialPath); } } [MenuItem("Test/测试float转int")] public static void Test7() { var checkStr = "50000410"; var floatVal = float.Parse(checkStr); DebugUtil.LogError("floatVal:" + floatVal); var intVal = (int)floatVal; DebugUtil.LogError("intVal from float:" + intVal); var doubleVal = double.Parse(checkStr); DebugUtil.LogError("doubleVal:" + doubleVal); var intVal2 = (int)doubleVal; DebugUtil.LogError("intVal from double:" + intVal2); } // [MenuItem("Test/测试")] public static void Test5() { var checkPath = "Art/Grass01/FlowerGroup_2 (8)"; var findObj = GameObjectEx.FindEx(checkPath); DebugUtil.LogError("查找对象:" + checkPath + " 是否存在:" + (findObj != null)); } // [MenuItem("Test/测试")] public static void Test4() { var dataSkill = EditorTableManager.instance.tables.SkillConfig.DataList[0]; var cloneSkill = dataSkill.Clone(); cloneSkill.ReferIds.Add(100); DebugUtil.LogError("refer equal:" + (dataSkill == cloneSkill)); DebugUtil.LogError("技能ID:" + dataSkill.ID + " cloneSkillID:" + cloneSkill.ID); DebugUtil.LogError("referIds:" + dataSkill.ReferIds.Count + " cloneReferIds:" + cloneSkill.ReferIds.Count); } // [MenuItem("Test/测试")] public static void Test3() { var testList = new List(); for (int i = 0; i < 100; i++) { testList.Add(i); } var jsonStr = LitJson.JsonMapper.ToJson(testList); Debug.LogError(jsonStr); } // [MenuItem("Test/测试加密2")] public static void Test2() { var path = "C:\\Users\\82158\\Desktop\\加密测试\\server.Dev.0.1.0.xml"; var loadBytes = File.ReadAllBytes(path); var loadStr = Encoding.UTF8.GetString(loadBytes); Debug.LogError("原始数据(字符串):" + loadStr); // 输出bytes内容 var sb = new StringBuilder(); for (int i = 0; i < loadBytes.Length; i++) { sb.Append(loadBytes[i].ToString("X") + ","); } Debug.LogError("原始数据(字节):" + sb.ToString()); var encodeBytes = PreConfig.EncodeBytes(loadBytes); // 写入新文件 var savePath = "C:\\Users\\82158\\Desktop\\加密测试\\server.Dev.0.1.0_encrypt.xml"; File.WriteAllBytes(savePath, encodeBytes); Debug.LogError("加密后数据长度:" + encodeBytes.Length); // 输出加密后bytes内容 sb.Clear(); for (int i = 0; i < encodeBytes.Length; i++) { sb.Append(encodeBytes[i].ToString("X") + ","); } Debug.LogError("加密后数据(字节):" + sb.ToString()); var forceStr = Encoding.UTF8.GetString(encodeBytes); Debug.LogError("加密后数据(字符串):" + forceStr); var decodeStr = PreConfig.DecodeBytes(encodeBytes); Debug.LogError("解密后数据:" + decodeStr); // 对比 var isSame = loadStr.Equals(decodeStr); Debug.LogError("对比结果:" + isSame); } [MenuItem("Test/测试LocalInfoEncrypt加密解密")] public static void TestLocalInfoEncrypt() { Debug.Log("========== 开始测试 LocalInfoEncrypt 加密解密功能 =========="); // 测试1: 基础字节数组加密解密 Debug.Log("\n【测试1】基础字节数组加密解密:"); var testData1 = "Hello World! 这是测试数据 123456"; var originalBytes1 = Encoding.UTF8.GetBytes(testData1); Debug.Log($"原始数据: {testData1}"); Debug.Log($"原始字节长度: {originalBytes1.Length}"); var encryptedBytes1 = PhxhSDK.AOT.VersionUpdate.LocalInfoEncrypt.Encrypt(originalBytes1); Debug.Log($"加密后字节长度: {encryptedBytes1.Length}"); var decryptedBytes1 = PhxhSDK.AOT.VersionUpdate.LocalInfoEncrypt.Decrypt(encryptedBytes1, out bool isEncrypted1); var decryptedData1 = Encoding.UTF8.GetString(decryptedBytes1); Debug.Log($"解密后数据: {decryptedData1}"); Debug.Log($"是否加密: {isEncrypted1}"); Debug.Log($"测试1结果: {(testData1 == decryptedData1 ? "✓ 成功" : "✗ 失败")}"); // 测试2: JSON数据加密解密 Debug.Log("\n【测试2】JSON数据加密解密:"); var testJson = "{\"name\":\"测试\",\"value\":123,\"flag\":true}"; var originalBytes2 = Encoding.UTF8.GetBytes(testJson); Debug.Log($"原始JSON: {testJson}"); var encryptedBytes2 = PhxhSDK.AOT.VersionUpdate.LocalInfoEncrypt.Encrypt(originalBytes2); var decryptedBytes2 = PhxhSDK.AOT.VersionUpdate.LocalInfoEncrypt.Decrypt(encryptedBytes2, out bool isEncrypted2); var decryptedJson = Encoding.UTF8.GetString(decryptedBytes2); Debug.Log($"解密后JSON: {decryptedJson}"); Debug.Log($"是否有效JSON: {PhxhSDK.AOT.VersionUpdate.LocalInfoEncrypt.IsValidJson(decryptedBytes2)}"); Debug.Log($"测试2结果: {(testJson == decryptedJson ? "✓ 成功" : "✗ 失败")}"); // 测试3: Base64字符串加密解密 Debug.Log("\n【测试3】Base64字符串加密解密:"); var testString3 = "{\"test\":\"base64加密测试\",\"number\":999}"; Debug.Log($"原始字符串: {testString3}"); var encryptedBase64 = PhxhSDK.AOT.VersionUpdate.LocalInfoEncrypt.EncryptToBase64(testString3); Debug.Log($"加密后Base64长度: {encryptedBase64.Length}"); var decryptedString3 = PhxhSDK.AOT.VersionUpdate.LocalInfoEncrypt.DecryptFromBase64(encryptedBase64); Debug.Log($"解密后字符串: {decryptedString3}"); Debug.Log($"测试3结果: {(testString3 == decryptedString3 ? "✓ 成功" : "✗ 失败")}"); // 测试4: 明文数据兼容性测试 Debug.Log("\n【测试4】明文数据兼容性测试:"); var plainJson = "{\"plain\":\"明文数据\",\"encrypted\":false}"; var plainBytes = Encoding.UTF8.GetBytes(plainJson); Debug.Log($"明文数据: {plainJson}"); var decryptedPlainBytes = PhxhSDK.AOT.VersionUpdate.LocalInfoEncrypt.Decrypt(plainBytes, out bool isEncrypted4); var decryptedPlainJson = Encoding.UTF8.GetString(decryptedPlainBytes); Debug.Log($"解密后数据: {decryptedPlainJson}"); Debug.Log($"是否识别为加密: {isEncrypted4}"); Debug.Log($"测试4结果: {(plainJson == decryptedPlainJson && !isEncrypted4 ? "✓ 成功" : "✗ 失败")}"); // 测试5: 大数据加密解密 Debug.Log("\n【测试5】大数据加密解密:"); var largeData = new StringBuilder(); for (int i = 0; i < 1000; i++) { largeData.Append($"Line{i}:这是第{i}行测试数据,包含中英文和数字123456789;"); } var largeDataStr = largeData.ToString(); var originalBytes5 = Encoding.UTF8.GetBytes(largeDataStr); Debug.Log($"大数据原始长度: {originalBytes5.Length} 字节"); var encryptedBytes5 = PhxhSDK.AOT.VersionUpdate.LocalInfoEncrypt.Encrypt(originalBytes5); Debug.Log($"加密后长度: {encryptedBytes5.Length} 字节"); var decryptedBytes5 = PhxhSDK.AOT.VersionUpdate.LocalInfoEncrypt.Decrypt(encryptedBytes5, out bool isEncrypted5); var decryptedLargeData = Encoding.UTF8.GetString(decryptedBytes5); Debug.Log($"解密后长度: {decryptedBytes5.Length} 字节"); Debug.Log($"测试5结果: {(largeDataStr == decryptedLargeData ? "✓ 成功" : "✗ 失败")}"); Debug.Log("\n========== LocalInfoEncrypt 测试完成 =========="); EditorUtility.DisplayDialog("测试完成", "LocalInfoEncrypt加密解密测试已完成,请查看控制台日志", "确定"); } [MenuItem("Test/本地信息解密")] public static void FakeDecryptTest() { // 输入文件路径 var inputPath = @"C:\Users\82158\Downloads\DeobfuscateStackTrace\net8.0\LocalInfo.bytes"; // 输出文件路径 var outputPath = @"C:\Users\82158\Downloads\DeobfuscateStackTrace\net8.0\Decrypt_LocalInfo.json"; try { // 检查输入文件是否存在 if (!File.Exists(inputPath)) { Debug.LogError($"输入文件不存在: {inputPath}"); return; } // 读取加密数据 var encryptedBytes = File.ReadAllBytes(inputPath); Debug.Log($"读取加密数据,长度: {encryptedBytes.Length} 字节"); // 输出前20个字节用于调试 var headerInfo = new StringBuilder(); headerInfo.Append("文件头部字节 (前20字节): "); for (int i = 0; i < Math.Min(20, encryptedBytes.Length); i++) { headerInfo.Append($"{encryptedBytes[i]:X2} "); } Debug.Log(headerInfo.ToString()); // 检查是否有加密标识头 (NLDE = 0x4E, 0x4C, 0x44, 0x45) if (encryptedBytes.Length >= 4) { var hasHeader = encryptedBytes[0] == 0x4E && encryptedBytes[1] == 0x4C && encryptedBytes[2] == 0x44 && encryptedBytes[3] == 0x45; Debug.Log($"是否包含加密标识头 (NLDE): {hasHeader}"); if (hasHeader && encryptedBytes.Length >= 5) { Debug.Log($"加密版本号: {encryptedBytes[4]:X2}"); } } // 使用LocalInfoEncrypt.Decrypt进行解密 var decryptedBytes = PhxhSDK.AOT.VersionUpdate.LocalInfoEncrypt.Decrypt(encryptedBytes, out bool isEncrypted); Debug.Log($"解密完成,数据长度: {decryptedBytes.Length} 字节,是否加密: {isEncrypted}"); // 输出解密后前100个字节 var decryptedPreview = new StringBuilder(); decryptedPreview.Append("解密后数据预览 (前100字节): "); for (int i = 0; i < Math.Min(100, decryptedBytes.Length); i++) { if (decryptedBytes[i] >= 32 && decryptedBytes[i] <= 126) decryptedPreview.Append((char)decryptedBytes[i]); else decryptedPreview.Append($"[{decryptedBytes[i]:X2}]"); } Debug.Log(decryptedPreview.ToString()); // 转换为字符串(假设是JSON格式) var jsonString = Encoding.UTF8.GetString(decryptedBytes); Debug.Log($"解密后的JSON数据 (前500字符):\n{jsonString.Substring(0, Math.Min(500, jsonString.Length))}"); // 验证是否为有效JSON bool isValidJson = PhxhSDK.AOT.VersionUpdate.LocalInfoEncrypt.IsValidJson(decryptedBytes); Debug.Log($"是否为有效JSON: {isValidJson}"); // 保存到新文件中 File.WriteAllBytes(outputPath + ".bytes", decryptedBytes); // 同时保存字节文件 File.WriteAllText(outputPath, jsonString, Encoding.UTF8); Debug.Log($"解密后的数据已保存到: {outputPath}"); Debug.Log($"同时保存字节文件到: {outputPath}.bytes"); // 成功提示 if (isValidJson) { EditorUtility.DisplayDialog("解密成功", $"文件已成功解密并保存到:\n{outputPath}\n\n数据是有效的JSON格式", "确定"); } else { EditorUtility.DisplayDialog("解密警告", $"文件已解密并保存到:\n{outputPath}\n\n但数据可能不是有效的JSON格式,请检查", "确定"); } } catch (Exception ex) { Debug.LogError($"解密失败: {ex.Message}\n{ex.StackTrace}"); EditorUtility.DisplayDialog("解密失败", $"解密过程中出现错误:\n{ex.Message}", "确定"); } } [MenuItem("Test/测试加密")] public static void Test() { LTSimpleKey.InitKeys(); LTSimpleEncrypt.InitAES(LTSimpleKey.key1, LTSimpleKey.key2); var pathParent = "C:/Users/82158/Documents/WXWork/1688856871498430/Cache/File/2025-05"; var srcName = "defaultpackage_assets_hotupdatedlls_hotupdatedll.bundle"; var loadSrcBytes = File.ReadAllBytes(pathParent + "/" + srcName); var key3 = System.Text.Encoding.UTF8.GetBytes(Hash128.Compute(srcName).ToString()); var encryptBytes = LTSimpleEncrypt.EncryptBytes(key3, loadSrcBytes); var decryptBytesTest = new byte[loadSrcBytes.Length]; for (int i = 0; i < encryptBytes.Length; i++) { var encryptByte = encryptBytes[i]; var decryptByte = LTSimpleEncrypt.DecryptByte(encryptByte, key3, i); decryptBytesTest[i] = decryptByte; } var isSameTest = true; for (int i = 0; i < loadSrcBytes.Length; i++) { var loadSrcByte = loadSrcBytes[i]; var decryptByte = decryptBytesTest[i]; if (loadSrcByte != decryptByte) { isSameTest = false; break; } } Debug.LogError("单字节解密测试结果:" + isSameTest); // 把加密后的数据写入到一个新文件中 var saveName = "encrypt_" + srcName; var savePath = pathParent + "/" + saveName; File.WriteAllBytes(savePath, encryptBytes); using (var customFs = new CustomFileStream(savePath, key3)) { // 测试1: 传统测试 - 从头读取完整文件 var decryptBytes = new byte[loadSrcBytes.Length]; customFs.Read(decryptBytes, 0, decryptBytes.Length); var isSame = true; for (int i = 0; i < loadSrcBytes.Length; i++) { var loadSrcByte = loadSrcBytes[i]; var decryptByte = decryptBytes[i]; if (loadSrcByte != decryptByte) { isSame = false; break; } } Debug.LogError("传统测试结果:" + isSame); // 测试2: Seek测试 - 先读取后一半(通过seek),再读取前一半,拼到一起 customFs.Seek(loadSrcBytes.Length / 2, SeekOrigin.Begin); var decryptBytes2 = new byte[loadSrcBytes.Length]; var readLen2 = customFs.Read(decryptBytes2, loadSrcBytes.Length / 2, loadSrcBytes.Length / 2); customFs.Seek(0, SeekOrigin.Begin); var readLen1 = customFs.Read(decryptBytes2, 0, loadSrcBytes.Length / 2); Debug.LogError("读取长度:" + readLen1 + " , " + readLen2); isSame = true; for (int i = 0; i < loadSrcBytes.Length; i++) { var loadSrcByte = loadSrcBytes[i]; var decryptByte = decryptBytes2[i]; if (loadSrcByte != decryptByte) { isSame = false; break; } } Debug.LogError("Seek测试结果:" + isSame); } } }