Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进行混淆,避免被反编译。

本文介绍如何在Unity环境中使用Visual Studio 2013创建自定义的日志输出类,并通过C#实现基本的日志功能,包括正常日志、错误日志和警告日志的输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、打开VS,博主所用版本是Visual Studio 2013。

2、新建一个VC项目,选择类库,取名为JefferyChan,具体步骤如下图:

新建项目图片

3、因为要调用Unity中的相关文件,所以这里要引入外部文件。首先在Unity的安装文件夹中找到UnityEngine.dll,我的路径是:D:\Program Files (x86)\Unity\Editor\Data\Managed如下图所示:

找到UnityEngine.dll文件

4、将UnityEngine.dll引入到项目中,如下图:打开项目,然后打开VS的视图->解决方案管理器

打开解决方案管理器

5、项目文件下的引用上面单击鼠标右键,引用->添加引用,引入外部文件,如下图所示:

添加引用

6,编辑需要编译的C#类文件,博主这里写的是个自定义日志输出文件,具体代码如下:

using System.Collections;
using UnityEngine;

/**
 * 
 * 新建一个命名空间 用于保存自己定义的一些公用方法
 * 
 * **/
namespace JefferyChan
{
    /**
     * 
     * 新建一个JefferyLog类用于输出调试日志
     * **/
    public class JefferyLog
    {
        //定义一个标志 用于控制是否输出日志
        static public bool EnableLog = true;

        /**
         * 打印日志 但是没有传递打印日志对应的组件
         * **/
        static public void Log(object message)
        {
            Log(message, null);
        }

        /**
         * 打印日志 并显示打印日志对应的组件
         * **/
        static public void Log(object message, Object context)
        {
            if (EnableLog)
            {
                //message为打印的信息,context为打印信息对应的组件
                Debug.Log(message, context);
            }
        }

        /**
         * 打印出错日志  但是没有传递打印日志对应的组件
         * **/
        static public void LogError(object message)
        {
            LogError(message, null);
        }

        /**
         * 打印出错日志 并显示打印日志对应的组件
         * **/
        static public void LogError(object message, Object context)
        {
            if (EnableLog)
            {
                Debug.LogError(message, context);
            }
        }

        /**
         * 打印警告日志 但是并不打印出具体的警告内容
         * **/
        static public void LogWarning(object message)
        {
            LogWarning(message, null);
        }

        /**
         * 打印警告日志 并且打印出警告内容
         * **/
        static public void LogWarning(object message, Object context)
        {
            if (EnableLog)
            {
                Debug.LogWarning(message, context);
            }
        }
    }
}

7、编译项目,生成dll文件,如下图所示:

编译项目

8、找到生成的dll文件,文件路径为:“项目路径”->bin->Debug->JefferyChan.dll,如下图所示:

找到dll文件

9、此时的dll文件用Reflector打开,发现反编译出来的代码和原始的代码几乎是一样的,如下图所示:

编译原始文件

10、使用Dotfuscated对生成的JefferyChan.dll文件进行混淆,如下图所示:

进行混淆

点击生成按钮,进行混淆。

进行混淆

11、再次反编译混淆后的代码,发现无法进行反编译,如下图所示:

这里写图片描述

Dotfuscated是VS自带的,它存在于VS的安装目录下:D:\Program Files (x86)\Microsoft Visual Studio 12.0\PreEmptive Solutions\Dotfuscator and Analytics Community Edition

如下图所示:

这里写图片描述

备注:将项目属性 -> 应用程序 -> 目标框架:改为 .NET Framework 3.5或以下 。这一步很重要,因为Unity3D(当前的Unity3D版本是3.5版) 支持的 .Net 是3.5版。

如果选择的是4.0版会出现

Internal compiler error. See the console log for more information. output was:Unhandled Exception: System.TypeLoadException: Could not load type ‘System.Runtime.Versioning.

如下图所示:

.net版本

