项目没源码怎办

刚到一个需求,对旧版本景区系统升级实名制,跟现场工程和研发部老员工沟通得知,该项目是当初直接使用的标准版本1.x,由于当初研发人员的失误,未对当时版本存档,现在版本已经迭代到2.x。

  • 解决方案有两个
    1. 寻找距离最近的其他有源码项目版本进行修改,覆盖原有项目文件
    2. 采用反编译原有项目文件,修改后再编译替换原有项目文件

经过反复沟通后,找到一份版本最相近项目源码,又要来现场工程使用的原项目文件,并对原项目文件进行反编译,比较两个版本之间的差异。
最终确认相关需求在旧标准版种已经集成了,只是在客户端定制化开发的时候移除了这部分代码,按照现在得情况,选择第二个解决方案更稳妥。

dnSpy反编译神器

dnSpy

  • dnSpy0xd04d 开发的.NET程序集调试神器。可以在没有源码的情况下反编译程序集进行调试和修改。主要功能有
    • 调试.NET和Unity程序集
    • 编辑.NET和Unity程序集
    • 亮白和暗黑两个主题色

版本

  • dnSpy需要根据程序集选择对应的版本
    • 程序64位和32位
    • net472和netcore

dnSpy不同版本

界面

界面样子跟Visual Studio类似,主题风格好像也是自动读取Visual Studio的设置
dnSpy界面

加载程序集

  • 可以将程序集拖入dnSpy窗口左侧程序集资源管理器框内,它自动加载相关依赖程序集

程序集加载后

  • 可以看到程序集内部的命名空间以及资源文件
  • 根据命名空间找到需要修改的类,这里业务是

修改类定位

  • 找到业务所在的方法

定位业务方法

dnSpy反编译后生成的代码可能跟源码有些不一致,有些类拓展方法反编译后会生成原始代码。

相近版本源码

例如,下图中Linq拓展方法会被反编译成Linq原始代码
dnSpy反编译源码

修改程序集

  • 找到要修改的地方,然后在类中右键“编辑方法 (C#)”:

选择编辑方法

  • 参照相近版本源码的代码,可以看到只需要复制对应的代码,修改下变量名和提示语即可

  • 这里赞一下dnSpy竟然连智能感知提示都有,这无疑是锦上添花

智能感知提示

  • 修改完毕后,点击下方编译

点击编译

  • 如果业务比较复杂的可以编译后调试下新功能

调试

  • 附加到进程,我打开的是64位dnSpy,只能找到64位的程序,

附加到进程

在代码中设置断点就可以命中了,过程跟Visual Studio一样

保存程序集

  • 点击文件->保存模块,保存的程序集名字最好加以区分下加个_crack后缀

保存程序集

先备份原先程序集,用修改过的程序集替换,启动程序即可

思考

这不是我第一次使用dnSpy,但是这是第一次在项目上用这种方式改需求的,出现这种源码遗失的事情说明在项目管理上存在漏洞,不仅仅是源代码管理,还有对项目立项、需求分析、技术方案、产品交付、产品迭代、版本控制这一系列过程中没有形成一套标准的操作流程,导致项目文档遗失,无法追踪溯源。此举无奈!!!

dnSpy还可以干很多其他的事,例如,此处省略N字。可谓真香!