【问题标题】: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)。
您不能复制和粘贴它们,因为显示的字符在大多数现代字体中都不存在。