这些符号在反编译代码中是什么

时间:2012-05-06 20:44:28

标签: c# .net obfuscation cil

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

Image 1

Image 2

Image 3

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

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:1)

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

当然,您只能更改仅在您要更改的代码库中引用的名称。与这些特殊名称的任何外部联系,或任何相当于反射的内部使用都会破坏。如果有理由期待其中任何一种都是这种情况,那么这将是一种浪费的努力。

答案 2 :(得分:1)

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

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

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

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