关键字:.net,程序集,破解,crack,StrongKey,强名称,签名,公钥,私钥,DevExpress,DXperience

  看来是时候要专门写一篇文章来说明一下如何使用不带私钥的程序集了。最近发布了 DevExpress.NET.v3 for 2003汉化包DXperience 6.2.4-2005破解研究 这两篇文章中,都间接地提到了“使用了不带私钥的程序集”,引起了一些网友的关注。

  如果阁下对本文中某些术语不了解,可参考相应的网页:
  ◆ 具有强名称的程序集
  ◆ 如何:对程序集进行签名 (Visual Studio) 
  ◆ 如何:延迟为程序集签名 (Visual Studio)
  ◆ 全局程序集缓存
  ◆ 全局程序集缓存工具 (Gacutil.exe) 
  ◆ 强名称工具 (Sn.exe)

  不带私钥的程序集的由来:
  ◆ 在项目中使用了延迟签名选项 [assembly: AssemblyDelaySign(true)],项目生成的文件不具有私钥;
  ◆ 由 ildasm 工具反汇编生成的 .IL 文件,再由 ilasm 编译后,生成的文件不具有私钥;
  ◆ 由其它汉化工具,如 Passolo、Visual Localize等,汉化后成生的本地资源文件程序集不具有私钥;
  ◆ 使用了由 sn -e 选项提取出来的公钥文件;
  ◆ 其它途径……

  在 具有强名称的程序集 网页中,我们可以看到以下描述:

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

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

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

      好了。看到以上信息,我们似乎对此应该止步了。但 强名称工具 (Sn.exe) 中下面的话更让我们急流勇进:

    -Vr assembly [userlist] [infile]

    注册 assembly 以跳过验证。或者,可以指定用逗号分隔的用户名列表。如果指定 infile,则验证保持启用,但 infile 中的公钥将用于验证操作。可以 *, strongname 的形式指定程序集,以注册所有具有指定强名称的程序集。 Strongname 应指定为十六进制数字的字符串以表示标记形式的公钥。参见 -t-T 选项以显示公钥标记。

    Caution note警告

    仅在开发期间使用此选项。将程序集添加到跳过验证列表会产生安全漏洞。如果将某程序集添加到跳过验证列表中,则恶意的程序集可以通过使用该程序集的完全限定程序集名称来隐藏身份,完全限定程序集名称由程序集名称、版本、区域性和公钥标记组成。这使恶意程序集也可以跳过验证。

      看到没?sn -Vr 就是我们的突破口。即然有了眉目,OK,行动吧!!!

      接着 DXperience 6.2.4-2005破解研究 一文继续前进。使用 ilasm 编译后(注意:不要使用 /key 参数),程序集不具有私钥,一般情况下是无法使用的。要使用,就必须在强名称工具中注册为跳过验证。

      以下为详细的步骤:
      1、打开 SDK 命令提示 窗口,即“开始菜单—程序—Microsoft Visual Studio 2005—Visual Studio Tools—Visual Studio 2005 命令提示”;
      2、输入命令“sn -Vr *”,为所有程序集注册了跳过验证;
      3、输入命令“gacutil /i <assemblyFile> /f”,将程序集安装到全局程序集缓存;
      4、输入命令“sn -Vu *”,注销所有程序集,不跳过验证。

      到此,你的程序即已安装到全局程序集缓存中,其它项目便可以使用了,即使你注销了所有的跳过验证,重新启动计算机,该程序集依然有效。你说,这样一来 DXperience 是不是就被“破解”了?