解决方案 »
- rdlc制作报表的图表问题?
- 要转型为系统架构,推荐本设计模式的书看看?
- 如何把自已的事件处理函数添加在委派中已有的处理函数前面
- 在C#中如何将sql查询出来的结果放到定义好的数组中
- 非广告:---.net书籍,源代码,控件下载 ---
- 怎样子使用c#连接公网上的sql server 数据库
- C#网页自动填表单
- WPF中DataGrid实现行合并以及多头表格
- 怎样把Release目录中的各个文件编译到一个exe文件里?
- C#求一个数的绝对值的方法是什么?
- CKFinder CKEditor 上传图片出错 403 Forbidden
- C# Winform水晶报表连接Access数据库 提示需要登录
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#。混淆工具还有别的形式的处理。总之一句话,没有任何机械的方法能够处理这样的代码。
看看这个效果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;}
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#。混淆工具还有别的形式的处理。总之一句话,没有任何机械的方法能够处理这样的代码。方法内部混淆不是毫无意义吗? 所有变量名在编译时不是全部被编译器改过了?
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#。混淆工具还有别的形式的处理。总之一句话,没有任何机械的方法能够处理这样的代码。方法内部混淆不是毫无意义吗? 所有变量名在编译时不是全部被编译器改过了?
是的,我是举例子。另外方法内照样需要对使用的成员变量混淆。