• 去掉ILDasm的SuppressIldasmAttribute限制


    今天本打算汉化一个.Net程序的,当用ILDasm打开的时候,出现了"受保护模块—无法进行反汇编"的错误提示

    看到这个错误提示后,便尝试用ILSpy打开,结果一切正常。网上搜了下,原来是SuppressIldasmAttribute这个属性弄的。

    关于SuppressIldasmAttribute这个属性,它可以在程序集中声明,声明这个属性后,ILDasm便不对这个程序集进行反汇编,从而起到一定程度的保护作用。其使用方法可以参看使用SuppressIldasmAttribute防止MSIL反組譯工具對組件進行反組譯这篇文章。

    不过,这个SuppressIldasmAttribute是个君子协议,就算加上这个声明,编译器也没有什么额外的保护操作,只是ILDasm不对它反汇编罢了。像ILSpy、Reflector等第三方反编译工具都是无视这个属性的,基本上是一种掩耳盗铃罢了。园子里有篇文章谈谈ILDasm的功能限制与解除比较详细的介绍到了这个。

    那么,如果我们要用ILDasm越过SuppressIldasmAttribute的限制反汇编程序该怎么办呢?一种方法是写个程序修改该程序集的的IL码,去掉SuppressIldasmAttribute属性,代码如下(需要Mono.Cecil库支持):

        public static void RemoveSuppressIldasmAttribute(string input, string output)
        {
            AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(input);
            foreach (CustomAttribute attribute in assembly.CustomAttributes)
            {
                if (attribute.Constructor.DeclaringType.Name == "SuppressIldasmAttribute")
                {
                    assembly.CustomAttributes.Remove(attribute);
                    break;
                }
            }

            assembly.Name.PublicKey = null;
            assembly.Name.PublicKeyToken = null;
            assembly.Write(output);
        }

    用这个函数把程序集中的SuppressIldasmAttribute属性去掉后,就可以用ILDasm打开了。

    这个方法略显麻烦,在前面的文章谈谈ILDasm的功能限制与解除中给出了另一种解决方法:直接去掉ILDasm中对SuppressIldasmAttribute的限制,这样就可以打开有SuppressIldasmAttribute声明的程序集了。原文中已经给了一个修改后的ILDasm.exe的下载,不过由于该文章发表时间较早,给出的ILDasm.exe的版本也比较老,要使用最新的ILDasm.exe必须我们自己修改。原文中是通过反汇编的方式修改的,比较麻烦,这里给一个简单的方法。

    1. 将ILDasm.exe改个扩展名(记得备份原文件),然后用VisualStudio打开。

    PS:之所以要改扩展名,是因为我要以十六进制的方式编辑,如果不改扩展名的话,VS把它当个exe打开,只能修改资源文件,如果用Ultraedit或WinHex之类的程序以十六进制方式编辑则可以不用改扩展名。

    2. 查找SuppressIldasmAttribute字符串

    3. 把它修改成一个其他的字符串

    4. 保存修改后还原扩展名为.exe,这样你的新ILDasm.exe就无视SuppressIldasmAttribute了。

  • 相关阅读:
    .IllegalArgumentException: Mapped Statements collection does not contain 异常一例【我】
    Spring配置文件里加载路径中的通配符
    线程池使用Callable示例【我】
    使用Callable和Future接口创建线程
    Java线程池(Callable+Future模式)
    集合切割
    draw call 理解和优化
    Unity 3d导入3dMax模型 产生若干问题
    3dmax做的模型导入U3d后 当模型靠近摄像机时镂空问题
    不管多少个空格替换为一个空格
  • 原文地址:https://www.cnblogs.com/TianFang/p/2810344.html
Copyright © 2020-2023  润新知