维护旧版本项目的一些方法
今天碰到一个比较棘手的问题,一个做了2年多的项目上反映了一个问题,问题比较简单,但是涉及改动的dll引用的dll非常多,而且项目上的版本已经很旧了,这一处的改动会影响到几乎所有的dll的更新。单独更新这个dll是不可能了,也不能做完面的版本升级(公司的规定,可能升级是要花钱的,呵呵),而且vss中也清过了,没有留当时的代码。如果dll也能像asp页面一样直接修改,保存后就运行就好了。
查了下资料,发现两种方法:(1)使用ildasm和ilasm两个自带的工具,加上IL(2)使用.NET Reflector插件FileDisassembler还原代码,重新编译。
首先说一下第一种方法,使用ildasm打开项目上发过来的dll,在file下有dump菜单(如果是中文版就是文件下的转储菜单),弹出新窗口确定即可,生成后缀为.il的文件。下面就需要懂一点il语言,以前一直认为学习这个il语言没什么用,今天只能现学一把,因为问题比较小,4、5行就搞定了。保存之后,使用ilasm重新编译这个il文件。使用命令如ilasm.exe GSP_WorkflowEngine.il /dll /output=GSP_WorkflowEngine.dll,就OK了。不过在写il的时候还是碰到了很多问题,一直编译出错,还是il没有写好,看来学习il还是很多好处的。
第二种就是使用.NET Reflector插件FileDisassembler,先把这个插件下好挂上,菜单中就会出现FileDisassembler这个菜单项,打开要反编译的dll,就可以生成出源码,即使用了混淆器,要修改的问题也很容易找到,毕竟我们对自己的代码还是很熟悉的。重新建解决方案,添加需要引用的dll,重新编译就OK了。
写在最后,这两种方法本质上原理是一致的,我个人觉得,如果对il掌握的非常好的话,第一种方法是非常爽的,即使是在项目现场,对一些小问题修改都是相当轻易的。由此还想到.net的安全性,对于非强命名的dll来说,这种il级别的修改都是有效的,但对于软件的保护是相当不利的,我们是很容易从il中找到验证正版的代码信息,直接去掉,重新编译就破解了;对于入侵者来说,也是很容易修改系统上.net程序的运行方式的。