Reflector下载链接:http://pan.baidu.com/s/1o6KH9xw

反编译 Unity 生成的 `.unity` 文件(通常是 Unity 场景文件不是一个直接的过程,因为这些文件是以 Unity 自定义的二进制格式存储的,通常无法直接通过标准工具读取。然而,以下是一些常见的方法和工具,可以用于查看 `.unity` 文件的内容,尤其是资源、场景结构或脚本引用。 ### 使用 Unity 项目导入 `.unity` 文件 如果你拥有一个 Unity 项目,希望查看 `.unity` 文件的内容,最直接的方式是将该文件导入到 Unity 编辑器中。具体步骤如下: 1. 打开 Unity 编辑器创建一个新的项目,或者打开一个现有项目。 2. 将 `.unity` 文件复制到项目的 `Assets` 文件夹中。 3.Unity 编辑器的 Project 窗口中,双击该 `.unity` 文件Unity 会加载该场景,显示所有场景中的 GameObject、组件和资源引用。 通过这种方式,可以查看场景的层级结构、游戏对象的组件以及引用的资源(如纹理、模型、音频等)。 ### 使用反编译工具查看 `.unity` 文件 如果目标 `.unity` 文件来自一个 Unity 构建的应用(如 APK 或独立可执行文件),那么通常需要先提取 `.unity` 文件,然后使用特定工具进行分析。以下是一些常用的工具和技术: #### 1. **AssetStudio** AssetStudio 是一个开源工具,支持解析 Unity 的 `.unity3d`、`.asset` 和 `.unity` 文件。它能够提取场景中的 GameObject、组件、材质、纹理等信息。 - 下载地址:[https://github.com/Perfare/AssetStudio](https://github.com/Perfare/AssetStudio) - 使用方法:打开 AssetStudio,导入 `.unity` 文件,工具会解析列出所有资源对象。 #### 2. **Unity Assets Bundle Extractor (UABE)** UABE 是一个用于分析和修改 Unity 资源包的工具,支持 `.unity` 文件的解析。 - 下载地址:[https://github.com/DerPopo/UABE](https://github.com/DerPopo/UABE) - 使用方法:加载 `.unity` 文件后,浏览资源树导出所需内容。 #### 3. **ILSpy 或 .NET Reflector** 虽然这些工具主要用于反编译 C# 脚本,但如果 `.unity` 文件中包含脚本引用,可以通过这些工具查看脚本逻辑。例如,Unity 游戏的核心逻辑通常位于 `Assembly-CSharp.dll` 中,该文件可以在 APK 或 Unity 构建的资源中找到[^3]。 ### 使用 Unity 的 Editor Script 提取信息 如果拥有 Unity 项目访问权限,可以通过编写 Editor Script 来批量提取 `.unity` 文件中的信息。例如,以下是一个简单的 Editor Script 示例,用于打印场景中的 GameObject 名称: ```csharp using UnityEditor; using UnityEngine; using System.IO; public class SceneAnalyzer : EditorWindow { [MenuItem("Tools/Analyze Scene")] public static void AnalyzeCurrentScene() { string scenePath = EditorSceneManager.GetActiveScene().path; if (string.IsNullOrEmpty(scenePath)) { Debug.Log("No scene loaded."); return; } Object[] allObjects = AssetDatabase.LoadAllAssetsAtPath(scenePath); foreach (Object obj in allObjects) { if (obj is GameObject) { Debug.Log("Found GameObject: " + obj.name); } } } } ``` 将该脚本放入 `Editor` 文件夹中,Unity 编辑器中运行,即可分析当前加载的 `.unity` 文件。 ### 注意事项 - **加密与混淆**:许多 Unity 项目会对资源进行加密或混淆,以防止直接反编译。在这种情况下,上述工具可能无法正常工作,或者需要额外的解密步骤[^1]。 - **法律与道德**:反编译他人开发的 Unity 项目可能涉及法律问题,务必确保在合法授权范围内进行相关操作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值