最新消息:

【.NET小科普之一】数据库信息在哪儿(Reflector与ILSpy反编译工具的使用)

技术 admin 2391浏览 0评论

0x00 前言


最近有人问到ASP.NET里面的数据库连接信息一般去哪里找。

这里我简单总结一下我遇到过的一些情况,和大家分享一些简单的方法去找ASP.NET的数据库连接信息或数据库文件。

 

0x01 寻找方式


先说一般的数据库连接信息。

第一种

一般在web.config,如某套OA就是将连接字符串存放在该文件内,如下图:

201403031620105030

第二种

有的ASP.NET程序功能较多,会自定义其它config文件,所以可能会存在多个config,而数据库连接信息就存放在其它config文件中,比如逐浪CMS(你们懂的)就有多个config文件,如下图:

201403031620108979

但数据库相关连接信息存放在ConfigConnectionStrings.config里:

201403031620113490

第三种

也有更标新立异的压根不存放在config中,比如信游(你们也懂的)的免费版,也有一个config文件夹,里面的文件大致如下:

201403031620121754

数据库连接信息存放在server.apb中:

201403031620134557

第四种

有一些比较奇葩的,直接写在代码中。这种情况下如果没有源码cs文件,就只能反编译bin目录下的dll文件了,必须扩展开来说,这是后话了。

数据库文件

那如果是access或者SQLite的情况又会有什么变化呢?他们的数据库会存放在什么位置?

现在大多CMS为了避免直接下载MDB或相关格式的问题,在.NET中采取了其它手段去防下载,比如50cms将SQLite的数据库存放在根目录的App_Data文件夹中:

201403031620147284

2013就是50cms的数据库:

201403031620141018

另外还有直接将access数据库存放在App_Code文件夹中的,保存为.cs后缀,由于App_Code和App_Data是无法直接通过 post和get来直接访问的(你有任意文件下载的话谁都拦不住你),所以在一定程度上保证了网站的安全性,比如下面的2013.cs实际就是网站的数据 库:

201403031620159032

当然了,上面说的也是较为常见的,凡事总会有奇葩的,结合实际情况以不变应万变吧!

总结一下,数据库或者数据库相关信息会在哪里:

<code>1. web.config 
2. 其它config文件 
3. 某些有特征的文件夹下的某个文件(如上面信游的那个) 
4. 源码中,去dll翻翻吧 
5. App_Code或App_Data 
6. 其它各种奇葩情况…… 
</code>

下面重点说说第四种寻找方式。

0x02 反编译.NET程序


1 .NET的程序是怎样的?

我们这说的.NET不是什么www.caoliu.net,都指的是微软的开发语言。下文对.NET的分析主要是我个人的总结,并非官方语言。

那常见的.NET程序其简单构成是咋样的呢?

第一种,我们常见的桌面应用,可以是winform和console类型,比如常见的winform应用其可编译的项目源文件结构大概如下(以VS2008为例):

201403031620167241

Bin目录是编译后的两种类型的可执行文件:

201403031620169933

Debug编译后的程序会带有一些相关的调试信息,体积会大一点,release是发布版本的相对没带有那么多调试信息,体积会小一些。

第二种,就是我们要重点熟知的asp.net应用程序,一个很简单的asp.net应用程序的源码目录结构如下:

201403031620166703

一般来说,我们的关注点更多不在aspx文件中,因为VS2005之后都主要是将相关的代码分离到了cs文件中。所以我们更多要关注的是.cs后缀 的文件,但是在发布版的网站中,是不包含cs文件的,此时我们要关注的就是bin目录了,bin目录中有相关的dll。比如上面的小网站的bin目录只有 一个dll文件:

201403031620179143

2. 用什么反编译.NET的程序

目前相对比较有名的.NET反编译程序主要有两款:

<code>Reflector
ILSpy
</code>

