动态链接库编译与反编译的研究与实现
2019-06-29张果
张果
摘 要:本文通过编写简单的可执行程序,引用两个不同语言编写的DLL。然后再进行反编译DLL,在可执行文件中重新引用,实现DLL反编译成功被程序多次引用的效果。
关键词:可执行程序;动态链接库;编译;反编译
中图分类号:TP312 文献标识码:A 文章编号:1671-2064(2019)11-0019-02
可执行程序,是可自行解压缩文件的集合,包括安装的所有文件。运行可执行文件,可将软件的所有文件释放到硬盘上,完成修改注册表,修改系统设置、创建快捷方式等工作。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库(DLL文件),放置于系统中。
DLL中存放各类程序的函数(子过程)实现过程,当程序需要调用函数时需要先载入DLL,取得函数的地址,最后相应的DLL会被调用。使用DLL的好处是程序不需要在运行之初加载所有代码,且通过使用DLL,程序可实现模块化,由相对独立的组件组成。DLL有助于促进模块式程序的開发,可开发进行模块式体系结构的程序,因此在重复使用DLL时,研究将DLL如何进行反编译重复利用显得特别重要。
本文基于ASP.NET技术,.NET Framework框架,Visual studio 2010 集成环境,C#和Visual Basic语言进行开发。
1 动态链接库(DLL)实现
文中C#类实现的DLL功能为图像色彩反转方法和获取系统当前时间方法,Visual Basic实现的是将输入的原字符串进行逆序的方法和将原字符串进行大写转换的方法。
1.1 DLL开发过程
本地打开Visual studio 2010,选择新建项目,选择Visual C#,选择.NET Framework 4.0框架,选择类库,生成相应的解决方案,打开类,编写该DLL所要实现的功能。因本文着重实现如何编写DLL,如何在应用程序中引用DLL,然后反编译DLL,验证再次被应用程序引用是否成功,因此,DLL功能及应用程序功能相对简单。
1.2 生成DLL
DLL功能编写完成后,选择Visual Studio工具栏中的生成,选择其下的生成解决方案,在该解决方案的Debug目录下可以找到生成的DLL,该DLL可被应用程序直接引用。
2 可执行程序实现
可执行程序引用DLL的方法,将系统时间、图像色彩反转、字符串逆序通过界面展示出来。
2.1 开发过程
本地打开Visual Studio 2010,新建项目,选择Visual C#语言,选择Windows窗体应用程序,.NET Framework 4.0框架,确定,解决方案建立成功,引用之前已生成的两个DLL。
新建Form1,Form2两个设计窗口,界面化实现两个dll功能,在后台cs代码中引用命名空间using CsharpDll;using VBasicDll。界面如图1所示。
运行可执行程序,界面能够正确显示当前系统时间、图片颜色反转及字符串逆序的功能,界面如图2所示。
2.2 程序发布
应用程序通运行测试功能正确显示,将该应用程序发布为可执行的应用程序,安装在个人计算机上。应用程序发布主要分以下几个步骤:
(1)在VS中选择“新建项目”(“其他项目类型”(“Visual Studio Installer”(“安装项目”。(2)确定后,添加要发布的应用程序、设置应用程序的安装时所必备的系统环境、设置程序安装时的路径及其他信息。(3)应用程序发布基本设置完成之后,选择“生成”(“生成解决方案”,若成功,则显示生成成功,成功生成解决方案后在debug文件夹中有需要的安装包及系统所必备的环境下载,到此应用程序发布完成。
3 DLL反编译
应用程序引用的DLL,经过一段时间后,不能清晰记忆该DLL中所包含的方法,因此需要将DLL进行反编译。本文针对.NET程序且程序没有使用混淆技术的情况下,使用Reflector将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。
3.1 反编译代码实现
Reflector工具安装完成后,选择我们反编译后的语言为C#,.NET框架为.NET 4.0。
在File菜单下选择“open assembley”,选择需要反编译的DLL,加载后显示DLL中命名空间、类及方法的层级关系,也可直接双击打开查看方法。选中要导出的DLL,选择“Export Source Code”,将源代码导出到默认的目录,若导出成功,则会有相应的提示。
反编译成功后,打开生成的项目文件,可以看到不管是C#语言还是Visual Basic语言,都按照Reflector所配置的导出语言C#生成。将导出的项目文件使用Visual Studio 2010打开,C#语言反编译前后与源码一样,Visual Basic语言反编译后按照C#语言语义进行了重组。Visual Basic反编译前后代码对照如图3所示。
3.2 可执行程序重引用反编译DLL
将DLL反编译后的类文件编辑再重新生成DLL,在可执行程序中重引用后,运行可执行程序,可得到正确的效果,在反编译后的DLL中,加入了显示当天星期的方法和将字符转换为大写的方法。界面如图4所示。
至此,编译DLL,引用DLL,反编译DLL及被重新引用这一过程全部实现,并得到验证,可执行程序运行后显示正确结果。
4 结语
本文以.NET Framework为框架,以Visual Studio2010为开发环境,分别采用Visual c#和Visual Basic为开发语言。编写简单的类库生成DLL,编写简单的可执行程序,该可执行程序中调用DLL,再通过Reflector工具反编译DLL,反编译的DLL生成的源码使用Visual Studio2010打开重新编辑,生成相应的DLL,在可执行程序中再次引用的时候,该反编译后的DLL能被正确引用,得到相应的结果。
本文验证了Reflector工具能够反编译DLL,且能再次被可执行应用程序正确引用,但该Reflector工具只针对.NET Framework框架开发的DLL,对其他框架的类及DLL不适用。后续查找及研究实现一款能对其他框架开发的DLL反编译工具,并学习其他框架开发工具对反编译的DLL进行验证。
参考文献
[1] Christian Nagel,Jay Glynn,Morgan Skinner.C#高级编程第八版[M].北京:清华大学出版社,2013.
[2] Benjamin Perkins,Jacob Vibe Hammer.深入理解C#第三版[M].北京:人民邮电出版社,2014.
[3] Daniel M.Solis.图灵程序设计丛书:C#图解教程第四版[M].北京:人民邮电出版社,2013.