某个.net程序,发信只能使用本地的smtp发送,而且没有smtp验证,我打算给他添加功能,让他可以任意指定发送地址和认证。

先准备好.net 发信认证的方法。使用 Asp.Net Forums之邮件发送 http://blog.joycode.com/dotey/archive/2005/01/15/43113.aspx 。

使用Reflector http://www.aisto.com/roeder/dotnet 先找好破解的位置,Reflector是非常优秀的.net反编译软件。找对dll和位置后,假设为a.dll,使用.net SDK自带的ildasm反编译成IL,再使用vs.net新建project写好要替换掉的内容,然后再ildasm,把hack后的il代码替换过去,vs.net2003自带的ilasm编译生成hack后的dll。

接着查找整个硬盘,发现a.dll只在一个地方有,于是替换,然后再运行,无效。为了测试问题所在,修改hack dll,做一个显而易见的修改,再运行,说明新的dll没有生效。

于是去控制面板管理工具的.Net 1.1配置的gac里查找,果然也在gac里。gac其实就是c:\winnt\assembly\gac里的东西,虽然a.dll在里面,但是windows居然搜索不到,用资源管理器也无法看到。

于是准备在gac里删除这个a.dll,提示这个a.dll被其他程序使用。There was an error removing a.dll。assembly is required by one or more applications。关闭了所有相关程序还是没有办法删除,找资料,手动cmd.exe到c:\winnt\assembly\gac\a\1.0.0.0xxxx\a.dll,改名。刷新gac,没了。

然后在gac加入破解后的a.dll。跑程序,出错,提示找不到a.dll,原来a.dll被strong name了,strong name是为了解决dll hell和文件完整性的,完蛋了。试着直接放到原先a.dll在gac里的目录,居然成功。看来这个只是为了解决dll hell的,.net的strong name可以使得不同的公司可以开发相同文件名的dll,版本号一样也没关系,因为public key不会一样。对.net的gac来说,判定一个dll需要根据3个东西,一个是文件名,一个是版本号,一个是public key,所以gac真实目录是\filename\version_number_public_key\filename.dll。虽然这个程序使用了strong name,但是只负责找到他,并没有对完整性进行检查,不知道原因,不管怎么样,目的是达到了。

相关链接:

ILDASM is Your New Best Friend http://msdn.microsoft.com/msdnmag/issues/01/05/bugslayer/print.asp

FlyTreeView for ASP.NET 3.2 破解攻略
http://blog.csdn.net/mingchao123/archive/2004/10/15/138233.aspx