第一次爆破程序集的经历

     近段时间,给一家企业做一个上网统计的小系统,该系统是用于统计内部员工上网的情况,主要功能就是生成一些相关的Excel报表,这些报表是带图表的。由于需要通过模版生成一些带图表的Excel文件,考虑到无法用XML + XSL实现,也不希望用office 组件,就在网上找到一个.NET组件,名称叫:SpreadsheetGear;它的功能很专业,可以通过编码的方式直接对Excel文件进行操作,而不像平常的方式需要启动Excel进程。由于它只有30天的试用期,而且该试用版的有效期只到2008-10-1,是在程序集内写死的,任你如何修改注册表都没用。而且在网上搜索了大半天,都找不到该组件的破解版,因此郁闷了大半天。只好自己动手爆破,在这次爆破中,学到了不少知识,给大家分享一下,也当做一次回顾。

 

     首先使用Reflector对该程序进行反编译,虽然该程序集使用了名称混淆技术,但只要耐心分析还是可以找到判断有效期的位置的。你也可以先使用Dis#对它进行反混淆,再和Reflector配合使用找到判断有效期的位置。

     然后就可以用.net自带的工具ildasm对它进行反汇编,以SpreadsheetGear为文件名把它转储到一个新建文件夹,我这里保存在C盘下名称为S的新建文件夹,再打开C:\S目录就可以看到刚才输出的所有文件。这时咱们只要修改SpreadsheetGear.il文件就行了,用普通的文本编辑器找开它,最好使用UltraEdit,这样快一些。

     下来就是去除强名称签名,强名称按照微软MSDN上介绍就是:

 

      强名称是由程序集的标识加上公钥和数字签名组成的。其中,程序集的标识包括简单文本名称、版本号和区域性信息(如果提供的话)。强名称是使用相应的私钥,通过程序集文件(包含程序集清单的文件,并因而也包含构成该程序集的所有文件的名称和散列)生成的。Microsoft® Visual Studio® .NET 和在 .NET Framework SDK 中提供的其他开发工具能够将强名称分配给一个程序集。强名称相同的程序集应该是相同的。

通过签发具有强名称的程序集,您可以确保名称的全局唯一性。强名称还特别满足以下要求:

  • 强名称依赖于唯一的密钥对来确保名称的唯一性。任何人都不会生成与您生成的相同的程序集名称,因为用一个私钥生成的程序集的名称与用其他私钥生成的程序集的名称不相同。

  • 强名称保护程序集的版本沿袭。强名称可以确保没有人能够生成您的程序集的后续版本。用户可以确信,他们所加载的程序集的版本出自创建该版本(应用程序是用该版本生成的)的同一个发行者。

  • 强名称提供可靠的完整性检查。通过 .NET Framework 安全检查后,即可确信程序集的内容在生成后未被更改过。但请注意,强名称中或强名称本身并不暗含信任级别,例如由数字签名和支持证书提供的信任。

在引用具有强名称的程序集时,您应该能够从中受益,例如版本控制和命名保护。如果此具有强名称的程序集以后引用了具有简单名称的程序集(后者没有这些好处),则您将失去使用具有强名称的程序集所带来的好处,并依旧会产生 DLL 冲突。因此,具有强名称的程序集只能引用其他具有强名称的程序集。

 

只要找到.pulickey={......}然后删除它就行了,如果不去除强名称而修改程序集编译就通不过的。再就是修改有效期那一段IL汇编代码,这一工作需要对.net的IL汇编代码有一定程度的了解才行。修改完成后保存。

     最后通过ilasm进行编译,打开Visual Studio 2005 命令提示,输入如下命令行:ilasm /dll /res:C:\s\SpreadsheetGear.res C:\s\SpreadsheetGear.il,回车后会在C:\S下生成一个SpreadsheetGear.dll,这个就是爆破后的程序集。测试达到预期效果,有效期的限制成功破解。

 

     新方法:

      1.去除非.pulickey={.....}

      2.修改.assembly SpreadsheetGear.ver 3:1:1:0, 注:最后一位为0
      3.去除检查GetPublicKeyToken部分

 

posted on 2008-07-29 17:06  绝地逢生  阅读(1647)  评论(4)    收藏  举报