[common] 为什么黑客偏爱字符串数据类型呢【译】

    字符串数据类型是经常在代码里用于存储硬编码(直接做为固定内容写入了程序,类似于常量)的密钥。这些可以通用的文字密钥用于连接字符串或特定业务密钥(如优惠券代码,许可证密钥等)。事实上,绝大多数存在于开发应用内的字符串数据类型的敏感数据,让黑客颇感兴趣。 在这篇文章中,我们将介绍一些黑客们过去时常存储在字符串里敏感信息技术。

    源码下载

    在我们进一步深入探讨之前,很多东西我想绝对应该搞清楚。在这篇文章中,我将演示黑客是怎样使用工具像justdecompile,ILDASM以及Windbg这样的工具的。需要记住的是,这些工具不是用来满足黑客利益的,而是应该基于合法的用途和合理的理由。同样的工具用在坏人手中,则有可能仅仅为了自己的私利而伤害到别人。因此学习这些黑客使用的技术,以便我们能够更好地减轻这些技术带来的特定威胁,是相当重要的。

     最后,本文并非特意提到我所演示的防御机制面临的威胁。尽管如此,我还是要简单地提到一些常见的方法,可以用来防止这些威胁,然而,这里不会做一个防御机制与方案的综合讨论。


     在CLR的执行模式下,你可以用你喜欢的.NET语言编写代码,比如C #,托管的C++,VB.NET等。代码会被编译成被称为微软中间语言或IL代码的字节码。所以你的应用程序或.net组件实际上包含了中间语言的形式的代码。当你在运行时执行你的应用程序,此代码将被编译成本地CPU指令。IL代码编译成原生指令的过程称为及时编译(又名JITting)。

   

               图1:CLR执行模型

这种包含在.net组件里的中间语言代码非常复杂,它保留了所有的数据结构的信息,如类,方法,属性,参数,甚至方法编码中。这种冗长的IL代码使得逆向一个.NET组件变得相当繁琐,从而使攻击者没办法从中获取有价值的信息。

让我们开启趣味之旅

为了在一个程序集里找出硬编码的密钥,你可以在.NET代码浏览器(比如telerik的justdecompile或ilspy等)打开程序集。这些代码浏览器能让你以C #,VB.NET或者中间语言的形式打开程序集查看代码。让我们简短看一下我们这个简单的程序。代码本身是非常简单和直观,但是很好论证了这个概念。此示例应用程序中有一个称为常数的类,包含用于存储敏感商业信息的一些字符串(如下所示)。

public class Constants
    {
        public static string ConnectionString = "Data Source=HOMEPC;Initial Catalog=MyDb;User Id=SpiderMan;Password=secret;";
        public static string CouponCode50Pct = "AlphaBetaGamma50";
        public static string CouponCode75Pct = "AlphaBetaGamma75";
        public static string UserName = "SuperUser";
        public static string Password = "SuperSecretPassword";
 
        public Constants() { }
    }

现在让我们在telerik的justdecompile里打开编译后的可执行程序集。图2显示了这个程序集的视图,您可以很容易地查看这些不会轻易地透露给任何人的字符串。

 图2:在justdecompile下的.net程序集。

   通常在一个现实生活中,通过用代码浏览器(如telerik justdecompile)打开程序集来搜索字符串是一个单调乏味的工作。现在的黑客很聪明,他们会有很多工具用来找出有效的易受攻击的代码并计划下一步的攻击。其中的一个工具是中间语言的反汇编器(又名ILDASM)。就像justdecompile,Ildasm,用来反汇编一个NET程序集来查看代码,然而ILDASM就只能以中间语言的形式查看代码。

Ildasm可在两种模式下工作,一种是利用其图形用户界面;另一种就是使用控制台命令。用控制台模式是典型的黑客的偏爱,用来展开一次公开信息的攻击。图3显示了如何使用ildasm以命令的方式来查找存在于.net程序代码字符串类型。

图3:用于搜索.net程序里的字符串数据类型Ildasm.exe。

我想指出的是,程序集混淆和加密字符串不是个完美的解决办法。它能对一些业余的用户起到一些保护作用,但是在一个经验丰富的老手面前,即便有很多的防御机制,只要手头时间足够,照样能破解。

在运行的时候泄漏秘密

到目前为止,我们锁看到的都是静态的对.net程序进行攻击。在运行时候的字符串数据类型,也是很容易泄漏秘密的。这就意味着,在运行的时候,黑客可以将调试器附加检查存储在这些字符串数据类型的数据。让我们来看看怎样进行这种类型的攻击。我会用Windg进行演示。windg是一个土生土长的调试器,还可以用来调试托管的附带有可扩展dll帮助的应用程序Dll。Windg是windows下调试工具的一种。

当你点击“ok”描绘,会出现一个对话框,显示登录失败。这时候打开WinDbg并且附加到正在运行的进程。对此,你必须选择“附加到进程”菜单选项,如下图所示。

图6:附加到进程的菜单选项

接下来在下面的对话框中选择运行过程中要监视的程序

图7:附加到进程对话框

这时候我们来看看.net托管堆,检查字符串数据类型的实例。有很多不同的方法实现,我会简单地用!string命令来达到目的。

图8:运行!string命令

输出!string命令可能会有点长,但是我们在文本框里输入的用户名和密码将会在下面显示的地方看到。

图9:运行的时候能看到秘密!

微软提供了SecureString类,可以帮助提供一些对这种类型的工具的防护。

在本文中,我们讨论了为什么字符串数据类型是黑客特别感兴趣的。我们展示了一些常见的黑客可在静态和运行时,发现存储在字符串数据类型里敏感信息的方式。希望以上这些对大家有用。

译文出处:http://www.codeproject.com/Articles/401220/Why-hackers-love-String-data-type

posted on 2013-02-17 22:22  凌晨的搜索者  阅读(3626)  评论(13编辑  收藏  举报

导航