900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > WannaCry勒索病毒分析过程**中**

WannaCry勒索病毒分析过程**中**

时间:2022-05-25 15:45:51

相关推荐

WannaCry勒索病毒分析过程**中**

WannaCry勒索病毒分析

为了分析WannaCry.exe有着什么样的行为,以及它是如何释放WannaCry_PE.exe程序的,在IDA中打开WannaCry.exe

我们可以发现它的头是WinMain,那它应该是带有窗口的程序,我们控制台程序一版是Main入口。hInstance、hPrevInstance、lpcmdLine、nShowCmd这些参数也是用于WinMain。

从IDA的字符串解析上,我们看见了应该网址,这个网站的名字有点乱啊。

在调用InternetOpenA()函数时,它设置了dwAccessType参数为InterNet_OPEN_TYPE_DIRECT,根据MSDN的解析,这是指解析本地主机号,连接网络。如果主机没有联网,就会返回NULL;

接着,将会调用InterNetOpenUrlA(),这个函数里,dwFlags的值是等于0x84000000,但是这个值在MSDN找不到,于是我猜想有可能是两个值加在一起了。

于是我将这两个值加起来,也就是说dwFlags = INTERNET_FLAG_RELOAD + INTERNET_FLAG_NO_CACHE_WRITE,也就是从服务器上下载请求的文件、对象或目录列表、而不是写入缓存中。

我想这个网站,会记录我的主机号,访问信息,而且还会给我安装不知名程序,于是我先往下分析,再看看它究竟想干什么。

在这里,我发现如果InternetOpenUrlA()返回一个NULL,那么就会跳转到0x004081A7,否则跳到loc_4081BC退出程序。也就是说,在这个网站里,它会下载一个病毒或者木马;如果访问不了网站,那么就在本机给你整一个病毒木马。

分析sub_408090,它可以分为了两部分分析,一部分是如果call _p_argc返回的参数个数小于2,那么就跳转到sub_407F20。否则跳转到另一部分loc_408089。

在OD上动态跟随,可看见GetModuleFileNameA()返回了当前文件所在的目录地址填入缓冲区的大小。

_P_argc()返回了eax是一个地址,这个地址的接引出来是等于0x1的,也就是1个参数,这里我猜测是检测是否创建服务和进程,因为在第二部分loc_408089是直接调用OpenSCManagerA(),即打开服务管理器,而且并未创建服务、进程。所以要是参数为1,即未创建服务和进程。

在sub_407F20中,我们可以发现他调用了两个函数:sub_407C40、sub_407CE0;

在sub_407C40上,我们可以看见它先是用sprintf打印 我们GetMoudleFileName()返回来的文件路径 -m security”。接着打开服务管理器,如果打开失败,就跳转到loc_407CCA,退出程序,否则接着执行0x00407C74。

在调用CreateServiceA()时,关注到它的参数lBinaryPathName、dwStartType、dwServiceType、dwDesiredAccess、DisplayName、ServiceName这几个参数。

1)lBinaryPathName,利用OD动态分析,可以发现它是我们上面sprintf的那段东西。

2)dwStartType = 0x2,指的是SERVICE_AUTO_START,类型是服务类型是:在系统启动期间服务控制管理器自动启动的服务,启动文件自启动服务。

3)dwServiceType = 0x10,指的是SERVICE_WIN32_OWN_PROCESS,在其自己的进程中运行服务,也就是独立进程独立服务。

4)dwDesiredAccess = 0xF01FF,指的是Service_All_Access,Windows安全模块该服务访问服务管理器和服务对象。

5)DisplayName、ServiceName指的是显示名称和服务名称。

这里的目的是,将WannaCry.exe创建服务使其自启动,服务名称是messecsv2.0。

接着,启动服务

接着,分析一下sub_407CE0,它的流程是GetModuleHandleW获得服务模块的句柄->CreateProcess、GetProAddress创建并且获得进程地址->CreateFile、GetProAddress创建文件并且获得它的地址->WriteFile、GetProAddress写入文件并且获得它的地址->closeHandle、GetProAddress关闭对象索引并且返回它的地址。

