×

.net反编译 如何保护我们的.net代码

Kalet Kalet 发表于2009-03-20 12:00:14 浏览166 评论0

抢沙发发表评论

最近对.net稍微有了多一点的认识了,知道它能够支持的编程语言有很多,如C#,VB.Net,C++.Net以及J#等,使用任何一种语言编写的程序都首先生成微软中间代码(MSIL),在程序运行的时候这些中间代码再转换成机器码,由CPU运行。由于都统一生成中间代码,而且可以通过反编译程序(ildasm.exe)查看中间代码,比如我的helloworld.exe(C#)的经过它查看的中间代码是:

.assembly extern mscorlib.net反编译 如何保护我们的.net代码
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                 // .z\\V.4..
.ver 1:0:5000:0
}
.assembly HellWorld
{
// --- 下列自定义属性会自动添加,不要取消注释 -------
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool,
//                                                     bool) = ( 01 00 00 01 00 00 )
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module HellWorld.exe
// MVID: {609A4936-CB81-4E55-85E2-DEC45DBB4C00}
.p_w_picpathbase 0x00400000
.subsystem 0x00000003
.file alignment 512
.corflags 0x00000001
// Image base: 0x00e90000

.method private hidebysig static void Main(string[] Args) cil managed
{
.entrypoint
// 代码大小     17 (0x11)
.maxstack 1
IL_0000: ldstr     "Hello,World!"
IL_0005: call     void [mscorlib]System.Console::WriteLine(string)
IL_000a: call     string [mscorlib]System.Console::ReadLine()
IL_000f: pop
IL_0010: ret
} // end of method FirstApp::Main

vb版本的Helloworld的反编译代码是:
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                 // .z\\V.4..
.ver 1:0:5000:0.net反编译 如何保护我们的.net代码
}
.assembly extern Microsoft.VisualBasic
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )                 // .?_....:
.ver 7:0:5000:0
}
.assembly HellWorldVB
{
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module HellWorldVB.exe
// MVID: {5D925990-A091-4185-9426-C322027980AF}
.p_w_picpathbase 0x00400000
.subsystem 0x00000003
.file alignment 512
.corflags 0x00000001
// Image base: 0x00e90000
.method public static void Main(string[] Args) cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// 代码大小     17 (0x11)
.maxstack 8
IL_0000: ldstr     "Hello,World! VB"
IL_0005: call     void [mscorlib]System.Console::WriteLine(string)
IL_000a: call     string [mscorlib]System.Console::ReadLine()
IL_000f: pop
IL_0010: ret
} // end of method FistApp::Main
很显然他们是一样的。并且还有很多的反编译软件可以把他们重新还原成源程序!如果我们的 .net组件再发布后被别人这样查看了,并生成源程序再次被编译为新的组件的话,我们组件的商业价值何在呢?
这么说使用.net生成的程序是脆弱的?
但是我们还是有一些措施来进行保护的:
1。首先就是给你的组件进行强命名,即使用SDK中的sn.exe -k生成一个公-私秘匙对,然后在Assembly特性中添加AssemblyKeyFile("xxx.snk"),那么在对该组件进行编译的时候将给它进行强命名。大拿尽管是这样,还是不能彻底阻止别人查看中间代码并重新编译组件。
2。对组件进行数字签名。其实这样还是保护不了代码,它的能力就是保证我们的组件是唯一的,即使它被反编译,但不能再使用这个名字来发布了。这还是治标不治本!
3。使用第三方提供的工具,进行代码混淆,让他人不能从中这些猜到代码是干什么的。减少被他人重便宜的可能性。
其实现在开源软件还是很多的,对于我们有重要商业秘密的程序组件使用.net还是有风险的,解决的最好办法就是把这些组件都留在一个机器上面,以Web服务的形式提供给客户,任何人都不能得到组件了,也就不可以对它实现反编译了。但这样的后果也是很显然的:它要求用户能够都有可用的Internet连接,是不太现实的吧,还有,调用远程主机上的web服务的速度很显然是没有本机速度快的,这样就…….net反编译 如何保护我们的.net代码
总之我们选择.net的话,我们就要作好被copy的准备咯!


群贤毕至

访客