解决方案 »

  1.   

    什么“反编译”?你用vs打开之后,用鼠标放在class名字(例如"g")上点右键,然后选择“重构->重命名,然后输入你的命名(例如输入“MyMainForm”)即可。你可以根据你画出的对象之间通讯的时序图,随时猜测新的名字,重构源代码上的类名。
      

  2.   

    如果所谓的“混淆器”牛逼,似乎应该把“TextBox、DebugerNoneUserCode、TripleDESCryptoProvider”之类的名字也给混淆了才算数。可是它不敢!所以这种东西,就是它自己那一点命名才混淆。欺负的就是懒人,因为懒人不分析、只知道照抄。
      

  3.   

    因为本人刚接触C#,这是一个朋友给予俺作参考学习的,他也不熟悉C#,不知道他哪里弄来的,本来想在过年这段时间有空看看好好学习一下,但反编译出来就如图上,在论坛也看了很多帖子,说C#程序有什么混淆、加壳。我也不太清楚图片这程序是混了什么,有无加壳?感谢SP1234的指导建议
      

  4.   

    混淆和加壳/加密不同。混淆的含义是,将程序转换成一种等价但是不易阅读的形式,比如
    void Main()
    {
        Console.WriteLine(Sum(1, 100));
    }
    int Sum(int from, int to)
    {
        int sum = 0;
        for (int i = from; i <= to; i++)
        {
            sum += i;
        }
        return sum;
    }
    你希望这个程序难以被人理解,但是程序本身的功能不变,你可以通过变量改名实现:
    我们把所有的sum修改为OOO,所有的from修改为OO0所有的to修改为O0O,所有的i修改为O00,得到如下程序:
    void Main()
    {
        Console.WriteLine(Sum(1, 100));
    }
    int Sum(int OO0, int O0O)
    {
        int OOO = 0;
        for (int O00 = OO0; O00 <= O0O; O00++)
        {
            OOO += O00;
        }
        return OOO;
    }
    你会发现,虽然变量修改了,程序还是能够实现原来的功能。
    换一句话说,在这种转换的过程中,原来的变量名其实并不重要,在你修改的代码中也没必要保留,所以也就不可能找回去了。也可以说,混淆工具不过就是把这个过程用机器自动完成而已,得到的结果程序和你乱写变量名没有区别。因为程序中不包含原始的变量名信息,所以不可能转换回去的。
    我们说的混淆工具除了混淆,还有加密,这个加密包括将程序代码从程序中抽出加密后以数据的形式保存在程序中,这使得静态反编译无法得到程序代码。还包括将程序改写成IL合法但是无法用C#表达的形式,比如我们知道,你不能将一个方法定义成Sum<'123,C#不允许用特殊符号作为函数名,但是这个函数名在IL层面是允许的。混淆工具将函数名修改后,反编译工具只能傻傻地转换成不合法的C#代码,因为反编译工具不可能考虑到将非C#编译器的输出转换回C#。混淆工具还有别的形式的处理。总之一句话,没有任何机械的方法能够处理这样的代码。
      

  5.   

    这个真没难度
    看看这个效果Before Obfuscation
    public int CompareTo(Object o) {
       int n = occurrences –   ((WordOccurrence)o).occurrences;   if (n == 0) {      n = String.Compare(word,((WordOccurrence)o).word);   }   return(n);}
    ======================================================
    public virtual int _a(Object A_0) {
       int local0;   int local1;   local 10 = this.a – (c) A_0.a;   if (local0 != 0) goto i0;   while (true) {      return local1;      i0: local1 = local10;   }   i1: local10 = System.String.Compare(this.b, (c) A_0.b);   goto i0;}
      

  6.   

    混淆和加壳/加密不同。混淆的含义是,将程序转换成一种等价但是不易阅读的形式,比如
    void Main()
    {
        Console.WriteLine(Sum(1, 100));
    }
    int Sum(int from, int to)
    {
        int sum = 0;
        for (int i = from; i <= to; i++)
        {
            sum += i;
        }
        return sum;
    }
    你希望这个程序难以被人理解,但是程序本身的功能不变,你可以通过变量改名实现:
    我们把所有的sum修改为OOO,所有的from修改为OO0所有的to修改为O0O,所有的i修改为O00,得到如下程序:
    void Main()
    {
        Console.WriteLine(Sum(1, 100));
    }
    int Sum(int OO0, int O0O)
    {
        int OOO = 0;
        for (int O00 = OO0; O00 <= O0O; O00++)
        {
            OOO += O00;
        }
        return OOO;
    }
    你会发现,虽然变量修改了,程序还是能够实现原来的功能。
    换一句话说,在这种转换的过程中,原来的变量名其实并不重要,在你修改的代码中也没必要保留,所以也就不可能找回去了。也可以说,混淆工具不过就是把这个过程用机器自动完成而已,得到的结果程序和你乱写变量名没有区别。因为程序中不包含原始的变量名信息,所以不可能转换回去的。
    我们说的混淆工具除了混淆,还有加密,这个加密包括将程序代码从程序中抽出加密后以数据的形式保存在程序中,这使得静态反编译无法得到程序代码。还包括将程序改写成IL合法但是无法用C#表达的形式,比如我们知道,你不能将一个方法定义成Sum<'123,C#不允许用特殊符号作为函数名,但是这个函数名在IL层面是允许的。混淆工具将函数名修改后,反编译工具只能傻傻地转换成不合法的C#代码,因为反编译工具不可能考虑到将非C#编译器的输出转换回C#。混淆工具还有别的形式的处理。总之一句话,没有任何机械的方法能够处理这样的代码。方法内部混淆不是毫无意义吗? 所有变量名在编译时不是全部被编译器改过了?
      

  7.   

    混淆和加壳/加密不同。混淆的含义是,将程序转换成一种等价但是不易阅读的形式,比如
    void Main()
    {
        Console.WriteLine(Sum(1, 100));
    }
    int Sum(int from, int to)
    {
        int sum = 0;
        for (int i = from; i <= to; i++)
        {
            sum += i;
        }
        return sum;
    }
    你希望这个程序难以被人理解,但是程序本身的功能不变,你可以通过变量改名实现:
    我们把所有的sum修改为OOO,所有的from修改为OO0所有的to修改为O0O,所有的i修改为O00,得到如下程序:
    void Main()
    {
        Console.WriteLine(Sum(1, 100));
    }
    int Sum(int OO0, int O0O)
    {
        int OOO = 0;
        for (int O00 = OO0; O00 <= O0O; O00++)
        {
            OOO += O00;
        }
        return OOO;
    }
    你会发现,虽然变量修改了,程序还是能够实现原来的功能。
    换一句话说,在这种转换的过程中,原来的变量名其实并不重要,在你修改的代码中也没必要保留,所以也就不可能找回去了。也可以说,混淆工具不过就是把这个过程用机器自动完成而已,得到的结果程序和你乱写变量名没有区别。因为程序中不包含原始的变量名信息,所以不可能转换回去的。
    我们说的混淆工具除了混淆,还有加密,这个加密包括将程序代码从程序中抽出加密后以数据的形式保存在程序中,这使得静态反编译无法得到程序代码。还包括将程序改写成IL合法但是无法用C#表达的形式,比如我们知道,你不能将一个方法定义成Sum<'123,C#不允许用特殊符号作为函数名,但是这个函数名在IL层面是允许的。混淆工具将函数名修改后,反编译工具只能傻傻地转换成不合法的C#代码,因为反编译工具不可能考虑到将非C#编译器的输出转换回C#。混淆工具还有别的形式的处理。总之一句话,没有任何机械的方法能够处理这样的代码。方法内部混淆不是毫无意义吗? 所有变量名在编译时不是全部被编译器改过了?
    是的,我是举例子。另外方法内照样需要对使用的成员变量混淆。