4

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

图 1

图 2

图 3

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

4

3 回答 3

9

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

但是,您可以反编译为 IL 并能够编译该项目。

另请查看C# 的 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);
   }
}
于 2012-05-06T21:01:55.043 回答
1

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

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

于 2012-05-06T21:05:32.810 回答
1

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

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

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

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

于 2012-05-06T21:12:21.093 回答