一种指令级密码算法识别方法和系统的制作方法

文档序号:9667653阅读:480来源:国知局
一种指令级密码算法识别方法和系统的制作方法
【技术领域】
[0001] 本发明涉及密码算法识别技术领域,尤其涉及一种指令级密码算法识别方法和系 统。
【背景技术】
[0002] 密码算法已经成为保障信息安全的必要手段。在网络信息化时代,网络中重要的 电子设备如交换机,路由器,防火墙以及其他特定的加解密设备都在其内嵌的软件程序中 使用了密码算法。要对这些设备中软件的安全机制进行分析、检测和消除安全隐患,就必须 在程序代码逆向过程中完成对密码算法的识别。此外,计算机病毒、木马等恶意软件广泛采 用了密码算法来达到改变自己的静态特征以及隐藏网络通信流量或者保护其载荷内容的 目的。密码算法识别是对这些恶意软件进行特征抽取以及核心内容解密的关键技术。
[0003]密码算法识别属于程序理解的一个分支,程序理解即是从计算机程序的内部获取 相关的知识信息,常常是通过目标代码定位以识别程序的架构以及功能。软件中的密码算 法可以从二进制代码和汇编代码这两个层次进行识别。二进制代码级别主要使用类似于病 毒检测中的静态特征码匹配技术,事先将常用密码算法中出现的初始化值,S盒参数等特征 码收集到特征库中,然后扫描目标软件,若出现了相匹配的特征码,则判断为相应的密码算 法。Grobert和Zhao等人于2010年和2011年依次利用静态特征码设计了自动化的密码算法 识别方法。汇编代码级别的识别是将目标软件进行反汇编处理,然后提取具有循环等特定 结构的指令序列,利用模式匹配的方法与已知的密码算法进行比较来识别目标软件中的密 码算法。目前许多密码算法的识别都是用于恶意软件的逆向分析。2009年,Wang等人第一次 提出了在程序运行时动态地检测和识别程序中的密码算法。他们首先利用数据生命周期, 包括数据污点标记,动态二进制插粧技术去确定明密文的转换点,即消息解密和处理的起 点。然后确定存储解密后消息的内存区域。他们使用了四个标准的协议(HTTPS,IRC,Μ頂E以 及恶意软件Agobot中使用的不知名协议)来评估该方法的效果。在他们的测试中,利用开发 的软件工具可以解密所有密文消息。该方法的主要缺点在于在消息解密和消息处理之间仅 能处理一个转换点,即若程序先解密消息一个块,然后处理,接着再解密,那么该方法并不 能正确地识别这种模式的密码算法。Lutz发现了加密操作有较多比特位算术指令。Lutz的 方法主要基于下面三个观察:(1)循环是密码算法的一个核心部件;(2)密码算法大量使用 了整数运算;(3)解密过程降低了被标记数据的信息熵。Lutz开发的识别工具的核心是使用 污点分析并通过计算一个缓冲区数据的信息熵来判断该缓冲区是否被解密。Caballero等 人精细化了Wang的方法,并利用了Lutz的关于加密操作的发现。他们对恶意软件MegaD进行 自动化的协议逆向和密码算法识别。对软件的每个函数实例,他们计算其比特位算术指令 的比例。如果该函数执行比特位算术指令至少20次并且比例超过了 55%,则将该函数标记 为加解密函数。在一个实际测试中,该方法找出了所有的密码函数。为了识别出密码函数的 参数(明文等),他们尝试确定被标记函数的数据读入的集合。为了区分明文、密钥以及其他 被加密函数所使用的数据,他们比较同一个函数的不同实例的数据读入集合。这样就仅仅 只有明文部分会发生变化,因此可以识别出明文数据。其他恶意软件的密码算法识别方面 还有如下一些分析研究:2010年,Werber和Leder分析了恶意软件Conficker,发现该软件使 用了OpenSSL中的SHA-1和MD6的一个公开的模板化实现。有趣的是,攻击者随后对该MD6算 法的实现打了补丁,修正了其中的一个缓冲溢出漏洞。进一步,Porras等人发现了在许多 P2P恶意软件的开发者使用1024位的RSA作为签名验证算法,某些软件的新版本中甚至使用 了4096位的RSA算法。随后,Werber和Leder还分析了恶意软件Waledac,识别出它所使用的 4000个函数中有1000个是来自于密码算法库OpenSSL,并且AES算法使用的是IV值为0的CBC 加密模式。Stewart分析和识别了恶意软件StormWorm中的算法,对点对点的快速通信,该 软件使用了静态的X0R算法对子节点进行认证,密钥采用56比特的RSA算法。2012年,国内的 李继中等人利用指令统计特征相似性判断的方法来识别密码算法,但只能抽取密码函数, 无法标识出算法名称。2013年,舒辉等人对密码算法的循环特征进行了抽取和识别,提高了 密码函数定位的准确性。
[0004] 综合说来,密码算法识别都是基于密码算法本身的一些特征实现的(静态的特征 码或动态的指令序列),当前针对软件中密码算法的识别方法主要存在以下问题:
[0005] (1)密码算法识别方法的准确性低。实际中有的密码算法缺乏明显的常数特征,或 者这些特征被隐藏在程序数据段中而难以探测,这都导致了当前大多数依赖于静态特征的 识别方法准确性较低。
[0006] (2)难以识别出具体的密码算法名称。虽然动态方法可以跟踪程序执行过程,并能 抽取程序的执行轨迹,但这只能利用循环探测定位到关键的函数,由于没有获取整个函数 调用链的关系导致只能识别出密码算法的部分函数实现,却无法识别出整个密码算法。
[0007] (3)采用代码混淆的软件中的密码算法识别非常困难。当前很多恶意软件都广泛 采用了加壳等代码混淆技术对密码算法的特征和执行过程进行隐藏和过滤,极大地增加了 密码算法识别的难度。
[0008](4)密码算法识别的自动化程度较低。完全采用人工的方式进行密码算法识别去 理解目标恶意软件的行为,这无疑是非常耗时的。提高算法识别的自动化水平是重要的研 究方向。