Reflector是一个比较早出现而且功能也比较强大的反编译软件(在这略微提醒一下,是反编译不是反汇编),支持自定义插件和代码调试的功能, 支持将源码反编译为IL语言、VB.NET、C#、Delphi.NET、F#和MC++等并可选择.NET框架的相关版本(不同版本有不同的语言特 性),目前最新版已经是8.0,7.3版的截图如下:

201403031620182772

选定某个dll后,可以在File菜单中选择导出源码:

201403031620191985

ILSpy是一个开源且免费的反编译程序,主要功能还是反编译,不支持插件,可以翻译成的语言主要是C#、VB.NET和IL。最新版截图如下:

201403031620204708

选中某个dll后,可以在File菜单中导出源码:

201403031620217462

3. 反编译的简单实例

在这以简单免费的ILSPY做演示。

先来一个找源码中数据库连接信息的例子,示例是用我们上面提到的一个小网站。

先打开ILSpy,拖动相关的dll到左边的边栏中:

201403031620216128

点击+号,展开相关的信息:

201403031620224676

这里没有做混淆(这是后后后话了),所以反编译出来的类比较容易从名词中看出其作用。
既然要找数据库连接信息,那要先考虑一点,什么时候会进行数据库的连接?很简单!登录的时候吗,所以一般来说,都是先围绕登录点相关的类和函数进行。点击上面的login:

201403031620227956

此时右边的分栏可以看到该login类的源码了。里面主要有两个方法:Page_Load和Button1_Click。其中Page_Load是页面加载时一定会调用的方法,Button1_Click是按钮点击事件的方法(简单说就是点击登录按钮时调用的方法)。
点击左边的+号展开两个方法,会发现Page_Load是空的,Button1_Click是包含有源代码的:

201403031620234763

所以只能从按钮点击那下手了。

201403031620242987

看上图标蓝色的地方,很明显就是数据库连接信息,把数据库连接信息写入到源码中,不是很利于后期的维护。

另外一篇例子,可以参考我发布在zone里的

http://zone.wooyun.org/content/3469

寻找正方教务系统数据库连接解密方法的一篇文章。

再展示下,如果没混淆和加密的.NET程序,我们可以做到什么。比如下面这个大牛写的程序:

201403031620261207

确定就退出了,只要稍加修改马上可以去掉相关的代码,任意用了:

201403031620277516

最后就不总结什么了,祝大家0day多多!

浊文一篇为博大家一笑,请勿较真……第一次来提交,写得不好请指正。

 

Reflector 已经out了,试试ILSpy

Reflector是.NET开发中必备的反编译工具。即使没有用在反编译领域,也常常用它来检查程序集的命名规范,命名空间是否合理,组织类型的方法是否需要改善。举例说明,它有一个可以查看程序集完整名称的功能,请看下图

201109080907278283

这里的Name,是标识一个程序集的完整标识,当GAC中存在程序集的多个版本时,这个名称是唯一的识别名称。

但是,Reflector很早就转向收费软件了,需要购买许可才可以使用。对于耻于用盗版的朋友,通常会放弃。有朋友说,Reflector并没有增加更霸道的功能,却转向收费,令人费解。再看看市场上的.NET反编译软件,被Reflector击溃。

一提到Reflector,说到.NET反编译,Reflector常常是默认的首选工具。

这 里提起一下Visual Studio的垄断。Visual Studio占据了.NET开发工具系列的绝对垄断地位。在.NET 1.x时代,还有C# Builder,Delphi.NET来使用和体验,一争高低。可是到后来,.NET Framwork更新频繁,动辙在编译器级别,和语言层面做更新,这令第三方的软件开发工具商非常苦恼,这些工具也从市场上慢慢消声匿迹,几乎没有第三方 的软件开发商愿意开发.NET开发工具与Visual Studio一争高低。没有了竞争,进步的速度要慢很多。Visual Studio 2008差不多就是Visual Studio 2005+SP的替代品,在工具层面,Visual Studio 2005 SP1加上了Web Application,就是Visual Studio 2008。虽然说语言层面是进步了很多,.NET 3.0,.NET 3.5,LINQ, 框架方法增加:WCF,WPF,WF,但是,我一直认识从2005到2008,它在工具层面没有什么进步。

