该病毒利用加密算法对文件进行加密,使得用户无法对文件进行正常操作
运行之前:
利用PEID,发现其没有加壳
一般通过观察其输入表来判断其行为,然而这里比较奇怪的是输入表里面居然没有Kernel32.dll,说明其太可疑了!!!很有可能通过加密来隐藏了自己的行为
利用Strings查看一下其字符串列表:
全是乱码,及有可能进行了加密或者混淆
火绒剑监控:
文件监控:
遍历文件夹,加密文件并且在每个文件夹下创建勒索相关图文信息
执行监控:
通过执行监控可以看到,创建了一个新的可执行文件,并且调用cmd,打开notepad写入文字信息,仅通过调用cmd就可以视为病毒行为,普通程序根本不需要调用cmd命令行工具
行为监控:
自我删除:
自我复制:
释放隐藏文件
启动自释放文件
可以看出其有以下几个行为:
- 自我复制
- 在User/Documetns下创建了一个文件并隐藏了
- 自我删除
pcHunter监控
重启之后,使用pcHunter查看,发现
设置了勒索图文为启动项,更改了注册表,本身已经删除了病毒本身的程序,无法打开任务管理器和注册表编辑器
动态检测:
加载至OD 里面:跟进到第一个call中发现有大量的混淆:
再仔细反思一下刚才的那些行为,会释放一个PE文件,其很有可能调用了CreateProcess这个API, 可以在CreateProcess处下断点试试看:
按F9运行:
CreateProcess创建了一个进程,进程名字在 commandLine所对应的那个字符串,其实所创建的进程的名字一般是写在第一个参数的,即ModuleFileName;当然这里可以写NULL,名字就可以写在第二行的CommandLine里面了,一般而言,利用CreateProcess创建出来的线程是要运行的;而这里的参数为:CREATE_SUSPEND,故这里的线程创建出来之后随即被挂起
以挂起的形式创建了一个进程,说明其之后还应该会恢复进程,这里可能为ResumeThread,在ResumeThread出下断点;同时我们可以推测,为何要以挂起的方式创建进程,很有可能要在创建出来的进程里面做一些操作,比如可以写一些东西,这时候可能会用到VirtualAlloc以及VirtualAllocEx,WriteProcessMemory等函数
在这些地方下断点;
果然在这个函数段下来了;
继续运行,发现其在WriteProcessMemory这个API断下来了:
为了更加清晰的分析其过程,再重新用OD加载一下(同时在上面几个API下断点):
第一次Virtualloc
第二次VirtualAlloc;
第三次VirtualAlloc:
第四次VirtualAlloc
返回值:01270000;
Size:3AC00
CreateProcessW处断下来了;
再一次在VirtualAllocEx处断下来了:
WriteProcessMemory处停下来!
到这里,我们可以大概推测出这个病毒执行的大概的流程了:
一开始的时侯连续调用了四个virtualalloc函数,并且在第四次调用这个函数申请的空间里面存放恶意代码,值得注意的是这个程序何时将恶意代码放入VirtualAlloc申请的那个空间我们目前是不知道的,但是有一点可以确定的是在调用WriteProcessMemory的时候,之前申请的那个空间里面肯定已被填入了恶意代码;继续分析,在调用了4次VirtualAlloc之后,又调用了CreateProcessW函数,接着调用VirtualAllocEx和WriteProcessMemory函数;看来果然如我们之前推测的一般,先将恶意代码拷贝至第四次VirtualAlloc申请的空间,然后利用WriteProcessMemory将刚才用VirtualAlloc申请到的空间里的存放的恶意代码存放至用VirtualAllocEx申请出来另一个进程(此进程是通过CreateProcess创建出来的)的空间中;另一方面根据WriteProcessMemory这个API中的一个参数,可以得知VirtualAlloc申请出来的空间中的恶意代码是存放于缓冲区之中的,说明其数据是以文件的形式保存的,故这里为我们提供了方便,我们只要将dump下来即可
(注:经过多次测试,发现在createrocess之前的那个virtualalloc申请的空间里面将放恶意代码,故要得到那个virtualalloc的返回值(即申请空间的首地址))
IDA中一些小结:
可以查看导入表(imports):
看里面的导入的函数,通过查看里面的可疑函数,可疑定位到相关地址(结合交叉引用)
在OD中如何拷贝二进制到010Editor里面:
再利用010Editor编辑器将随机基址关掉(在可选头里面,具体参见讲义里面)(可以方便调试与测试)
获取权限的相关操作:
进行提权的相关操作:
动态跟踪,将进一步验证:
(在IDA中查到相关特征api之后在OD里面进行下断点)
读取当前进程权限:
获取当前进程的SID:
上图中描述了dump出的文件中有复制文件与删除文件的操作;
下图中为进入自我是删除的函数:
利用ShellExecuteW函数在OD里面进行动态跟踪;
验证了之前的判断,确实是在删除自身!
设置注册表键值:
获取磁盘信息:
遍历文件
加密文件:
跟进函数sub_411960,发现大量的加密操作:
管理员权限运行:
解密字符串:
利用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等函数,说明其进行了网络连接