我反编译了一个可执行文件,无法理解源代码(C#)中的这些符号是什么。我会在这里粘贴源代码示例,但是当我尝试粘贴时,反编译源中的特殊字符在此编辑器中不可打印。所以我在这里拍摄几张剪辑图片和粘贴链接,所以任何人都可以看到,所以例子是:
我猜的是这个源代码被混淆了吗?并且这些符号可以存在于MSIL中,但是当在C#中进行翻译时,它们会产生非法字符。是对的吗?关于如何解决这个问题的任何建议,比如对这些东西进行替换?
答案 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)。
您无法复制和粘贴它们,因为大多数现代字体中都不存在显示的字符。