SharpDevelop 是除Visual Studio外,另一个可选择的唯一的.NET开放工具,并且它是开源的。它提供的功能也相当不错,几乎就是在重写Visual Studio。最新的版本中,直接增加了对Visual Studio的解决方安案文件和项目文件的支持。ILSpy是SharpDevelop小组的反编译工具,也是开放源代码的,今天来介绍一下它的调试器和 反编译器,以让那个收费的,却没有增加霸道功能的Reflector out。

201109080907276953

ILSpy的界面与Reflector相似,左边以树型控件显示程序集和它的类型,右边是对应的源代码。基础的反编译功能,与Reflector相比,丝毫不差,甚至有时候用Reflector无法反编译(因为加密)的程序集,用ILSpy可以反编译。

Decompiler 反编译器

基础的类型反编译功能都具备,现在只支持把源代码反编译为C#和IL语言,不支持VB。

201109080907289495

当需要找的程序集是.NET框架时,可以直接从菜单File—Open from GAC中打开需要查看源码的程序集。

201109080907306105

代码保存功能也做得不错,当点击一个类型时,选择File->Save Code会反编译当前的类型并保存到指定的文件中,当选择程序集时,Save Code保存为一个项目(csproj)文件,并且把它所有的类型加到这个项目中。

 

Debugger 调试器

这里要说的调试器,不是指Visual Studio的源码级别的调试器,而是指程序集的调试器。Reflector有个Addin,可以直接附加在Visual Studio中,调试第三方的类型库,而不需要把第三方的类型库反编译后,以源码的形式添加到项目中。

ILSpy也有这个功能,直接对第三方的程序集进行调试,有两种选项

如果第三方类型库是可执行程序(EXE),可以用Debug an executable来启动这个程序。

如果第三方类型库是程序集(DLL),可以用Attach to running application来附加,以启动程序集的调试。

201109080907319891

从上面两张图中已经可以看出它的用法,和调试源代码一样。在需要监视变量值的方法的地方,设置断点,当程序运行到此时,就可以通过监视窗体来观察变量的值。从ILSpy的状态栏中看出,上面的第一张图是正处于调试状态,第二张图,是准备就绪,可以进行调试。

这两者的区别是,Attach to a running application调试时,如果代码经过编译器优化,则监视器会无法得到它的值。

201109080907328528

如图所示,无法显示正在调试的变量num的值,因为代码已经经过优化。官方推荐的方式是Debug an executable
与在Visual Studio中调试.NET源代码一样,你可以Step into,Step over,continue,同时状态栏会显示就绪(stand by),运行中(running),正在调试(debugging)。

201109080907331136

除了调试程序集的C#/VB形式的代码之外,也可以以IL代码形式调试,如下图所示

201109080907333993

由此看来,这还是相当不错的调试IL代码的工具。工具可以促进学习的效果,学习领悟之后,又可以推进工具的发展,这就是知识的无止境的发展。

ILSpy的debugger是以插件形式存在的,请确保包含ILSpy.Debugger的Plugin。

201109080907349566

根据我们的理解,调试.NET程序集一定需要PDB文件才可以。然而ILSpy却没有产生PDB文件(no PDB files are generated),而且它不可以调试ASP.NET Web application和Web 服务。
这其中的原理,不甚明白。compiler/debugger一直是我喜爱的技术主题,但学识肤浅,无法分享。

 

Reflector会检测到系统时间超过了它预设的时间,如果不升级,它会主动删除自己,从你的电脑中out掉。如果你对此很烦恼,那就让它out吧,你可以有另一个选择,试试ILSpy,或许会带来一丝的惊喜。

转载请注明:jinglingshu的博客 » 【.NET小科普之一】数据库信息在哪儿(Reflector与ILSpy反编译工具的使用)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址