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

标签: 黑客 字符串 数据类型 | 发表时间:2013-02-17 22:22 | 作者:凌晨的搜索者
出处:http://www.cnblogs.com/

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

    源码下载

    在我们进一步深入探讨之前,很多东西我想绝对应该搞清楚。在这篇文章中,我将演示黑客是怎样使用工具像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

本文链接

相关 [黑客 字符串 数据类型] 推荐:

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

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

Redis 数据类型

- - ITeye博客
该文章是对Redis官方文档的翻译. 字符串是Redis值的最基础的类型. Redis字符串是二进制安全的,这意味着一个Redis字符串可以包含任何种类的数据,例如一个JPEG图像或者一个序列化的Ruby对象. 一个字符串值最多可以保存512M字节的内容. 你可以使用Redis的字符串做一些有趣的事情,例如你可以:.

字符串匹配那些事(一)

- jiessie - 搜索技术博客-淘宝
本系列文章主要介绍几种常用的字符串比较算法,包括但不限于蛮力匹配算法,KMP算法,BM算法,Horspool算法,Sunday算法,fastsearch算法,KR算法等等. 本文主要介绍KMP算法和BM算法,它们分别是前缀匹配和后缀匹配的经典算法. 所谓前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从左到右;所谓后缀匹配是指:模式串和母串的的比较从右到左,模式串的移动从左到右.

字符串匹配的Boyer-Moore算法

- - 阮一峰的网络日志
上一篇文章,我介绍了 KMP算法. 但是,它并不是效率最高的算法,实际采用并不多. 各种文本编辑器的"查找"功能(Ctrl+F),大多采用 Boyer-Moore算法. Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解. 1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了这种算法.

JavaScript中的字符串操作

- - CSDN博客推荐文章
JavaScript中的字符串操作.    字符串在JavaScript中几乎无处不在,在你处理用户的输入数据的时候,在读取或设置DOM对象的属性时,在操作cookie时,当然还有更多.... JavaScript的核心部分提供了一组属性和方法用于通用的字符串操作,如分割字符串,改变字符串的大小写,操作子字符串等.

字符串匹配的KMP算法

- - 博客园_知识库
   字符串匹配是计算机的基本任务之一.   举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD".   许多算法可以完成这个任务, Knuth-Morris-Pratt算法(简称KMP)是最常用的之一. 它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth.

我们不需要字符串类型

- - 博客 - 伯乐在线
字符串是应该作为内置类型还是仅仅作为字符数组的一个别名呢. 考虑到实现细节的可选性,我并不认为需要对字符串进行类型特化. 在C++看来,字符串和“vector”容器基本上是一样的,除了某些特殊操作,例如:大小写转换,需要依赖容器元素“char”类型(而不是作用于容器本身). 字符串除了是一系列的字符组成,没有什么特别的.

字符串相似算法-Jaro-Winkler Distance

- - 开源软件 - ITeye博客
Jaro-Winkler Distance 算法. 这是一种计算两个字符串之间相似度的方法,想必都听过Edit Distance,Jaro-inkler Distance 是Jaro Distance的一个扩展,而Jaro Distance(Jaro 1989;1995)据说是用来判定健康记录上两个名字是否相同,也有说是是用于人口普查,具体干什么就不管了,让我们先来看一下Jaro Distance的定义.

再谈JavaScript的数据类型问题

- 茄 - aimingoo的专栏
 JavaScript的数据类型问题已经讨论过很多次了,但许多人还有许多书仍然沿用着错误的、混乱的一些观点,所以就再细讲一回. 提及这个讨论的原因在于argb同学在我的MSN博客(现在变成了wordproess,在这里)上的一段回复,又更早的起源则是两年前关于《JavaScript征途》一书的大讨论:.