通常,基于asp.net的web项目在发布时会对业务逻辑代码打包成dll文件,而前端aspx页面如果没有必要一般不会编译到dll中去,因为一旦编译后将无法直接修改前端页面。但是,在有些情况下,比如该web项目并非普通网站项目,或者项目有专门的后续维护或升级,或者是出于软件保护的目的,程序员可能会将aspx前端页面一起编译打包到dll里面。这样,想要查看前端页面的设计或源码将变得非常困难。尽管web系统在运行起来后,通过对最终页面的分析也可以知晓原始设计的一二,但不能与后台代码形成对应关系,并且这一过程也是非常复杂困难的。
对于后台逻辑,如果没有经过加密混淆,可以直接使用RF进行查看。若是经过了加密混淆,需要有针对性的进行反加密反混淆。对于诸如常见的Xenocode、Dotfuscator、Reactor等加密工具,我们已经有了比较成熟的反混淆反编译方案,国内外关于这些工具的分析文章也可以找到很多。但是对于编译过的aspx页面,如何进行aspx反编译和aspx还原,在国内外的相关研究都非常有限,到目前为止我们没有发现有关aspx还原的文章。经过数月的研究,我们找到了针对aspx页面的还原方法,我们编写了专门的还原工具(AspxDecode),经过测试效果很好。
如果前端aspx页面经过编译,页面所有内容和控件将被编译和打包进dll文件中,然后在执行时再生成具体的HTML代码呈现到客户端。通常如果需要编译前端页面时,在VS的编译选项中需去除“允许更新些预编译站点”这一选项,经过编译后的前端aspx页面中往往会存在着这样的提示:“这是预编译工具生成的标记文件,不应被删除!”,如果是英文版本编译的,则是“This is a marker file generated by the precompilation tool, and should not be deleted!”。正如提示信息所言,现在这些aspx文件仅起到一个标记的作用,里面的内容已经与程序的逻辑没有任何关联,您也可以直接修改里面的内容(当然最终不会被显示出来)。真正的页面信息已经被编译进了dll文件中,诸如App_Web_l1k-yp6d.dll之类。以RF工具查看这个文件就可以看到被编译了的页面。
通过分析编译后的aspx页面代码,可以发现,经过编译后的aspx页面以新的实例类的形式存在,并且该类作为子类继承自其后台页面的类。页面中的控件和代码在该类中,通过函数调用的方式逐一生成。间隙中穿插着静态字符串的生成(以LiteralControl的方式生成或是直接通过Write方法写出),另外还有一部分字符串是直接内嵌于编译生成的dll文件中,通过文件指针定位并以偏移量和长度读出,这些字符串也即前台aspx页面的组成部分,而动态生成的部分则主要是服务器控件以及动态脚本或参数代码。但是要注意的是,这些控件的生成并非顺序化的,而是采用堆栈的方式入栈排列好顺序,再一一呈现的,有时会对入栈的控件进行属性的穿插绑定(比如Repeater控件)。在这些代码中,只需分析单一控件的形成代码,其属性往往是直接设定的,可以通过模式匹配来还原,其事件响应则是常规的绑定代码,也可在设定位置还原即可。但要注意的是,必须以程序的真实执行流程来对aspx页面代码进行分析和aspx反编译,否则得到的页面控件顺序将出现错误。
经过测试,我们编写的AspxDecode工具能将页面源代码完整还原出来,对于web控件、Html控件、动态脚本、控件属性、事情绑定等均能处理,并且很好的兼容处理了模板页面、用户自定义控件、第三方控件(如ComponentArt、Fckeditor)等控件的加载与还原。
(注:本文为 [风影网络工作室] 原创文章,未经书面许可,严禁转载和复制本站的任何信息,违者必究)