.Net程序破解跟普通程序破解一样,大部分是修改检验注册的代码,直接返回已注册标记,或者了解注册机制写一个注册机。对于第一种修改代码的方法,必须解决.net强名称的问题。强名称为CLR提供了一个程序集的惟一性标识。除此之外,添加一个强名称还可确保二进制完整性,因为CLR可在程序集加载时执行验证,判断它自从编译以来是否被篡改过。

一般去除强名称的方法是用ILAsm反编译程序,去除il文件中的.publickey和.hash algorithm一段,然后重新编译
  .custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = ( 01 00 10 50 72 65 62 75 69 6C 74 20 52 65 6C 65   // ...Prebuilt Rele
                                                                                                    61 73 65 00 00 )                                  // ase..
  .publickey = (00 24 00 00 04 80 00 00 94 00 00 00 06 02 00 00   // .$..............
                00 24 00 00 52 53 41 31 00 04 00 00 01 00 01 00   // .$..RSA1........
                23 82 FC B1 06 95 23 CE 72 D8 49 49 7A 55 7A 44   // #.....#.r.IIzUzD
                5C 15 1E AF 40 07 AA 79 AD EF 55 1A 82 04 CA 7F   // \...@..y..U.....
                72 8E 53 78 60 7D 85 69 5B 16 F1 29 EC 35 BF 4A   // r.Sx`}.i[..).5.J
                F1 5D CF 6D 35 81 DE B8 BB 0D EB B2 39 C3 3E 7F   // .].m5.......9.>.
                12 71 A3 7C 7F 60 F1 04 4A E4 17 73 0F 50 82 AB   // .q.|.`..J..s.P..
                EE 5F 9E C5 68 A8 A4 CE F0 40 74 39 47 55 70 63   // ._..h....@t9GUpc
                76 E9 82 DC 6F 9D 15 43 0F AA AD 38 5A E8 F0 0A   // v...o..C...8Z...
                77 EF 1C 97 51 7F 1A 15 17 00 4C E7 80 28 B9 CE ) // w...Q.....L..(..
  .hash algorithm 0x00008004

但是并不是所有程序都可以反编译成功,有些程序反编译后无法重新编译,还有些反编译和编译都成功了,但是无法在设计环境设置属性。因此必须先去掉强名称,才能破解注册检验。

网上有一个专门去除强名称的工具:snremove.exe。网址是:http://www.nirsoft.net/dot_net_tools/strong_name_remove.html
我使用过效果不错,的确能去除强名称。但是这个工具有一个缺点,在windows 2003 server上会失效。

我又找到网上另外一个去除强名称的工具:snremover.exe,这是tankaiha 写的,tankaiha 把去除签名称的机制都说的非常具体,请看下面的连接:

http://vxer.cn/hmx/show.php?id=14
http://vxer.cn/hmx/show.php?id=15
令我不解的是 tankaiha说nirsoft的snremove不好用,无法去除强名称。但是我比较后发现则2个工具其实处理都一样的,都是把DLL位置为:1028处的50 20 00 00 80全部改为00。因此这两个工具是一样的。但是这两个工具都无法解决Windows 2003 Server下去除强名称失效的问题。

我通过比较发现Windows 2003 Server是内置.Net Framework 1.1的,而且不能卸载重新安装,Windows 2003 Server的.net framework 1.1与标准的.net framework 1.1的区别是文件版本号不一样。标准.net framework 1.1的文件版本是1.1.4322.573,而Windows 2003 Server的是1.1.4322.2300,版本高好多。因此可以看出Windows 2003 Server的.net framework 1.1已经修补了强名称去除的漏洞,导致普通的强名称去除工具失效。

解决办法:用标准.net framework 1.1的文件mscorsn.dll (版本号:1.1.4322.573),替换windows 2003的mscorsn.dll (版本号:1.1.4322.2300)。替换的目录是下面3个目录:
c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\mscorsn.dll
c:\WINDOWS\ServicePackFiles\i386\mscorsn.dll
c:\WINDOWS\system32\dllcache\mscorsn.dll

网上有更狠的破解强名称校验的方法就是直接破解mscorsn.dll ,把强名称校验StrongNameSignatureVerification和StrongNameSignatureVerificationFromImage都patch掉

StrongNameSignatureVerification

xor eax,eax
inc eax
retn 0ch


StrongNameSignatureVerificationFromImage

xor eax,eax
inc eax
retn 10h


保存,替换原来的mscorsn.dll。

这个方法尽管比较彻底,但是会导致其他不同版本的.net dll会调用错误,后果可能会很严重的。因此还是用低版本的mscorsn.dll 替换高版本的mscorsn.dll 比较安全。

 .Net的强名称并不能起到加密.net程序的作用,要加密.net程序比较困难,顶多只能防止反编译为可以识别的C#代码,用内嵌PE dll的方式加密,还是可以被破解的。