Worm_down.a和Worm_down.ad都是利用 MS08-067漏洞,通过溢出挂载svchost.exe进程从而进行局域网传播的病毒。其中.ad是.a的变种。
这两个变种都有一些一样的功能,其中一个便是当本身被加载后,会创建一个Mutex,以防止被重复加载。
.a变种创建该Mutex的方法是调用zip.lib中的crc32算法,将计算机名进行crc验算后作为Mutex的名字。由于该方法简单,所以很容易创建相同的Mutex。
.ad变种意识到了这一点,因此作者自己写了一个算法,用来生成Mutex名。这里我们便来分析一下.ad变种生成该Mutex的方法。
由于要根据计算机名做Mutex,因此我们在GetComputerNameA上设断点,然后F9运行,如下图:
按Ctrl+F9运行至GetComputerNameA下一行指令:
于是我们发现了与.a变种差不多代码。先获得计算机名,然后生成_snprintf需要的参数,最后通过_snprintf生成Mutex名。
我们从_snprintf往上看,发现有两个函数:009fb647和009fb510,跟进去看看:
大致一看,我们看到rand函数,inc、cmp、jl在一起,我们于是想到for循环
一步一步分析如下:
于是有了这些分析,我们大概能总结出该函数是如下C++代码:
[cpp]
if( n != 0)
{
for(int i =0; i < n; i++)
{
int j = 26;
int m = rand();
m %= j;
m += 97;
}
}
[/cpp]
可是n是哪里来的呢?看来函数是带参数的,果然,我们看到:
第一个参数0a09e14应该是一个buffer数组,edx应该就是循环的次数了,可是edx哪里来的呢,继续往上看:
我们一眼就能看到srand和rand,那看来edx也和随机数有关系。我们一句一句来看:
先调用009f8245,然后将返回结果和2f53508b进行异或运算,得到srand的随机数种子seed,接下来调用rand函数生成一个随机数,最后将该随机数除以3,求余数,再加上6,就是我们刚才那个函数的edx了。哈哈,看来这个Mutex的长度是6到8位。
有了这样的分析,我们差不多就知道个大概了。我们从头理一下,我们可以总结出以下c++代码(为了方便显示,我们不采用buffer,而是直接输出)
[cpp]
#include
#include
using namespace std;
void output(int n)
{
if( n != 0)
{
for(int i =0; i < n; i++)
{
int j = 26;
int m = rand();
m %= j;
m += 97;
cout << char(m);
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
srand(390548251);
int j = rand() % 3;
output(j+6);
getchar();
}
[/cpp]
运行后输出以下结果:
与病毒生成的Mutex一样:
所以,现在我们就可以自己生成这个Mutex,用来防止病毒被加载了。
需要说明的是:这个不变的Mutex其实也是利用了rand()函数。当不为rand设置随机数种子时,只要不重启机器,通过rand每次生成的随机数都是一样的。所以,只要不重启机器,病毒每次创建的Mutex都是一样的。