C#判断文件是否被混淆

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

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

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

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

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

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

  • 混淆变量名
  • 混淆流程

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

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

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

代码:

    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)));
        }
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏皮皮之路

【JVM】浅谈双亲委派和破坏双亲委派

笔者曾经阅读过周志明的《深入理解Java虚拟机》这本书,阅读完后自以为对jvm有了一定的了解,然而当真正碰到问题的时候,才发现自己读的有多粗糙,也体会到只有实践...

2642
来自专栏生信宝典

Bash概论 - Linux系列教程补充篇

本篇是我最开始学习Linux命令时看的一篇帖子,最早见于ChinaUnix (这次查找其出处时发现2002年就有这篇)。学习过程中,遇到问题就查一下。这次看到,...

1997
来自专栏Java技术栈

设计模式之动态代理模式实战

昨天分享了静态代理的概念及存在的缺点,所以今天讲的动态代理模式十分重要。动态代理在我们工作当中应用相当广泛,如Srping AOP就是动态代理的在开源框架的比较...

3524
来自专栏达摩兵的技术空间

数组双向绑定的简单分享

本文主要是摘录《vuejs权威指南》部分的相关解读,我们都知道vue对数据支持双向绑定,对数组也是支持的,但是其在官网有明确说明,对于数组通过 对象.语法来修改...

1302
来自专栏菩提树下的杨过

当wcf遇到JSON ?

昨天在调试项目时,意外发现一个奇怪的问题,实在不知道如何准确描述,所以随便起了个标题。 项目中有一个wcf供jquery调用,wcf示例代码如下: /**///...

2455
来自专栏服务端技术杂谈

Golang笔记

静态编译 编译时一个将源代码翻译成低级语言的过程。编译过程比较慢,在设计Go时,编译速度是主要的设计目标之一。静态类型意味着变量必须指定一个类型,如整形,字符串...

3014
来自专栏逸鹏说道

.NET中的异步编程上

开篇 异步编程是程序设计的重点也是难点,还记得在刚开始接触.net的时候,看的是一本c#的Winform实例教程,上面大部分都是教我们如何使用Winform的控...

29212
来自专栏大内老A

[WCF REST] WebHttpBinding与消息编码

不论是我们采用SOAP还是REST架构风格,运行时框架体系依然不曾改变,终结点也仍旧是通信的核心。在Web HTTP编程模型中,我们采用基于WebHttpBin...

2176
来自专栏DOTNET

ASP.NET Web API编程——路由

路由过程大致分为三个阶段: 1)请求URI匹配已存在路由模板 2)选择控制器 3)选择操作 1匹配已存在的路由模板 路由模板 在WebApiConfig.Reg...

3197
来自专栏大内老A

[WCF REST] UriTemplate、UriTemplateTable与WebHttpDispatchOperationSelector

REST服务采用面向资源的架构,而资源通过URI进行标识和定位,所以URI在REST中具有重要的地位。对于WCF来说,服务调用请求的URI映射为某个具体的操作,...

2085

扫码关注云+社区

领取腾讯云代金券