找回密码
 立即注册
注册 登录
×
热搜: 活动 交友 discuz
查看: 86|回复: 1

恶意软件的脱壳方法(二):弱加密算法

[复制链接]

2

主题

4

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2023-1-9 12:05:19 | 显示全部楼层 |阅读模式
几天前开始,我写了一个关于恶意软件脱壳的工具和方法的系列文章,第一篇的链接在此。每个恶意软件/加壳软件都是不同的,有时不能用通用方法脱壳。但有时可以找到他们共有的特征。比如,加壳软件经常使用弱加密算法,破解这些算法是可能的。
本文中我会介绍一些基于非常简单的加密学原理的方法,这些方法可以破解加壳软件使用的弱加密算法。虽然这些破解方法很简单,但是对大量的恶意软件家族和加壳软件仍然很有效,可以自动的脱壳一些恶意软件。
首先,我必须声明这些方法不是新的,已经用了很久。这是一些有关的文章和工具:
《Principles and practice of x-raying》,最好的也是最早的相关文章,作者Peter Ferrie。
《XorSearch》,作者Didier Stevens。
《Decoding XOR shellcode without a Key》,作者Chris Jordan。
《UnXor》,作者Tomchop。
《Deobfuscating Embedded Malware using Probable-Plaintext Attacks》(KANDI工具),作者Christian Wressnegger, Frank Boldewin和 Konrad Rieck。

我用Python实现了一个工具(revealpe.py)进行破解。我将这些破解方法放在一个工具里,并做了一些改进,特别是在恶意软件的脱壳方面:
RevealPE
该工具可以破解基于XOR、ADD、ROL的算法,8或32位密钥(我认为这是在恶意软件中最常见的),有或没有密钥增量。此外,它还可以破解维吉尼亚(vigenere)密码,是否可以破解其他更复杂的加密算法还有待发现。

使用



结果:

该脚本在目标文件上尝试所有的破解方法,可以匹配不同的算法和密钥。它会为每种结果创建一个文件,命名格式如下:
<original_file_name>.<algorithm>_<offset_match>_<param1>_<param2>.<dec
| decpe>
       后缀名.dec表示用算法和密钥解密得到的文件。后缀名.decpe表示找到的那些被解密并提取有效的PE文件。
       例如,一个恶意软件f658526e1227c45415544063997b49c8,破解后可以得到下列结果:
                       f658526e1227c45415544063997b49c8.XOR1_1f60_88_ff.dec
                       f658526e1227c45415544063997b49c8.XOR1_1f60_88_ff.decpe
                       f658526e1227c45415544063997b49c8.XOR4_1f60_85868788_fbfbfbfc.dec

      
匹配位置为0x1f60。前两条结果表示可以用xor_byte解密,密钥初始值0x88,增量0xff。第三条结果表示用xor_dword解密,密钥初始值0x85868788,增量0xfbfbfbfc,但是没有生成.decpe文件,所以该算法和找到的密钥只适用于给定的明文,而不适用于完整的PE文件(或许这是对齐的问题,如果设置选项为不对齐,则会得到xor_dword算法的正确密钥)。
       这里是一个短视频,展示了该工具的使用:
       https://youtu.be/pRuyN64ZkAg

       弱加密算法的实例

       这里是一些可能被攻击的弱加密算法的例子。
       XOR或ADD(不变密钥)

       P xor K = C  ->  K = C xor P
       P add K = C  ->  K = C sub P



       例如:
       密钥初始值:0x85,无增量。


       XOR或ADD(自增密钥,增量恒定)

       Pi xor Ki = Ci  ->  Ki = Ci xor Pi  ->  K(i) - K(i-1) = Kinc
       Pi add Ki = Ci  ->  Ki = Ci sub Pi  ->  K(i) - K(i-1) = Kinc


        例如:
        密钥初始值:0x54,增量:0x92。



        维吉尼亚之类的算法

       Ci = SUST_TABLE[ Pi ]
       明文中有相同值的位置的索引,必须与密文中有相同值的位置的索引相一致,我们可以基于相同值之间的距离创建签名,来确定给定的明文在密文中的位置。
       例如:  


一旦找到某个明文所对应的密文,就有可能重建一个局部的替换表:(T -> 73),(i ->
A6),(s ->FC),(space ->
C5)等(除了PE头部分,revealPE.py工具还会查找其他有名的明文来完善替换表,比如通用的API名称)。

除了构建一个局部的替换表,revealPE.py工具会用暴力破解的方法,检查常用的算法是否与该重建的替换表相匹配(revealPE.py工具暴力破解这些算法:xor-add-rol
, xor-rol-add, add-xor-rol, add-rol-xor, rol-xor-add,
rol-add-xor,用所有可能的密钥)。

测试

我用一些exe文件和pdf文件做了一些测试:
       Exe文件:
             93个exe文件得到嵌入PE。
            4453个exe文件没有得到嵌入PE。
       Pdf文件:
            586个pdf文件得到加密PE。
            44536个pdf文件没有得到加密PE。

测试文件是随机选取的。可能其中的大多数不是加壳文件,或者不包含任何加密PE。例如,revealPE.py没有在4453个exe文件中找到嵌入PE,但这不意味着对这些文件破解失败,因为可能这些文件本身不包含嵌入PE。
为了更准确的测试,我需要一些确定包含加密PE的文件,来精确测试revealPE到底可以解密多少PE。
测试文件链接:exe文件 pdf文件

本文由看雪翻译小组 Green奇 编译,来源@vallejocc  转载请注明来自看雪社区
回复

使用道具 举报

0

主题

7

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2025-3-26 19:29:21 | 显示全部楼层
沙发位出租,有意请联系电话:13838384381
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋| 黑客通

GMT+8, 2025-4-5 20:47 , Processed in 0.128402 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2020, LianLian.

快速回复 返回顶部 返回列表