【发明内容】

[0009]针对现有技术中的密码算法识别方法存在的上述问题,本发明公开了一种指令级 密码算法识别方法和系统。
[0010] 本发明公开了一种指令级密码算法识别方法,其具体包括以下的步骤:步骤一、建 立已公开密码算法的特征库,所述算法的特征包括静态特征码和动态特征指令序列;步骤 二、扫描和匹配目标程序中的静态特征码,通过静态特征码识别密码算法;步骤三、收集和 分析目标程序的执行迹并抽取实现密码算法的程序代码及其输入输出参数;步骤四、利用 输入参数与输出参数之间的匹配关系与动态特征数据进行比较,确认目标程序中执行的密 码算法。
[0011] 更进一步地,上述密码算法的动态特征根据该算法实现的模板程序,抽取其执行 时的指令序列以及相关操作数据形成,动态指令Di,D2,···,0"的有限序列形成一条执行迹。
[0012] 更进一步地,采用动态二进制插粧工具PIN作为执行迹收集的工具。
[0013] 更进一步地,上述方法还包括执行迹的收集和分析过程,所述执行迹的收集和分 析过程主要包含数据简化和数据分析两部分,所述数据简化包括排除掉那些来自于已知代 码库里面的指令以及通过线程ID进行过滤两种过滤方式,所述数据分析包括基本块探测、 循环探测、循环数据流图生成以及参数信息收集。
[0014] 更进一步地,上述基本块由执行迹动态生成,基本块探测时根据指令序列的执行 轨迹进行,若其只有单一的入口和出口,则标识为一个基本块,当基本块被自我修改的代码 改变,则这种变化将会在第一次新代码执行时被发现。
[0015] 更进一步地,上述循环探测具体包括以下的步骤:步骤a、依次处理执行迹中的机 器指令,并把它们存储在列表中,称为History;步骤b、根据其中出现的重复指令得到多个 可能的循环实例,每一个循环实例都存在一个对应的下一个所期望的指令;步骤三、将新的 机器指令添加进History,从而排除其中不符合条件的循环实例;步骤四、确认循环实例并 使用循环标记X在History中进行标记。
[0016] 更进一步地,上述循环数据流图生成具体为:针对探测到的每一对循环实例1^和 Lj,使用一个标准的图论算法,通过测试其是否满足二元关系以及其连接分支来构造循环 数据流图。
[0017] 更进一步地,上述参数信息收集具体包括:首先根据条件将字节打包成参数变量, 然后利用条件把这些参数变量分成两类:输入和输出参数;再采用如下的原则为上一步获 取的参数变量赋予一个固定值,执行迹为每次数据访问收集相应的值,为
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1