![](https://img.haomeiwen.com/i5676193/cb5b46456e81d839.png)
该病毒利用加密算法对文件进行加密,使得用户无法对文件进行正常操作
运行之前:
利用PEID,发现其没有加壳
![](https://img.haomeiwen.com/i5676193/2039edf9a3ea426d.png)
一般通过观察其输入表来判断其行为,然而这里比较奇怪的是输入表里面居然没有Kernel32.dll,说明其太可疑了!!!很有可能通过加密来隐藏了自己的行为
![](https://img.haomeiwen.com/i5676193/f77a8f1ecb777e68.png)
利用Strings查看一下其字符串列表:
![](https://img.haomeiwen.com/i5676193/0abeeec1bd795bec.png)
全是乱码,及有可能进行了加密或者混淆
火绒剑监控:
文件监控:
遍历文件夹,加密文件并且在每个文件夹下创建勒索相关图文信息
![](https://img.haomeiwen.com/i5676193/d71749fd5978c61d.png)
执行监控:
![](https://img.haomeiwen.com/i5676193/03dda1dbbe8f1ba9.png)
通过执行监控可以看到,创建了一个新的可执行文件,并且调用cmd,打开notepad写入文字信息,仅通过调用cmd就可以视为病毒行为,普通程序根本不需要调用cmd命令行工具
行为监控:
自我删除:
![](https://img.haomeiwen.com/i5676193/8531b8c8f128c8a3.png)
自我复制:
![](https://img.haomeiwen.com/i5676193/32c95df5ca592e34.png)
释放隐藏文件
![](https://img.haomeiwen.com/i5676193/5058ea913c06a3c9.png)
![](https://img.haomeiwen.com/i5676193/68ac1788ac95397c.png)
启动自释放文件
![](https://img.haomeiwen.com/i5676193/074d130365d2b052.png)
可以看出其有以下几个行为:
- 自我复制
- 在User/Documetns下创建了一个文件并隐藏了
- 自我删除
pcHunter监控
重启之后,使用pcHunter查看,发现
![](https://img.haomeiwen.com/i5676193/43f1b7a4008478d2.png)
设置了勒索图文为启动项,更改了注册表,本身已经删除了病毒本身的程序,无法打开任务管理器和注册表编辑器
动态检测:
加载至OD 里面:跟进到第一个call中发现有大量的混淆:
![](https://img.haomeiwen.com/i5676193/3dc1701890658dec.png)
![](https://img.haomeiwen.com/i5676193/72e206a10a186509.png)
再仔细反思一下刚才的那些行为,会释放一个PE文件,其很有可能调用了CreateProcess这个API, 可以在CreateProcess处下断点试试看:
按F9运行:
![](https://img.haomeiwen.com/i5676193/4fbbd8db6dc97023.png)
CreateProcess创建了一个进程,进程名字在 commandLine所对应的那个字符串,其实所创建的进程的名字一般是写在第一个参数的,即ModuleFileName;当然这里可以写NULL,名字就可以写在第二行的CommandLine里面了,一般而言,利用CreateProcess创建出来的线程是要运行的;而这里的参数为:CREATE_SUSPEND,故这里的线程创建出来之后随即被挂起
以挂起的形式创建了一个进程,说明其之后还应该会恢复进程,这里可能为ResumeThread,在ResumeThread出下断点;同时我们可以推测,为何要以挂起的方式创建进程,很有可能要在创建出来的进程里面做一些操作,比如可以写一些东西,这时候可能会用到VirtualAlloc以及VirtualAllocEx,WriteProcessMemory等函数
在这些地方下断点;
![](https://img.haomeiwen.com/i5676193/947777547fb63393.png)
果然在这个函数段下来了;
继续运行,发现其在WriteProcessMemory这个API断下来了:
![](https://img.haomeiwen.com/i5676193/af29d8e203e44845.png)
为了更加清晰的分析其过程,再重新用OD加载一下(同时在上面几个API下断点):
第一次Virtualloc
![](https://img.haomeiwen.com/i5676193/f3c528cb82475a07.png)
![](https://img.haomeiwen.com/i5676193/564a6e9cf6fc76c2.png)
第二次VirtualAlloc;
![](https://img.haomeiwen.com/i5676193/da3f7b368e5060f6.png)
![](https://img.haomeiwen.com/i5676193/3c07091afde1f393.png)
第三次VirtualAlloc:
![](https://img.haomeiwen.com/i5676193/c1826bd9ebb2698a.png)
![](https://img.haomeiwen.com/i5676193/f57709e9736dd2e4.png)
第四次VirtualAlloc
![](https://img.haomeiwen.com/i5676193/ee81784460aaaa92.png)
返回值:01270000;
Size:3AC00
![](https://img.haomeiwen.com/i5676193/27959ea365f9a2db.png)
CreateProcessW处断下来了;
![](https://img.haomeiwen.com/i5676193/1a22167ae2dcc2fd.png)
再一次在VirtualAllocEx处断下来了:
![](https://img.haomeiwen.com/i5676193/08f054eb900a401d.png)
WriteProcessMemory处停下来!
![](https://img.haomeiwen.com/i5676193/09918aa71538d366.png)
到这里,我们可以大概推测出这个病毒执行的大概的流程了:
一开始的时侯连续调用了四个virtualalloc函数,并且在第四次调用这个函数申请的空间里面存放恶意代码,值得注意的是这个程序何时将恶意代码放入VirtualAlloc申请的那个空间我们目前是不知道的,但是有一点可以确定的是在调用WriteProcessMemory的时候,之前申请的那个空间里面肯定已被填入了恶意代码;继续分析,在调用了4次VirtualAlloc之后,又调用了CreateProcessW函数,接着调用VirtualAllocEx和WriteProcessMemory函数;看来果然如我们之前推测的一般,先将恶意代码拷贝至第四次VirtualAlloc申请的空间,然后利用WriteProcessMemory将刚才用VirtualAlloc申请到的空间里的存放的恶意代码存放至用VirtualAllocEx申请出来另一个进程(此进程是通过CreateProcess创建出来的)的空间中;另一方面根据WriteProcessMemory这个API中的一个参数,可以得知VirtualAlloc申请出来的空间中的恶意代码是存放于缓冲区之中的,说明其数据是以文件的形式保存的,故这里为我们提供了方便,我们只要将dump下来即可
(注:经过多次测试,发现在createrocess之前的那个virtualalloc申请的空间里面将放恶意代码,故要得到那个virtualalloc的返回值(即申请空间的首地址))
IDA中一些小结:
可以查看导入表(imports):
看里面的导入的函数,通过查看里面的可疑函数,可疑定位到相关地址(结合交叉引用)
在OD中如何拷贝二进制到010Editor里面:
![](https://img.haomeiwen.com/i5676193/a9e951e4c13dce53.png)
![](https://img.haomeiwen.com/i5676193/924f20b0a9d602dd.png)
![](https://img.haomeiwen.com/i5676193/f939761f5b1d2fab.png)
再利用010Editor编辑器将随机基址关掉(在可选头里面,具体参见讲义里面)(可以方便调试与测试)
获取权限的相关操作:
![](https://img.haomeiwen.com/i5676193/9217f0febfffc6aa.png)
进行提权的相关操作:
![](https://img.haomeiwen.com/i5676193/f4c74830ca6690d0.png)
动态跟踪,将进一步验证:
(在IDA中查到相关特征api之后在OD里面进行下断点)
![](https://img.haomeiwen.com/i5676193/0be112834345d3df.png)
读取当前进程权限:
![](https://img.haomeiwen.com/i5676193/cefc20e464f67669.png)
获取当前进程的SID:
![](https://img.haomeiwen.com/i5676193/cdf42c20dfa2a7fc.png)
![](https://img.haomeiwen.com/i5676193/44ca43f5251c8c6e.png)
![](https://img.haomeiwen.com/i5676193/5cf1a6808919e560.png)
上图中描述了dump出的文件中有复制文件与删除文件的操作;
下图中为进入自我是删除的函数:
![](https://img.haomeiwen.com/i5676193/55d6ce709c609662.png)
利用ShellExecuteW函数在OD里面进行动态跟踪;
验证了之前的判断,确实是在删除自身!
![](https://img.haomeiwen.com/i5676193/978605ffa8cc45d9.png)
![](https://img.haomeiwen.com/i5676193/c18ba8bb79cf342a.png)
设置注册表键值:
![](https://img.haomeiwen.com/i5676193/ac365561820d0a5d.png)
获取磁盘信息:
![](https://img.haomeiwen.com/i5676193/8599525e305a2346.png)
遍历文件
![](https://img.haomeiwen.com/i5676193/944f91384af06a3b.png)
加密文件:
![](https://img.haomeiwen.com/i5676193/8af59d779db89633.png)
![](https://img.haomeiwen.com/i5676193/a8927baecff11892.png)
跟进函数sub_411960,发现大量的加密操作:
![](https://img.haomeiwen.com/i5676193/400dafca6d8c8ff0.png)
管理员权限运行:
![](https://img.haomeiwen.com/i5676193/fa3ebe79397724ec.png)
解密字符串:
![](https://img.haomeiwen.com/i5676193/adbed8b875b4a010.png)
![](https://img.haomeiwen.com/i5676193/805585abc39b5327.png)
![](https://img.haomeiwen.com/i5676193/11c6cf15a2546df5.png)
![](https://img.haomeiwen.com/i5676193/9d24cc3dcd311d67.png)
![](https://img.haomeiwen.com/i5676193/06d803837caa83db.png)
![](https://img.haomeiwen.com/i5676193/b3b37e4fb545db9c.png)
![](https://img.haomeiwen.com/i5676193/dbbb7901481fc772.png)
![](https://img.haomeiwen.com/i5676193/638e152a348c8c1d.png)
![](https://img.haomeiwen.com/i5676193/8c37d50335c77183.png)
利用WNetOpenEnum和WNetEnumResourceW对网络资源进行枚举,
HGLOBAL __stdcall sub_401610(LPNETRESOURCEW lpNetResource)
{
HGLOBAL result; // eax@2
void *v2; // ebx@3
DWORD v3; // edi@5
const wchar_t **v4; // esi@6
DWORD cCount; // [sp+0h] [bp-8h]@1
SIZE_T dwBytes; // [sp+4h] [bp-4h]@1
dwBytes = 0x4000;
cCount = -1;
if ( WNetOpenEnumW(2u, 0, 0, lpNetResource, (LPHANDLE)&lpNetResource) )
{
result = 0;
}
else
{
result = GlobalAlloc(0x40u, dwBytes);
v2 = result;
if ( result )
{
while ( 1 )
{
memset(v2, 0, dwBytes);
if ( WNetEnumResourceW(lpNetResource, &cCount, v2, &dwBytes) )
break;
v3 = 0;
if ( cCount )
{
v4 = (const wchar_t **)((char *)v2 + 20);
do
{
if ( dword_43A834 <= 64 && *(v4 - 5) == (const wchar_t *)2 && *(v4 - 4) == (const wchar_t *)1 )
{
wcscpy_s(&word_43AE58 + 1024 * dword_43A834, 0x400u, *v4);
++dword_43A834;
}
if ( (*((_BYTE *)v4 - 8) & 2) == 2 )
sub_401610((LPNETRESOURCEW)(v4 - 5));
++v3;
v4 += 8;
}
while ( v3 < cCount );
}
}
GlobalFree(v2);
result = (HGLOBAL)(WNetCloseEnum(lpNetResource) == 0);
}
}
return result;
}
同时发现 HttpSendRequestA和InternetCrackUrlA等函数,说明其进行了网络连接
![](https://img.haomeiwen.com/i5676193/84c59a8e5220beb6.png)
网友评论