.
.
.net逆向学习总结001(3)
本节学习目的:逆向000节得到的三个程序集
学习成果:得到三个可编译,可运行的VB.NET工程
HelloWorld_VB_Console, HelloWorld_Win_Reverse, Hello _Web_Reverse
使用到的工具:VS2008,Reflector,PEID,IIS 5.x or IIS 6.x
学习难度:★★☆☆☆
本节主要目标是逆向000节的HelloWorld_VB_WEB.dll,并根据网站相应的页面文件,重新建立起整个网站项目Hello_Web_Reverse,这个名称是随意的,各位看官喜欢用什么就用什么.本节使用到的原理主要就是,使用Reflector反编译程序集获得源码,这是最根本的东西,少了它,只能靠自己的理解去还原网站了,只是这样子逆向的难度可能就大大的增加了,还好我们有强大的Reflector这个神兵利器.
因为本教程完全是面向新手,因而有很多细节都会详细地说出来,这主要是为了避免因为在某些人眼中的简单的问题而跳过不讲,很有可能让别的初学者折腾一两天才能解决,这就太不划算了,因而如果我说话显得有些唐僧,还请各位看官见谅.
现在的网站,简单点可以认为是分前台和后台两个部分,前面也就是我们看到的页面,后台也就是负责处理前台各种请求的程序源码,当用户点击一个按钮,发出一个请求时,服务器接收到用户的请求后,根据用户请求的网页地址以及参数,动态生成一张新的网页,并返回给浏览器,这样就完成了一个请求了.MS的.NET把前面和后台分得非常非常的清楚,.NET的网站发布后,得到两类文件,一类文件后缀是aspx,另一类文件是dll.其中aspx就是前台,dll就是后台,用户看到的永远都是前台,在服务器上工作的是则是后台,用户通过前台前服务器发送请求, 服务器接收到请求后,调用相应的DLL中的函数,动态生成一张纯HTML网页发送回给浏览器,由浏览器解析网页上的HTML标签,绘制出相应的页面来.
发布方法为,
图(1)
图(2)
点击发布,即可。
以下图为我将HelloWorld_VB_WEB这个网站发布之后得到的
图(3)
图(4)
注意,在VS下调试网站时,需要.NET运动时环境的支撑,如下图所示:
图(5)
支持它运行的服务器程序如图下所示,把它关了,网页就再也打不开了.
图(6)
而如果要VS下发布网站,也就是得到上面图1,图2所示的东西,它们和开发的工程比较区别是,页面文件和源码被抽离出来,源码集中放到一个DLL里面去,页面文件aspx基本保持不变,这些页面文件就相当于模板,当用户请求时,服务器根据地址和参数,地址就是模板的编号,参数就是如何改选模板,然后调用所请求的页面文件的后台,也就是DLL里的函数,生成一张可认为是纯HTML的网页,并将它发送给用户,用户通过浏览器便可实时,动态的浏览网站的内容.
此时,如果要让发布后的网站能完全脱离VS而运行,就需要1) ASP.NET服务器, 2) IIS(Internet Information Server),然后才有可能让我们发布的网站可以直接通过浏览器来运行.
因此,如果各位同学电脑上还没有装有IIS的,那就赶紧去安装一个吧.这里IIS如何安装,我就不仔细讲了,唯一值得一讲的就是,如果没有WINDOWS安装盘,那就直接到网上下载一个IIS5.1就可以了(貌似我用的是XP,因而系统不自带有,如果是WIN7,那系统已经自带有的一个IIS了),然后在安装的过程中,安装程序会多次提示错误,此时你需要每次都填一下IIS5.1的目录,也就是你下载解压后的IIS所在的目录,千万不要以为程序运行出错就放弃了,切记!
装好了IIS之后,你还需要在.NET下面注册一下才能让IIS和.NET配合运行你的网站.
我这边网站ASP服务器用的是.NET2.0,因而可以根据下面这张图,找到
图(7)
然后,再打开你的命令行,进入上面图示的目录,如图所示:
图(8)
运行完 aspnet_regiis.exe –i这条指令后,你的ASP.NET就可以和IIS一起正常工作了。
看着上面的操作也许觉得挻繁的,实际上能耐心看完应该是会觉得很简单的。下面一步操作是,到IIS里面,把IIS支持的ASP服务器选择一下,看下图操作
图(9)
图(10)
图(11)
图(12)
在ASP.NET版本里选择好2.0.50727,点击‘确定’就OK了。
看着我们为搭建环境费了这么多功夫,但是想到后面所有的网站开发或者逆向都需要在这个基础之上来展开,心里也就安慰许多了。
环境搭建好了,下面开始正式进入逆向的操作,再重复一次,我们此节的真正目的是要将VS生成的网站,包括的程序集也就只有一个, HelloWorld_VB_WEB.dll,因此破解逆向难度应该不会太大.另外,再看下图,可以发现,也就只有一个页面文件Default.aspx而已,心想要还原出可编译可运行的工程应该是很简单的一件事情了,我们要做的仅仅是将HelloWorld_VB_WEB.dll和Default.aspx合并成一块而已.
图(13)
如果是从前面一篇篇往下看的话,那应该对下面的操作基本上都是心里有数的了,所以我就尽量少说了。
步骤一,用PEID查HelloWorld_VB_WEB.dll,显示为图所示:
图(14)
步骤二,用Reflector打开HelloWorld_VB_WEB.dll
图(15)
可以看到,展开程序集之后,有好几个节点,其实可以看到HelloWorld_VB_WEB,
HelloWorld_VB_WEB.My和HelloWorld_VB_WEB.My.Resources都是命令空间,而其中只有HelloWorld_VB_WEB这个命令空间是值得我们关注的,其它的全部都可以忽略.
步骤三:取出源码.
选择好我们的反编译语言VB.NET后,右击HelloWorld_VB_WEB这个节点,如图所示,选中Export…,这个导出接口,准备将源码导出到指定的文件夹里.
图(16)
图(17)
选择好要备份到的目录后,点击Start开始导出源码.
图(18)
图(19)
点击Close,完成导出动作.
下面我们来看一下,我们导出的是什么东东.
图(20)
上面显示的文件可以全部忽略.
图(21)
上面显示的_Default.vb很重要,因为里面包含了我们所需要的全部源代码,其它的那些由编译器自动生成的代码我们并不需要,因为在我们还原工程的过程中,编译器会再次为我们自动生成,因此我们只需要它一个就足够了.另外,为什么说它就是我们所需要的源文件呢?因为其它都是显而易见的我们不需要的文件,而且,我们需要的不仅仅是源码而已,我们还需要页面文件,我们可以看一下,我们发布的网站里,有一个页面文件Default.aspx,也是唯一的一个页面文件,这个页面文件从命名上看就知道是和_Default.vb是一家子的了,所以_Default.vb怎么说不是我们要的源码呢?呵呵呵…也就是说,一个页面文件和一个vb后缀的源文件的关系是一一对应的.
现在来总结一下,我们现在已经拥有了整个网站的唯一的一个页面文件Defaul.aspx,和相应的源文件_Default.vb.现在我们要做的就是怎么将它们合并在一起,让它们看起来和原来程序员开发的时候是完全一模一样的.
步骤四:新建一个VB.NET网站,工程名称为Hello_Web_Reverse.
图(22)
步骤五:还原UI.
这一步很简单,仅仅是把发布的网站里的页面一个个的还原到我们新建的工程里去就可以了,这里的还原,指的是自己用VS打开发布的网站后的aspx页面文件,是可以看得到它上面的所有控件的,这时,我们先CTRL+A,再来一个CTRL+C,我们就可以把要还原的页面上的所有对象都复制到剪粘板里去了,然后来到自己新建的页面文件里,选择视图设计器或者拆分,在空白页面上选中一个合适的地方,来一个CTRL+V,这样,我们就把要还原的页面整个复制到了我们的新工程里去了.注意,如果直接把两个页以添加现在项目的方式引进到我们的新工程中来,可能会出现各种各样的问题的,因为没人敢肯定现在不出一点问题,或者以后出问题了,担心起来会不会是出现在这些直接导入到工程里的页面文件上,如果我们手动一个个页面还原,那么在出现什么错误的时候,我们就有十足的把握判断它是否是由我们还原的页面产生的.
这里,我们要还原的页面只有一个,Default.aspx看名字似乎是VS自动生成的页面.由于VS已经为我们自动生成了一个Default.aspx页面文件了,因而我们不需要手动添加它进来到我们的工程里去了,我们只需要把HelloWorld_VB_WEB里的Default.aspx上面的所有控件全部复制到我们的新工程里来就可以了.
图(23)
最好用另一个VS打开要还原的页面文件,如上图所示,我们只要用CTRL+C&CTRL+V,就可以将左边要还原的页面文件还原到我们的工程中来了.
图(24)
图上用红线圈起来的按钮就是我们复制过来的,而用蓝线圈起来的页面代码,就是VS自动为我们生成的了,非常方便吧,充分利用各种合适的工具,逆向竟变得如此轻松.
如果这个时候,要还原的页面文件里还有其它的东西,如JSP脚本,各种各样的样式单,那么我们还应该手动把它们复制到文件中去,它们一般出现在页面文件的头部或者尾部,而我们要做的也仅是复制粘帖而已.待弄完之后,还要仔细检查一下,有没有什么遗漏的内容没有弄过来的,继续弄过来就可以了。这样做看起来可能有点多余,其实不危在旦夕,因为,不同版本的VS为页面文件自动生成的内容是不完全相同的,如果是手动把控件复制过来的话,它生成的内容肯定是适用于当前所开发的工程的,而直接在页面文件里复制则不会自动生成其它的东西了,这样做,或多或少都会出现一些莫名其妙的错误的。
步骤六:还原代码。
这里要还原的代码有两大类,一类是事件处理代码,一类是用户自定义代码。如果是事件处理代码,那我们首先要在新建的工程里,添加相应的事件处理代码,过程体留空,如果是用户自定义代码,在考虑到调用别的未引进的过程或函数的前提下,把它们引进到工程中来, 若出现错误,应立即查找原因并尽最大努力排除错误。
这里我们要还原的工程里,只有一个按钮btnHello,而且似乎有一个事件处理过程.
粗略看一下我们提取出来的源文件_Default.vb里的代码,如图所示:
图(25)
我们需要的最多也就三个方法Page_Load,btnHello_Click和Test.其余的由编译器自动生成,我们可以无视它们.
首先,我们要还原的是引用的程序集,这样能保证再添加别的代码到我们新建的工程的时候,不会出现类似引用错误的现象.看下面两图:
图(26)
代码由左边的红线圈住的代码移到右边去,并用蓝线圈出以显区别.
然后就是把各个事件处理过程用用户自定义过程全部搞过来了,这个工程要还原的代码非常之少,所以几乎不会出现什么错误,对于一个大点的工程来说,可能就要不断的调试以排除各种各样的错误了.还原后,如下图所示:
图(27)
注意,如果是直接把事件处理过程复制过来的话,你就会把我用粗红线圈起来的东西给弄没了的,这也就是为什么事件处理过程要单独添加,然后只把要还原的源码里相应的过程的过程体复制过来的原因所在了.而对于用户自定义过程则不会有这种过滤,直接全部复制过来就可以了.
大功告成,现在可以运行查看效果如何了.
图(28)
图(29)
一个网站,从页面到源码,我们没有编写一行代码,就这样子被我们还原了,本例子只是个小实验,对于一些中型或者大型的网站系统来说,还原的方法,过程,原理也是基本一样的,对于可能文中没有提及的问题,如果在还原的过程中遇到,我想聪明的你也是可以很快解决的,另外,请不要迷恋哥,哥只是个传说.如果您有什么更好的逆向的点子的话,可以随时跟帖说出来或者悄悄的告诉我听也可以。
由于网站的逆向比较特殊一点,我这里就将网站的工程以及生成发布版本的网站都一起发上来了吧,逆向出来的就靠各位同学自己的努力了.
网站源码
HelloWorld_VB_WEB.rar
发布网站
HelloWorld.rar
上传的附件: