前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#判断文件是否被混淆

C#判断文件是否被混淆

作者头像
林德熙
发布2018-09-18 15:33:50
2.2K0
发布2018-09-18 15:33:50
举报
文章被收录于专栏:林德熙的博客

可以使用混淆工具对一个DLL 和 exe 进行混淆。 但是如何知道一个文件是否已经混淆了。 在发布之前,需要知道是不是有文件忘了混淆。

要判断文件是否混淆,必须知道常用的混淆手法。

混淆就是因为编写的 C# 代码转换 IL ,可以很容易被反编译,从而知道了源代码,不利于保护软件,不利于防止破解。

所以可以通过混淆来让反编译困难。

但是经过混淆,只可以让好多反编译新手无法破解,对于大神,还是没有作用。

但是本文不讨论这个,还是来说下,常用的混淆。

  • 混淆变量名
  • 混淆流程

常见的也是混淆变量名,这也是本文的检测方法,对于混淆流程,暂时还没有方法。

简单方法去获得文件是否混淆变量名是反射。

可以通过加载文件,使用动态加载 DLL,然后使用反射判断文件变量名是否存在不可读字符,如果存在,那么文件被混淆。

代码:

代码语言:javascript
复制
    class ApplicationProxy : MarshalByRefObject
    {
        private static readonly string[] ConfuseNameCharacteristics =
        {
            "\u0001",
            "\u0002",
            "\u0003",
            "\u0004",
            "\u0005",
            "\u0006",
            "\u0007",
            "\u0008",
            "\u0009",
            "\u0010",
            "\u0011",
            "\u0012",
            "\u0013",
            "\u0014",
            "\u0015",
            "\u0016",
            "\u0017",
            "\u0018",
            "\u0019"
        };

        /// <summary>
        ///     判断一个文件是否混淆
        /// </summary>
        /// <param name="file">文件是exe dll</param>
        /// <returns></returns>
        public ConfuseType CheckFileConfuse(FileInfo file)
        {
            try
            {
                var assembly = Assembly.LoadFile(file.FullName);
                var types = assembly.GetTypes();
                if (
                    types.Any(
                        type => ConfuseNameCharacteristics.Any(ch => type.FullName.Contains(ch) || PeeConfuseType(type))))
                    return ConfuseType.Confused;
                return ConfuseType.NotConfused;
            }
            catch (ReflectionTypeLoadException)
            {
                return ConfuseType.NotSupported;
            }
            catch (Exception e)
            {
                if (e is BadImageFormatException || e is FileLoadException)
                    return ConfuseType.NotSupported;
                throw;
            }
        }

        /// <summary>
        ///     判断type的方法是否有混淆
        /// </summary>
        /// <param name="type"></param>
        private bool PeeConfuseType(Type type)
        {
            return ConfuseNameCharacteristics.Any(temp => type.GetFields().Any(field => field.Name.Contains(temp))) ||
                   ConfuseNameCharacteristics.Any(
                       temp => type.GetProperties().Any(property => property.Name.Contains(temp))) ||
                   ConfuseNameCharacteristics.Any(temp => type.GetMethods().Any(method => method.Name.Contains(temp)));
        }
    }

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档