dnSpy化腐朽为神奇
项目没源码怎办
刚到一个需求,对旧版本景区系统升级实名制,跟现场工程和研发部老员工沟通得知,该项目是当初直接使用的标准版本1.x,由于当初研发人员的失误,未对当时版本存档,现在版本已经迭代到2.x。
- 解决方案有两个
- 寻找距离最近的其他有源码项目版本进行修改,覆盖原有项目文件
- 采用反编译原有项目文件,修改后再编译替换原有项目文件
经过反复沟通后,找到一份版本最相近项目源码,又要来现场工程使用的原项目文件,并对原项目文件进行反编译,比较两个版本之间的差异。
最终确认相关需求在旧标准版种已经集成了,只是在客户端定制化开发的时候移除了这部分代码,按照现在得情况,选择第二个解决方案更稳妥。
dnSpy反编译神器
dnSpy
- dnSpy 由0xd04d 开发的.NET程序集调试神器。可以在没有源码的情况下反编译程序集进行调试和修改。主要功能有
- 调试.NET和Unity程序集
- 编辑.NET和Unity程序集
- 亮白和暗黑两个主题色
版本
- dnSpy需要根据程序集选择对应的版本
- 程序64位和32位
- net472和netcore
界面
界面样子跟Visual Studio类似,主题风格好像也是自动读取Visual Studio的设置
加载程序集
- 可以将程序集拖入dnSpy窗口左侧程序集资源管理器框内,它自动加载相关依赖程序集
- 可以看到程序集内部的命名空间以及资源文件
- 根据命名空间找到需要修改的类,这里业务是
- 找到业务所在的方法
dnSpy反编译后生成的代码可能跟源码有些不一致,有些类拓展方法反编译后会生成原始代码。
例如,下图中Linq拓展方法会被反编译成Linq原始代码
修改程序集
- 找到要修改的地方,然后在类中右键“
编辑方法 (C#)
”:
参照相近版本源码的代码,可以看到只需要复制对应的代码,修改下变量名和提示语即可
这里赞一下dnSpy竟然连智能感知提示都有,这无疑是锦上添花
- 修改完毕后,点击下方编译
- 如果业务比较复杂的可以编译后调试下新功能
- 附加到进程,我打开的是64位dnSpy,只能找到64位的程序,
在代码中设置断点就可以命中了,过程跟Visual Studio一样
保存程序集
- 点击
文件
->保存模块
,保存的程序集名字最好加以区分下加个_crack后缀
先备份原先程序集,用修改过的程序集替换,启动程序即可
思考
这不是我第一次使用dnSpy,但是这是第一次在项目上用这种方式改需求的,出现这种源码遗失的事情说明在项目管理上存在漏洞,不仅仅是源代码管理,还有对项目立项、需求分析、技术方案、产品交付、产品迭代、版本控制这一系列过程中没有形成一套标准的操作流程,导致项目文档遗失,无法追踪溯源。此举无奈!!!
dnSpy还可以干很多其他的事,例如,此处省略N字。可谓真香!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 二博!
评论