欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

从Cerber勒索软件中学习murmurhash算法

程序员文章站 2022-05-12 22:17:43
...

近期,大量国内用户遭受到cerber勒索软件的侵害,cerber作为新起的勒索软件家族,大有后来居上的姿态,网上也有数篇对于cerber**勒索软件**的行为的分析。这款勒索软件,使用rsa非对称加密加密用户的文件,在没有私钥的情况下,基本上没有可能解密出被勒索的文档。这个勒索软件比较新颖的使用了murmur hash算法,本文本着学习的精神,对murmurhash算法的原理及在此款勒索软件中的使用作了简单的分析。

Murmur hash算法介绍
MurmurHash是一种非加密型哈希函数,适用于一般的哈希检索操作。 由Austin Appleby在2008年发明,并出现了多个变种,都已经发布到了公有领域。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。当前的版本是MurmurHash3,能够产生出32-bit或128-bit哈希值。
MurmurHash算法具有高运算性能,低碰撞率等特点,这也人使的近些年对MurmurHash的使用风生水起,目前应用MurmurHash 的开源系统包括Hadoop、libstdc++、nginx、libmemcached。

Murmur hash 算法实现
根据*上给出的伪代码,我们使用python实现 murmur hash算法,如下:
[Python] 纯文本查看 复制代码
?
从Cerber勒索软件中学习murmurhash算法
def murmur3_x86_32(data, seed=0):[/size][/align][size=4] c1 = 0xcc9e2d51
c2 = 0x1b873593
r1 = 15
r2 = 13
m = 5
n = 0xe6546b64

length = len(data)
h1 = seed
rounded_end = (length & 0xfffffffc)  # every block contain 4 bytes
for i in range(0, rounded_end, 4):
    # translate to little endian load order
    k1 = (ord(data[i]) & 0xff) | ((ord(data[i + 1]) & 0xff) << 8) | \
         ((ord(data[i + 2]) & 0xff) << 16) | (ord(data[i + 3]) << 24)
    k1 *= c1
    k1 = (k1 << r1) | ((k1 & 0xffffffff) >> (32-r1))  # ROTL32(k1,15)
    k1 *= c2

    h1 ^= k1
    h1 = (h1 << r2) | ((h1 & 0xffffffff) >> (32-r2))  # ROTL32(h1,13)
    h1 = h1 * m + n

# the last block which is < 4 bytes
k1 = 0

val = length & 0x03
# the last block is  3 bytes
if val == 3:
    k1 = (ord(data[rounded_end + 2]) & 0xff) << 16
# the last block is  2 bytes
if val in [2, 3]:
    k1 |= (ord(data[rounded_end + 1]) & 0xff) << 8
# the last block is  1 bytes
if val in [1, 2, 3]:
    k1 |= ord(data[rounded_end]) & 0xff  # translate to little endian load order
    k1 *= c1
    k1 = (k1 << r1) | ((k1 & 0xffffffff) >> (32-r1))
    k1 *= c2
    h1 ^= k1

# finalization
h1 ^= length
h1 ^= ((h1 & 0xffffffff) >> 16)
h1 *= 0x85ebca6b
h1 ^= ((h1 & 0xffffffff) >> 13)
h1 *= 0xc2b2ae35
h1 ^= ((h1 & 0xffffffff) >> 16)
# for 32 bit, get the last 32 bits
return h1 & 0xffffffff

对样本中的调用murmurhash的地方下断,可以看到对数据“65 2F3B 3C D1 40 02 4C BA 68 C0 D0”进行hash的结果为“BF35B592”
………………………………………………………………………………………………..略,
查看全文请看这里》》》》》》》原文地址:http://bbs.ichunqiu.com/thread-14070-1-1.html?from=jike