今天做了一个.Net Core Winform程序的反编译工作,由于代码量较大,工作量也有些大,起初我使用ilspy反编译,但对于窗体的编译不够理想,它把前端设计代码(from.Designer.cs)和后置代码合并了,并且部分窗体打不开;
其优点也很突出,就是代码反编译的效果比较好,更接近源代码。
于是再次找到dnSpy反编译,查看其两者的差异。
dySpy反编译窗体,会将Designer.cs文件和后置代码文件分开,这正是我想要的。
并且dnSpy的反编译有form.resources文件,我们需要把这个文件转换为resx文件,这里需要使用Resgen工具,但我发现,在现有的vs中,比如vs2019,它是不需要手动把resources文件转换为resx文件的,当双击窗体文件,会自动生成resx文件。
如果没有生成,请参考官方Resgen的用法,手动操作。只是官方只介绍到了resources到resx的转换,不能批量操作。实现批量操作,需用一段批处理脚本,保存在项目某个目录下,和大量的窗体文件在同一目录,保存为一个bat文件(Converter.bat),比如:
@echo off &setlocal enabledelayedexpansion
rem echo 当前目录:%~dp0
set DestPath=%~dp0
rem 查找的扩展名
set DestExt=*.resources
rem 不提示删除之前生成的问题,不存在也不提示
del /Q /F /A list.csv 2>nul
rem 循环文件目录里所有的文件(包括子文件夹里的文件)
for /f "usebackq delims=" %%i in (`dir /b/a-d/s "%DestPath%\%DestExt%"`) do (
rem 输出文件路径及文件名到list.csv文件里
rem echo %%i,%%~nxi>>list.csv
ResGen.exe %%i %%~ni.resx
)
%%~ni 代表文件名 %%~xi代表文件扩展名 %%~nxi 代表文件名和扩展名 |
引用自:利用Bat批处理文件将.resources转换为.resx文件_批量resources转换resx 具_大可山人的博客-CSDN博客
然后在VS中,点击工具->命令行->开发者命令提示
在命令窗口中cd到bat文件所在的目录(也是窗体文件所在的目录)
然后直接输入bat文件,Converter.bat,回车执行!
看到提示:“正在写入资源文件... 完成。”,即OK
资源还原后,还需要继续反编译代码,dnSpy的反编译代码,看起来似乎过于标准!
比如:
左边是dnSpy,右边是ilSpy。可读性来看,自然是ilSpy的更舒服。且dnSpy有部分页面还原的会有代码错乱,比如class的代码结束了,后边又插出来一段其他的代码,神鬼也编译不了。
最终,我想尽量保留源代码的样子,而又要恢复窗体的设计代码及后置代码。所以,采用dnSpy和ilSpy配合使用,双剑合璧!
重点:
如果你对恢复窗体的内容比较熟悉的话,单用ilSpy也够了,在XXX.Designer.cs窗体设计代码中,以下是默认的内容。ilSpy虽然把前后代码合并,但不影响手动拆分出来,控件的布局和事件绑定等内容都在方法InitializeComponent()中,再往下放置的是控件类,比如Lable、Button等等
其他的代码,都是后置代码!!!如果你理解这些,我想不用多说了。U Can Do It!
最后:
反编译的过程中,可能还会有其他问题,比如资源没弄完整、类库版本等,类库版本需要注意下,比如.net core版本的,反编译后vs打开,类库的csproj文件中记载了以下...很多的东西,大致包含了,类库的版本信息、类库中存在的类、引用了哪些其它类库.....
.net core中哪用这么多内容!改为以下就行了,VS中重新加载下完事儿
参考: