zoukankan      html  css  js  c++  java
  • 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)));
            }
        }
    

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

  • 相关阅读:
    linux安装mongo-c-driver
    DPDK在虚拟机上运行时,报错: Ethdev port_id=0 requested Rx offloads 0xe doesn't match Rx offloads capabilities 0x82a1d in rte_eth_dev_configure()
    用python写xml文件
    openvas在centos中扫描单项的python实现
    ARP协议的报文格式
    python装饰器使用
    openvas漏洞扫描:使用openvas时扫描漏洞时,报告中显示的数据与数据库数据不同
    单链表实现一元多项式乘法与加法运算(C语言)
    Java学习笔记DayN Java高级特性概况
    Java学习笔记Day5 集合
  • 原文地址:https://www.cnblogs.com/lindexi/p/12087339.html
Copyright © 2011-2022 走看看