【问题标题】:What are these symbols in a decompiled code反编译代码中的这些符号是什么
【发布时间】:2012-05-06 20:44:28
【问题描述】:

我反编译了一个可执行文件,但无法理解源代码 (C#) 中的这些符号是什么。我会在此处粘贴源示例,但当我尝试粘贴时,反编译源中的特殊字符无法在此编辑器中打印。所以我在这里拍摄了一些截图并粘贴链接,以便任何人都可以看到,所以示例是:

我猜这个源代码被混淆了,对吧?并且这些符号可以存在于 MSIL 中,但在 C# 中按原样翻译时,它们会产生非法字符。是对的吗?关于如何克服这个问题的任何建议,比如对这些东西进行全部替换?

【问题讨论】:

    标签: c# .net obfuscation cil


    【解决方案1】:

    MSIL 对允许作为标识符名称的内容有非常宽松的规则。混淆器故意选择 C# 无法表示的字符,因此您无法往返 C#。

    您可以反编译为 IL 并能够编译项目。

    另请查看C#'s unicode identifiers。您可以在 C# 标识符中包含 unicode 转义码,这让很多人感到惊讶。示例:

    class @class
    {
       public static void @static(bool @bool) {
          if (@bool)
             System.Console.WriteLine("true");
          else
             System.Console.WriteLine("false");
       }   
    }
    class Class1
    {
       static void M() {
          cl\u0061ss.st\u0061tic(true);
       }
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用十六进制编辑器查看文件,找出这些值的“规则”,然后您可以自己编写一个程序,将它们转换为带有一些前缀的 ascii 表示形式 - 即 obs_627 或任何。

      当然,您只能更改仅在您正在更改的代码库中引用的名称。与这些特殊名称的任何外部链接,或任何相当于反射的内部使用都会中断。如果有理由预期其中任何一种情况都会发生,那么这将是白费力气。

      【讨论】:

        【解决方案3】:

        这些来自旧的 MS-DOS ANSI 字符集。

        您发布的第一个示例包含 ASCII 线条绘图字符。 IIRC,他们从十进制 172(0xAC hex)左右开始。

        第二个和第三个包含十进制 1 到 31 之间的 ASCII 字符(十六进制表示法中的 0x01-0x1F)。

        您不能复制和粘贴它们,因为显示的字符在大多数现代字体中都不存在。

        【讨论】:

          猜你喜欢
          • 2019-09-09
          • 2017-12-01
          • 2021-02-13
          • 2010-10-14
          • 2012-09-09
          • 1970-01-01
          • 2017-10-09
          • 2019-06-08
          • 1970-01-01
          相关资源
          最近更新 更多