接着上面的顺序,就是一个if判断,判断上面的地址是否存在,

1)通过FindResourceA(),参数ResourceType = “R”,意思是资源类型为读、ResourceName = 0x727,也就是资源模块名称为0x727的文件,ebx = NULL,因为上面的if程序是将它们的地址与ebx作比较,在0x00407CF7上的指令是xor ebx, ebx;也就是将ebx变成0了。

2)接着,将FindResourceA()返回的句柄作为参数,调用LoadResource()函数,这个函数用于获取资源地址,以句柄的方式返回。

3)将LoadResource()的返回的句柄作为参数,调用LockResource()函数,这个函数用于获取资源的指针,也就是地址。

4)SizeofResource()将返回资源文件的大小。

当我们上面的对资源文件的检测都成功了,就会跳到0x00407DB9,这里可以分为三部分,

一部分是,1)它首先通过memset()函数,根据rep stosd的循环规律,次数是0x40->十进制64,EDI将会移动64*4字节,这里也总共等于数组Buffer的大小,我们也可以通过IDA的F5理解这段代码,xor eax, eax;即是将这块Buffer置为0。

2)再次通过memset,将NewFileName这个数组也置为0,它的大小跟Buffer一样大。

3)打印目录C:\WINDOWS\tasksche.exe在Buffer中和C:\WINDOWS\ qeriuwjhrf在NewFileName中。

4)利用MoveFileExA(),dwFlags = 0x1,即为MOVEFILE_REPLACE_EXISTING,如果存在名为 lpNewFileName 的文件,则函数会将其内容替换为 lpExistingFileName 文件的内容。但NewFileName和Buffer都还没有创建文件,所以,如果它创建了文件就将文件里的内容替换为Buffer的内容。

5)调用添加函数CreateFileA,参数dwDesiredAccess = GENERIC_WRITE(0x40000000),这指的请求访问文件为可读取,参数dwCreationDisposition = CREATE_ALWAYS(0x2),这指的是如果指定的文件存在且可写,则函数将覆盖文件,函数成功,最后错误代码设置为 ERROR_ALREADY_EXISTS (183)。如果指定的文件不存在并且是有效的路径,则会创建一个新文件,函数成功,最后错误代码设置为零。参数dwFlagsAndAttributes = FILE_SHARE_DELETE(0x4),指的是设置该文件为该文件是操作系统的一部分或完全使用的文件。

接着,如果创建taskche.exe成功的话,就会跳转到0x00407E54,在这里将会读写文件

然后还会调用一个dword_43144C,在OD中识别出了是closeHandle()。

通过memset(),将StartupInfo.lpReserved0填充,但是这段代码,我看不懂,也不知道有什么用,在OD里跟踪是这样的,IDA F5是两个memset()再加上strcat()。(如果有师傅看见了,可以提点我两句)

最后,这一部分就是为tasksche.exe创建进程,其中,设置的参数除了dwCreateFlags和lpCommandLine外,其它都为ebx,也就是等于0,dwCreationFlags = CREATE_NO_WINDOW (0x80000000),lpCommandLine要执行的命令行指向Butter的地址。

StartupInfo.cb = 0x44,指定结构体大小;StartupInfo.wShowWindow = SW_HIDE (0x1),StartupInfo.dwFlags = STARTF_FORCEOFFFEEDBACK + STARTF_USESHOWWINDOW (0x81)

总结一下,WannaCry.exe通过检查本地连接,要么服务器上将恶意程序添加到本地,要么就在资源文件中取出另名为tasksche.exe,并且目录C:\WINDOWS\tasksche.exe,为其载入进程,WannaCry.exe启动了开机自启动服务,也就是说,即使你卸载了tasksche.exe,WannaCry.exe还是会检查联网和taskche.exe然后继续启动。

下一篇是对tasksche.exe的解析,查看它是如何利用漏洞,如何解压资源包。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。