WannaCry病毒分析

WannaCry病毒分析——“永恒之蓝”漏洞利用

样本类型:勒索病毒
样本md5:84c82835a5d21bbcf75a61706d8ab549

标题

  • WannaCry病毒分析——“永恒之蓝”漏洞利用
    • 动态分析
    • 静态分析
      • IDA分析——本体
      • IDA分析——DLL导出函数TaskStart
      • 下载链接

动态分析

  1. 打开PM(Proecess Monitor)和 PE(Process Explorer)进行监控

  2. 运行恶意程序,
    WannaCry病毒分析_第1张图片

  3. 查看文件,发现所有的文件均被加密——后缀改为了“.WNCRY”,把后缀删除后发现并不能复原:
    WannaCry病毒分析_第2张图片

  4. 查看Process Explorer进程树,发现会多次执行cmd和其他exe文件:
    WannaCry病毒分析_第3张图片
    WannaCry病毒分析_第4张图片

  5. 我们来挨个分析:
    1) 程序直接拉起三个子进程

    • (PID 1496)进行文件隐藏
      在这里插入图片描述
    • (PID 5224)创建新用户并且赋予高级权限:
      在这里插入图片描述
    • (PID 5400)执行同路径下恶意程序taskdl.exe
      在这里插入图片描述

    2) 接下来子进程执行cmd执行批处理文件:

    • (PID 2468)执行批处理文件
      WannaCry病毒分析_第5张图片

    3) 接下来再次拉起taskdl.exe,与之前的操作一样。
    4) 继续往下,子进程执行@[email protected] (PID 696),此程序还会执行另外一个程序tasksvc.exe
    在这里插入图片描述
    在这里插入图片描述
    WannaCry病毒分析_第6张图片
    5) 继续往下,子进程再次调用Cmd(PID 4472)执行@[email protected](传递参数 vs),同时再次拉起taskse.exe和@[email protected](此次没有传参数) WannaCry病毒分析_第7张图片WannaCry病毒分析_第8张图片

    • 在第一次执行@[email protected](传递参数 vs)时,程序会再次调用cmd执行多个操作防止系统恢复:
      a) vssadmin删除系统卷影
      在这里插入图片描述
      b) wmic 删除卷影副本
      在这里插入图片描述
      c) bcdedit禁用Windows 7 的自动修复和自动恢复
      在这里插入图片描述
      WannaCry病毒分析_第9张图片
      d) wbadmin删除本地计算机上的备份目录
      WannaCry病毒分析_第10张图片

    • 再次程序taskse.exe,并且将@[email protected]作为参数传入
      WannaCry病毒分析_第11张图片

    • 直接执行@[email protected]

    6) 继续往下 ,执行Cmd添加注册表,将taskche.exe设置为自启动项:
    在这里插入图片描述
    7) 由于仅仅在有限时间内进行了PM监控,可以从上面的分析发现一直在重复的执行特定的exe程序。

  6. 接下来进行文件操作分析:
    1)我们进行常见的exe文件检查,在多个文件夹下创建 文件@[email protected]
    WannaCry病毒分析_第12张图片
    2) 创建多个@[email protected] fi WannaCry病毒分析_第13张图片
    3)由于恶意程序本体会将系统的中的文件进行加密,所以程序会遍历系统中的所有文件,故在进行文件操作分析时,不太容易发现可疑之处,故我们从恶意程序的文件夹进行初步查看:
    WannaCry病毒分析_第14张图片
    发现访问和创建了多个文件,其中创建的文件有:
    WannaCry病毒分析_第15张图片

  7. 进行注册表分析:
    1) 创建注册表项HKLM\Software\WanaCrypt0r
    WannaCry病毒分析_第16张图片
    2) 设置注册表键值对
    HKLM\SOFTWARE\WanaCrypt0r\wd
    HKCU\Control Panel\Desktop\Wallpaper
    WannaCry病毒分析_第17张图片
    WannaCry病毒分析_第18张图片

  8. 网络操作分析:
    1)发现@[email protected]和tasksvc.exe会进行进程通信
    WannaCry病毒分析_第19张图片
    2) tasksvc.exe 会向指定的ip发送数据并且进行通信,相关的IP地址有:
    WannaCry病毒分析_第20张图片

静态分析

  1. 查壳:无壳——C++6.0编写
    WannaCry病毒分析_第21张图片
  2. 查看输入表:
    KERNEL32.DLL: 获取文件属性,获取文件大小,读取、创建、删除文件,搜索、加载资源文件,创建互斥量,申请释放内存,创建文件夹,读取主机用户名,读取当前文件夹,加载库文件,创建终止进程等函数
    USER32.DLL: 打印字符串函数
    ADVAPI32.DLL: 创建、打开、启动服务,创建注册表,修改注册表键值,计算机服务管理,
    MSVCRT.DLL: C语言相关执行函数
    WannaCry病毒分析_第22张图片
  3. 发现资源节有其他数据,reourceHacker进行查看:
    根据其头部特征,可以知道该资源节是保存的压缩包格式。
    WannaCry病毒分析_第23张图片
    对资源节进行zip提取:
    WannaCry病毒分析_第24张图片
    发现解压文件需要输入密码:
    WannaCry病毒分析_第25张图片
  4. Strings分析
    其中的字符串太多,仅仅找到部分相关的字符串:
    1 ) 多个后缀为.wnry的字符串:结合前面的分析,可以知道这些文件为资源节中释放的文件
    2 ) 出现按taskdl.exe,taskse.exe和diskpart.exe:其中前两个为释放的资源文件;diskpart.exe的话,恶意程序可能以此重命名
    WannaCry病毒分析_第26张图片
    在这里插入图片描述
    在这里插入图片描述
  5. PEID进行加密函数分析:
    发现使用了多个加密算法和压缩算法。
    WannaCry病毒分析_第27张图片
    WannaCry病毒分析_第28张图片

IDA分析——本体

  1. 程序首先进行执行的参数个数和参数内容进行验证:
    1 ) 猜测其中的 “/i” 指令是install进行程序安装
    WannaCry病毒分析_第29张图片
  2. 继续往下,发现调用函数sub_401B5F,其传入的参数则是当前程序的句柄:
    WannaCry病毒分析_第30张图片
  3. 跟入函数sub_401B5F进行分析:
    1 ) 此函数首先获取系统目录,然后拼接得到ProgramData文件夹路径,再对此文件夹进行挂载获取此文件夹的属性,然后进行判断
    WannaCry病毒分析_第31张图片
    2 ) 继续往下,如果满足条件则跳转到loc_401C40处;反之则调用函数sub_401AF6,并且传入三个参数:第一个参数也是此程序运行时传入的第一个参数,第二个参数是一个字符串(根据对该地址的跟踪和交叉引用跟踪,可以判断它是一个服务名),第三个参数是系统的ProgramData文件夹路径
    WannaCry病毒分析_第32张图片
    跟入该函数,发现该函数即是创建ProgramData文件夹,并且切换当前程序运行目录为该目录,。
    3 ) 转到loc_401C40处,该处的地址首先进行一个路径为:“系统路径/ProgramData/Intel ”,然后创建目录,然后将该目录作为临时文件夹,其中的My_Create_Dir函数功能就是创建文件夹和修改指定的路径为临时文件夹:
    WannaCry病毒分析_第33张图片
  4. 跳出函数sub_401B5F,继续往下,发现调用函数copyFileA将程序复制并改名为 ”tasksche.exe” 并保存到当前路径下
    WannaCry病毒分析_第34张图片
  5. 接下来调用函数sub_401F5D,
    在这里插入图片描述
    1 ) 跟入该函数,发现该函数会首先调用sub_401CE8函数,
    跟如该函数:
    • 该函数打开服务管理器,然后打开指定的服务:
      WannaCry病毒分析_第35张图片
    • 该服务的名称被保存在一个内存地址中,但是该地址中的初始数据为空,需要结合动态调试去查看:
      在这里插入图片描述
    • 继续往下,如果服务不存在则创建此服务,此服务将调用cmd删除程序本体:
      WannaCry病毒分析_第36张图片
    • 也就是说此程序的功能就是创建服务,然后删除恶意程序本体
    2 ) 接下来调用函数sub_401EFF: 该函数进行打开互斥量
    在这里插入图片描述
    WannaCry病毒分析_第37张图片
    3 ) 继续往下,调用函数sub_401064: 该函数主要创建进程,运行刚刚复制的tasksche.exe程序
    WannaCry病毒分析_第38张图片
    4 ) 继续往下,调用函数sub_401EFF打开互斥量。
    5 ) 函数sub_401F5D的功能就是删除源程序并且打开指定的互斥量
  6. 跳出函数sub_401F5D,继续往下调用函数sub_4010FD,跟进该函数:
    1 ) 该函数首先拼接一个字符串:“software\”+“WanaCrypt0r”,并将此字符串保存在变量 “Dest” 中;并且用于创建注册表项。
    WannaCry病毒分析_第39张图片
    WannaCry病毒分析_第40张图片
    2 ) 继续往下:设置注册表键值为当前程序的完整路径
    WannaCry病毒分析_第41张图片
    3 ) 函数sub_4010FD的功能就是创建并设置注册表,进行程序持续化驻留
  7. 跳出函数sub_4010FD,继续往下,调用函数sub_401DAB和函数sub_401E9E
    在这里插入图片描述
  8. 分别对这两个函数进行分析,首先分析sub_401DAB:
    1 ) 此函数传入了两个参数,但是在附近仅仅只有一个push和一个mov指令,仔细分析后发现这个mov指令实际上操作的就是栈顶元素,所以它就是另外一个传入的参数,可以选中此代码处右键进行修改:
    在这里插入图片描述
    在这里插入图片描述
    2 ) 函数首先会找到并加载程序中资源节中名为 “XIA” 的资源,然后进行锁定(在我们进行静态分析的时候发现,该资源正是被加密的压缩文件):
    WannaCry病毒分析_第42张图片
    WannaCry病毒分析_第43张图片
    3 ) 继续往下,调用函数sub_4075AD,并且传入了三个参数: 一个字符串,资源数据长度,和加载的资源句柄。
    WannaCry病毒分析_第44张图片
    前面提到过,此资源节中的数据是被加过密的,此处传入了一个字符串"WNcry@2ol7" 和数据的句柄,那么就极有可能是在进行解密操作,继续跟踪:
    函数调用sub_4074A4 --> sub_406B8E --> sub_405FE2 进行解密操作。
    4 ) 对前面提取出的压缩文件,利用"WNcry@2ol7"作为密码进行解压尝试:
    成功解压
    WannaCry病毒分析_第45张图片
    5 ) 继续往下,调用函数sub_4075C4,并且对该函数进行了一个循环操作,该函数会传入三个参数:
    WannaCry病毒分析_第46张图片
    6 ) 进入函数该函数会调用sub_406C40
    WannaCry病毒分析_第47张图片
    7 ) 继续对sub_406C40函数进行分析,发现该函数非常复杂,我们暂且不进行深入分析。反过来对主函数sub_4075C4进行引用分析,发现该函数最终会调用ReadFile函数。
    WannaCry病毒分析_第48张图片
    8 ) 同时,在调用完sub_4075C4函数后会将其中的一个参数值与字符串“c.wnry” 进行对比,也就是说此函数可能是在进行指定资源提取(其中复杂的其他函数应该是在进行解密操作)。
    WannaCry病毒分析_第49张图片
    9 ) 继续往下,调用完sub_4075C4函数后会调用函数sub_40763D:
    WannaCry病毒分析_第50张图片
    10 ) 对函数sub_40763D进行分析,发现其会调用函数sub_407603,而sub_407603函数的功能和前面sub_4075C4函数的结果一样,可以看出这两个函数基本上采用了同一个结构,应该是传入的对象不同而已,也就是说函数sub_40763D也应该是对指定资源进行提取。
    WannaCry病毒分析_第51张图片
    WannaCry病毒分析_第52张图片
    11 ) 同样地,我们也对sub_40763D函数进行交叉引用分析,发现此函数的结构更为复杂,但其中也有一个执行逻辑指向ReadFile函数,这也应证了我们前面的猜测——函数sub_40763D也应该和sub_4075C4函数一样,用于对指定资源进行提取
    WannaCry病毒分析_第53张图片
    12 ) 退出sub_401DAB,继续往下,分析sub_401E9E:该函数内部首先出现了三个字符串,类似加密后的字符串,字符串被加载到内存中,紧接着调用函数sub_401000:
    WannaCry病毒分析_第54张图片
    13 ) 跟入该函数sub_401000,该函数传入两个参数,一个是变量,另一个是数字1;该函数根据传入的参数进行一个模式选择,根据字符串可以猜测是对文件进行操作,一个是读“rb”,一个是写“wb”,其中操作的文件正是压缩文件中的“c.wnry”;此处由于传入的参数是1,所以此处的模式是以二进制的方式进行读数据:
    WannaCry病毒分析_第55张图片
    14 ) 接下来,再根据操作模式对文件 “c.wnry” 进行写入或者读出指定大小的数据,此处的函数调用依然是读数据,将读取的数据保存到变量DstBuf中:
    WannaCry病毒分析_第56张图片
    15 ) 继续往下,如果成功打开文件并进行读/写,则函数sub_401000返回的eax值为1,反之为0。
    16 ) 退出函数sub_401000,回到函数sub_401E9E中继续往下,如果调用函数sub_401000成功对 “c.wnry” 进行了操作,则函数返回;反之则再次调用函数sub_401000向文件 “c.wnry” 写入指定文件:
  9. 退出函数sub_401E9E,我们前面分析出了函数sub_401E9E中会对“c.wnry” 进行操作,那么就说明,前面的函数sub_401DAB已经对资源节中的文件进行了解压和解密。
  10. 继续往下,分别调用两次函数sub_401064,该函数sub_40106在sub_401EFF中已经分析过,主要是创建进程,分别的参数为 “attrib +h .” 和 “icacls . /grant Everyone:F /T /C /Q”
    WannaCry病毒分析_第57张图片
    这两个程序命令为DOS命令,分别用于隐藏程序和修改当前文件夹权限并创建一个新用户授予所有访问权限。
  11. 接下来调用函数sub_40170A,该函数用于加载各种函数:
    1 ) 微软官方加解密函数
    WannaCry病毒分析_第58张图片
    2 ) 其他函数:
    WannaCry病毒分析_第59张图片
  12. 继续往下分析,调用函数sub_4012FD进行资源和对象初始化,然后将资源对象传入函数sub_401437中
    WannaCry病毒分析_第60张图片
  13. 进入函数sub_401437,发现该函数会多次调用函数sub_401861进行类似校验任务,同时进行内存分配,在进行交叉引用时发现还会调用微软的解密相关函数CryptReleaseContext和文件操作函数。
    WannaCry病毒分析_第61张图片
    WannaCry病毒分析_第62张图片
  14. 既然在交叉引用中发现了微软的解密相关函数CryptReleaseContext,我们再仔细地对相关的函数进行查看:
    1 ) 发现在函数sub_40182C中发现了微软加解密模块和一个内存地址的函数调用,跟如该函数的交叉引用后发现,该函数在前面的函数加载模块被定义,该函数正是微软加解密函数的CryptImportKey模块用于进行密钥导入:
    WannaCry病毒分析_第63张图片
    WannaCry病毒分析_第64张图片
    2 ) 同时,还会发现其他的加解密函数也被调用,我们在此将这些函数带入模块对应的内存地址进行重命名,便于后面的分析。
  15. 所以函数sub_401437的主要功能就是进行加密相关的准备工作(如密钥导入)和内存分配等任务。
  16. 继续分析,字符串“t.wnry“ 和之前被sub_401437使用的对象var_6E4 被传入函数sub_4014A6,函数sub_401437的功能是进行加密相关的准备工作,那么对象var_6E4就应该是相关的加密/解密模块,用于对“t.wnry“进行解密。
    WannaCry病毒分析_第65张图片
  17. 进入函数sub_4014A6进行分析,该函数被传入了三个参数:一个加解密模块,一个文件名 “t.wnry”,一个新分配的变量:
    1 ) 首先调用函数createfileA打开文件“t.wnry“,此处的CreateFileA函数的打开模式参数为3,所以是进行文件打开而不是创建(当参数为4时,进行文件创建):
    WannaCry病毒分析_第66张图片
    2) 然后计算文件大小:
    WannaCry病毒分析_第67张图片
    3) 接下来进行以长串的判断操作,其中频繁出现函数dword_40F880,对其进行交叉引用分析,发现正是前面加载函数中的readfile函数,那么此处就是在对文件进行校;多次调用readfile函数,每次读取指定位置的数据来检查文件的完整性:
    WannaCry病毒分析_第68张图片
    4) 继续往下,调用函数sub_4019E1,该函数用于生产随机的密钥对,并进行返回:
    WannaCry病毒分析_第69张图片
    5) 继续往下,调用函数sub_402A76,该函数传入多个参数:其中包括生成的密钥对和内存地址,猜测此函数进行加密相关的数据操作。
    在这里插入图片描述
    6) 继续往下,再次读取 “t.wnry” 中的所有内容,同时将数据保存在V3对象中,偏移地址为306;如果读取成功并且满足条件,则接下来会调用函数sub_403A77,该函数的参数包含利用密钥对进行计算的相关模块,还有V3对象中的 “t.wnry” 的数据,同时还有一个新分配的内存地址;那么我们有充分里的理由推测,此函数是在对“t.wnry”中的内容进行加/解密:
    WannaCry病毒分析_第70张图片
    7) 跟入函数sub_403A77,发现该函数从静态分析,很难分析出内容,其中包括较多且复杂的加解密操作,因此我们需要结合OD进行动态分析:
    在函数sub_403A77传入的参数处下断,然后找到新分配的内存地址——004016B4,然后进行内存数据监控,单步执行,执行到函数sub_403A77结束后,内存中的数据变为了一个以PE格式的文件;继续往下执行,得到数据的长度为00010000h。
    WannaCry病毒分析_第71张图片
    8) 将内存中的文件转存下来,暂且保存为exe格式,然后用PEID打开查看:
    数据转存:将OD中指定的地址用二进制复制,然后在一个新的文件中写入,需要保证数据大小为10000h。
    WannaCry病毒分析_第72张图片
    WannaCry病毒分析_第73张图片
    i. 发现此格式的PE文件其实是DLL文件
    WannaCry病毒分析_第74张图片
    ii. 查看输入输出表:
    输出表中有一个函数——TaskStart
    WannaCry病毒分析_第75张图片
    输入表比较复杂:
    KERNEL32.DLL:修改文件时间、遍历文件、睡眠、获取临时文件名、读写修改文件、复制/创建文件、创建进程、创建线程、打开/创建互斥量、创建文件夹、删除文件、移动文件、获取当前进程信息、加载库文件等函数
    USER32.DLL: 查询计算机系统参数
    ADVAPI32.DLL: 导出密钥、读取系统安全设置、读取/修改系统安全信息、读取计算机用户名、获取进程凭证等函数
    SHELL32.DLL: 获取指定的系统路径等函数
    WannaCry病毒分析_第76张图片
  18. 因此,函数sub_4014A6的主要功能就是对 “t.wnry” 进行解密,然后导入内存。
  19. 继续往下,调用函数sub_4021BD,该函数传入了两个 参数,一个是保存在内存中“t.wnry”的数据首地址,另一个是该数据段的长度。
    WannaCry病毒分析_第77张图片
  20. 进入函数sub_4021BD进行分析,该函数再次调用了sub_4021E9函数,并且将sub_4021BD传入的参数做了传递:
    WannaCry病毒分析_第78张图片
    继续跟踪,发现该函数内部的操作比较复杂,通过部分的代码推测:该函数的功能主要是对内存中的数据进行了校验:
    WannaCry病毒分析_第79张图片
  21. 退出sub_4021BD继续往下,调用函数sub_402924并且传入字符串 “TaskStart” 和前面提到的“t.wnry” 解密后在内存中的地址;进入该函数分析,并不能发现明显的函数调用相关信息,但是我们前面分析过“t.wnry”保存在内存中的数据是DLL格式的,并且有一个导出函数正好名为 ”TaskStart”,那么函数sub_402924在此处应该就是获取”TaskStart” 函数在内存中的地址,通过eax返回。
    WannaCry病毒分析_第80张图片
  22. 继续往下,发现call eax 那么就证实了上面的猜测:
    WannaCry病毒分析_第81张图片
  23. 继续往下分析,最后调用函数sub_40137A,传入的参数是内存数据的首地址:通过对该函数的跟入分析,发现该函数主要是进行一些内存释放工作。
  24. 到此位置,wannacry恶意程序的本体就分析完成,通过上面的分析,我们并没有发现对被感染主机进行文件感染和加密的操作,目前已经分析出的主要操作有:
    1) 自我复制tasksche.exe到系统路径下
    2) 删除源程序并且执行复制后的程序
    3) 创建注册表项并且添加恶意程序的路径到注册表中,实现恶意程序在主机上驻留
    4) 隐藏而已文件并且创建带有高级权限的新用户
    5) 进行文件解密和解压操作
    6) 对解压的文件进行加载
    7) 对解压的文件进行解密操作并且进行格式转换
    8) 从解密的文件中调用导出函数,并且执行
  25. 接下来分析内存中的DLL文件(“t.wnry” 解密得到)及其导出函数功能TaskStart:

IDA分析——DLL导出函数TaskStart

  1. 首先查看DLLMain函数,并没有特别的操作:
    WannaCry病毒分析_第82张图片
  2. 接下来分析TaskStart函数,先看看交叉引用:
    我的天,也太复杂了,俺的内心是拒绝的(@_@)
    WannaCry病毒分析_第83张图片
  3. 硬着头皮上吧/(ㄒoㄒ)/~~,此函数有两个参数,从恶意程序本体的函数调用上可以知道,这两个参数都是NULL。
    WannaCry病毒分析_第84张图片
  4. 继续往下,首先调用函数sub_10004690,进入该函数分析:
    1) 首先调用createMutex创建互斥量 “MsWinZonesCacheCounterMutexA”
    WannaCry病毒分析_第85张图片
  5. 接下来调用函数GetModuleFileNameW,由于传入句柄参数为NULL,则获取当前程序的执行路径:
    WannaCry病毒分析_第86张图片
  6. 接下来调用函数wcsrchr搜索当前程序中路径中的最后一个字符 “\”,并返回该位置的指针;如果查询成功,则对字符串进行截断,获取当前程序的目录。
    WannaCry病毒分析_第87张图片
  7. 继续往下,设置当前程序工作目录为程序在磁盘中的目录,然后调用函数sub_10001000
    WannaCry病毒分析_第88张图片
    1) 进入该函数后,发现函数sub_10001000和本体程序中的函数00401000一样,是将 ”c.wnry” 写到内存中,此处的内存地址为unk_1000D958:
    在这里插入图片描述
    WannaCry病毒分析_第89张图片
  8. 继续往下,调用函数sub_100012D0,进入函数sub_100012D0:
    1) 该函数首先进行缓冲区初始化,再调用函数sub_100011D0,该函数传入的参数正好是申请的内存空间Buffer:
    WannaCry病毒分析_第90张图片
    2) 进入sub_100011D0函数分析,函数首先获取当前进程句柄,然后获得进程的token/访问令牌:
    WannaCry病毒分析_第91张图片
    • 继续往下,对当前进程的token进行解析,获得详细信息:
    WannaCry病毒分析_第92张图片
    • 再往下,加载 “advapi32.dll”,并从内存中找到 “ConvertSidToStringSidW” 函数地址:
    WannaCry病毒分析_第93张图片
    • 继续往下,调用ConvertSidToStringSidW函数将获取到的进程token信息进行格式转换,保存在Source变量中:
    WannaCry病毒分析_第94张图片
    3) 结合上面的分析,我们知道函数sub_100011D0的功能是获取进程的token信息进行保存,由于函数sub_100011D0仅传入了一个参数变量Dest,那么token的信息将被保存到Dest 变量中。
    4) 继续往下有两个逻辑分支,如果获取token成功则检查token信息是否包含“S-1-5-18”;如果获取token失败,则获取用户名,检查是否为 “system” ;此处的操作就是在检查当前用户的权限。
    WannaCry病毒分析_第95张图片
    5) 因此sub_100012D0函数的主要功能就是检查当前程序运行的用户权限是否是具有足够的权限。
  9. 继续往下,调用函数sub_10003410,该函数首先调用sub_10004440从“advapi32.dll”中获取加解密相关的函数地址,同时从“kernel32.dll” 获取一些文件操作函数在系统的内存地址:
    sub_10004440中加解密相关的函数:
    WannaCry病毒分析_第96张图片
    文件操作函数:
    WannaCry病毒分析_第97张图片
  10. 继续往下,进行字符串拼接,三个字符串分别与内存中的数据进行拼接
    WannaCry病毒分析_第98张图片
    在OD中调试可以发现三个文件分别是:00000000.res, 00000000.pky, 00000000.eky 其中后两个文件分别是RSA加密中的公钥和私钥;说明在后面将执行RSA相关的操作。
    WannaCry病毒分析_第99张图片
    WannaCry病毒分析_第100张图片
  11. 接下来调用函数sub_10004600,
    1) 该函数首先打开互斥量 "Global\MsWinZonesCacheCounterMutexW”
    WannaCry病毒分析_第101张图片
    2) 如果打开互斥量失败,则会重新创建该互斥量:
    WannaCry病毒分析_第102张图片
    WannaCry病毒分析_第103张图片
    3) 接下来调用函数sub_100013E0,该函数通过设置ACL进行权限提升
    WannaCry病毒分析_第104张图片
    4) 所以sub_10004600函数的主要功能是打开/创建互斥量,然后进行权限提升。
  12. 继续往下,调用函数sub_10004500,跟入该函数进行分析:
    1) 该函数首先得到一个dky文件,通过OD动态得到该文件名——1000D8A8.dky
    WannaCry病毒分析_第105张图片
    2) 继续往下,调用函数sub_10003A10进行临界区初始化,调用函数sub_10003D10进行操作,进入该函数后会发现加解密的相关函数,我们可以推测此函数主要进行加解密的相关操作:
    函数先对测试数据进行加密,然后解密进行对比,检查相应的操作是否成功。
    WannaCry病毒分析_第106张图片
    3) 因此函数sub_10004500的功能是进行加解密相关的操作测试。
  13. 继续往下,调用函数sub_10003A10进行临界区初始化,接下来再调用函数sub_10003AC0,其中传入三个参数,其中两个是前面创建的公钥和私钥,另一个参数用ecx进行传递,是初始化后的临界区地址:
    WannaCry病毒分析_第107张图片
    跟入函数sub_10003AC0进行分析,此函数主要为后面的加解密操作做准备——产生加密使用的公钥和私钥:
    WannaCry病毒分析_第108张图片
    WannaCry病毒分析_第109张图片
  14. 继续往下,调用函数sub_100046D0,跟入该函数,发现该函数是主要是打开00000000.res文件,并且读取其中的指定数据(但是从前面的分析中,我们发现该文件并没有被创建,故应该会打开失败)
    WannaCry病毒分析_第110张图片
  15. 继续往下,会删除00000000.res文件,保证res文件的唯一性。
    在这里插入图片描述
  16. 继续往下,调用函数sub_10004420生产加密随机数,并且保存在pbBuffer中
    WannaCry病毒分析_第111张图片
  17. 接下来,创建线程,代码起始处为sub_10004790:
    WannaCry病毒分析_第112张图片
    跟入函数sub_10004790,该函数调用sub_10004730,进行00000000.res文件创建,并且将上面的pbBuffer中的数据写入其中:
    WannaCry病毒分析_第113张图片
  18. 继续往下,进行睡眠0.1秒,再创建一个线程,此线程的首地址是sub_100045C0,
    WannaCry病毒分析_第114张图片
    跟入地址sub_100045C0,该函数调用函数sub_10004500,此函数我们在前面已经分析过了,此函数的主要功能是进行加解密相关的操作测试。
    WannaCry病毒分析_第115张图片
  19. 继续往下,会再次创建两个线程,入口地址分别是sub_10005730和sub_10005300:
    WannaCry病毒分析_第116张图片
  20. 先跟入地址sub_10005730,该地址处会先进行磁盘驱动器检索和遍历,如果没有新的磁盘加入,则函数sub_10005730就会执行其中的一个循环——持续对驱动器进行检测,如果发现有新的磁盘加入,则会创建线程对新的驱动器中的文件进行操作,线程首地址是sub_10005680:
    WannaCry病毒分析_第117张图片
    由于在进行OD调试中没有新从磁盘插入,故这个线程中下段是不会断下的。
  21. 接下来跟入线程sub_10005300,该线程中会在一个循环中检测dword_1000DD8C内存地址中的数据,并且调用函数sub_10001080,其中传入的参数包含一个字符串"taskdl.exe"。
    WannaCry病毒分析_第118张图片
    跟入函数sub_10001080,该函数首先创建一个进程,执行当前程序路径下的 “taskdl.exe”,该程序也正是压缩文件中释放的文件之一。
    WannaCry病毒分析_第119张图片
  22. 退出线程sub_10005300,继续往下发现创建新的线程sub_10004990:
    WannaCry病毒分析_第120张图片
    1)跟入线程地址sub_10004990,发现改地址处首先向c.wnry文件中写入数据:
    WannaCry病毒分析_第121张图片
    2) 接下来调用函数sub_10004890,
    WannaCry病毒分析_第122张图片
    • 跟入函数sub_10004890,该函数首先调用函数sub_10001360检查运行当前程序的用户是否具有管理员权限。
    WannaCry病毒分析_第123张图片
    • 接下来,将获取@[email protected]文件的完全路径,然后与字符串 “taskse.exe”进行拼接得到新的字符串——像是向“taskse.exe” 运行传参一样(其中“taskse.exe”也是解压文件中的文件之一):
    WannaCry病毒分析_第124张图片
    WannaCry病毒分析_第125张图片
    • 继续往下,调用函数sub_10001080创建进程,并且将刚刚拼接得到的字符串作为参数传入,作为进程执行的命令。
    WannaCry病毒分析_第126张图片
    • 继续往下,对内存地址dword_1000DD94中的数据进行检测,如果该值为0则直接创建进程拉起 “@[email protected]
    WannaCry病毒分析_第127张图片
    • 所以函数sub_10004890的主要功能就是执行 "@[email protected]"和 “taskse.exe” 两个子程序。
    3) 跳出函数sub_10004890,继续往下,会获取 “tasksche.exe” 的完整路径,并且将路径传入函数sub_100047F0中
    WannaCry病毒分析_第128张图片
    4) 跟入函数sub_100047F0,发现注册表自启动字符串,同时还有cmd 相关执行命令进行注册表项添加和创建进程函数,因此可以推断处,此函数主要是实现 “tasksche.exe” 在被感染主机的驻留和自启动:
    WannaCry病毒分析_第129张图片
    WannaCry病毒分析_第130张图片
    5) 因此,线程sub_10004990的主要功能就是执行执行 "@[email protected]"和 “taskse.exe” 两个子程序,同时将"tasksche.exe"添加到注册表项实现自启动。
  23. 跳出线程sub_10004990,接下来会调用函数sub_100057C0
    WannaCry病毒分析_第131张图片
    跟入函数sub_100057C0,该函数首先调用函数sub_10001590进行内存分配和临界区初始化,接下来调用函数sub_10001830进行相关的加解密操作:
    WannaCry病毒分析_第132张图片
    1) 跟入函数sub_10001830;该函数内部首先调用sub_10003AC0函数为后面的加解密操作做准备——产生加密使用的公钥和私钥(在前面已经分析过):
    WannaCry病毒分析_第133张图片
    函数sub_10001830会再次创建一个线程,跟入线程的首地址,改地址处调用函数sub_100029F0,进入该函数进行分析,由于此处进行静态分析比较困难,故结合OD进行动态调试:
    • 首先,函数进行一个循环操作进行临界区访问,通过一个循环,对文件进行遍历,遍历后的对象地址被保存在edi中,后面进行继续操作(其中10002A54处的操作,会出发底层系统函数的调用,不过还没搞清楚是怎么回事,希望哪位大佬给解释一下,留下了没有技术的眼泪 /(ㄒoㄒ)/~~;此处找到遍历对象的地址是通过OD单步调试发现的):
    WannaCry病毒分析_第134张图片
    • 接下来,检查ebp中是否保存有上次生成的临时文件下的WNCRYT文件路径,文件的初始值为
    (UNICODE “C:\Users\SUPERV~1\AppData\Local\Temp\0.WNCRYT”)
    WannaCry病毒分析_第135张图片
    WannaCry病毒分析_第136张图片
    WannaCry病毒分析_第137张图片
    • 继续往下,将当前遍历的文件路径移动到临时文件夹下,并且以WNCRYT作为后缀,根据顺序进行排名1. WNCRYT,2.WNCRYT,…
    WannaCry病毒分析_第138张图片
    • 如果移动失败,则对文件的属性进行查询,满足条件则修改文件属性,然后删除该文件:
    WannaCry病毒分析_第139张图片
    • 如果成功移动了文件,则创建新的文件名供下次移动文件使用:
    Sprintf函数的其中一次参数:
    WannaCry病毒分析_第140张图片
    WannaCry病毒分析_第141张图片
    • 如果再次移动文件失败,则再次尝试删除文件:
    WannaCry病毒分析_第142张图片
    • 然后进行下一个文件的遍历。
    • 所以,线程sub_100029F0的主要功能是进行文件的遍历和文件移动和重命名
    2) 故函数sub_10001830  创建线程  sub_100029F0 的主要功能是:
    • 产生加密使用的公钥和私钥,为加密做准备
    • 进行文件的遍历和文件移动和重命名
  24. 继续往下,如果函数sub_10001830成功执行,则调用函数进行 “f.wnry”文件的属性进行检查;然后调用sub_10004730,函数sub_10004730的功能在49步中已经分析过,该函数的功能是进行00000000.res文件创建,并且将上面的pbBuffer中的数据写入其中。
  25. 接下来将再次进行字符串拼接,然后创建进程执行"@[email protected]",同时将读取c.wnry中的数据。
    WannaCry病毒分析_第143张图片
  26. 继续往下,将调用函数sub_10004CD0、sub_10004DF0和函数sub_10005480:
    WannaCry病毒分析_第144张图片
  27. 分别对这三个函数的功能进行分析,首先是sub_10004CD0:
    1) 函数首先对文件"@[email protected]"进行检查,如果不存在则重新创建文件(将压缩文件中的 u.wnry复制重命名为"@[email protected]"),如果exe文件存在则再判断 .link文件是否存在 :
    WannaCry病毒分析_第145张图片
    2) 如果 .link文件不存在,则创建一个新的 .link文件:
    3) 在创建新的 .link文件时,首先发现一长串的DOS命令出现:
    WannaCry病毒分析_第146张图片
    4) 然后获取当前工作文件夹路径:
    WannaCry病毒分析_第147张图片
    5) 然后对上面获取到的字符串和内存中的字符串进行了拼接:
    WannaCry病毒分析_第148张图片
    其中用OD观察到的示例如下:
    WannaCry病毒分析_第149张图片
    6) 继续往下,调用函数sub_10001140,并且将上述拼接得到的字符串作为参数传入:
    在这里插入图片描述
    7) 跟入函数sub_10001140,发现该函数将随机生产一个bat文件名,然后用fopen函数创建此bat文件,并且将参数传入的字符串写入到bat文件中:
    WannaCry病毒分析_第150张图片
    8) Bat文件创建成功后,还会向其中写入一个DOS命令:
    WannaCry病毒分析_第151张图片
    9) 到此,整个函数sub_10004CD0的功能就分析完成了,它的主要功能则是:
    • 检查"@[email protected]"是否存在,如果不存在则重新创建
    • 检查"@[email protected]"是否存在,如果不存在则重新创建
  28. 跳出函数sub_10004CD0,接下来分析函数sub_10004DF0:
    1) 函数首先会检查"@[email protected]" 是否存在,如果不存在则从 “r.wnry” 文件中读取指定位置的数据,然后创建"@[email protected]"并把从“r.wnry”中读取的数据写入文件。
    WannaCry病毒分析_第152张图片
    WannaCry病毒分析_第153张图片
    2) 接下来产生一个勒索的金额字符串:
    WannaCry病毒分析_第154张图片
    3) 再次进行多个字符串拼接,然后将得到的字符串写入文件:
    WannaCry病毒分析_第155张图片
    其中OD得到的字符串示例如下:
    WannaCry病毒分析_第156张图片
    4) 因此,函数sub_10004DF0的功能就分析完成了,该函数的主要功能是生成勒索文档——“@[email protected]
  29. 跳出函数sub_10004DF0,继续往下,调用了函数sub_10005480,下面对该函数进行分析:
    • 首先调用SHGetFolderPathW获取系统特殊的文件夹路径,其中目标的文件夹选项由内存中word_1000D918的数据确定。
      WannaCry病毒分析_第157张图片
      利用OD调试得到的文件夹路径为当前系统用户的桌面路径:
      WannaCry病毒分析_第158张图片
    • 接下来再次调用SHGetFolderPathW函数,此处获取的是当前系统用户的Documents路径:
      WannaCry病毒分析_第159张图片
    • 接下来调用函数sub_100027F0,传入的参数正是Documents文件夹路径:
      WannaCry病毒分析_第160张图片
    • 跟入函数sub_100027F0,
      - 该函数会首先调用函数sub_10002300,
      - 再跟入函数sub_10002300
      • 该函数调用了FindFirstFileW和FindNextFileW进行循环,实现文件遍历
        在这里插入图片描述
        WannaCry病毒分析_第161张图片
        • 遍历到文件后会进行文件对比:如果发现是 “.”当前文件夹 和 “…” 上级文件夹的目录时则自动寻找下一个文件:
          WannaCry病毒分析_第162张图片

        • 其他遍历的文件则会检查是否是"@[email protected]"、“@[email protected]” 或者"@[email protected]" 文件,如果是这三个文件则进行跳过,继续遍历下一个文件。
          WannaCry病毒分析_第163张图片

        • 对于其他的文件则调用函数sub_10002D60进行处理:
          • 此函数首先进行文件类型判断:
          WannaCry病毒分析_第164张图片
          • 依次判断的文件类型的 “.exe”, “.dll” 和 “.WNCRY”;对于这三种格式的文件进行不同的操作,“.exe” 和 “.dll” 类型的文件时,函数结束,返回值为1(eax值);“.WNCRY” 类型的文件时,函数结束,返回值为6(eax值):
          WannaCry病毒分析_第165张图片
          WannaCry病毒分析_第166张图片
          • 接下来是内存中的其他类型——保存在内存地址off_1000C098中:
          WannaCry病毒分析_第167张图片
          • 如果文件类型命中内存地址off_1000C098中的一个,则函数结束,返回值为2(eax值):
          WannaCry病毒分析_第168张图片
          • 接下来是内存中的另一类其他类型——保存在内存地址off_1000C0FC中:
          WannaCry病毒分析_第169张图片
          • 如果文件类型命中内存地址off_1000C0FC中的一个,则函数结束,返回值为3(eax值):
          WannaCry病毒分析_第170张图片
          • 接下来会再次判断,如果是".WNCRYT" 则函数结束,返回值为4(eax值),如果是".WNCYR" 则函数结束,返回值为5(eax值)
          WannaCry病毒分析_第171张图片
          • 对此函数的文件类别识别功能进行汇总:
          a) “.exe” 和 “.dll” 返回1
          b) off_1000C098中的文件类型 返回2
          c) off_1000C0FC中的文件类型 返回3
          d) “.WNCRYT” 返回4
          e) “.WNCYR” 返回5
          f) “.WNCRY” 返回6

        • 因此函数sub_10002D60的功能就是进行文件类型识别

        • 接下来将根据文件的类型进行不同的操作:
          • 对于文件类型标识值为1和6(即".exe",“.dll” 和 “.WNCRY” 文件)的则进行跳过
          • 对于其他具备操作条件的文件则进行文件名和文件路径保存:
          WannaCry病毒分析_第172张图片

        • 接下来将对被复制的文件进行操作,操作函数为sub_10002940:
          WannaCry病毒分析_第173张图片
          跟入函数sub_10002940:
          调用函数sub_10002E70对被操作文件名和内容进行检测,根据不同的返回值执行不同的操作:
          在这里插入图片描述
          WannaCry病毒分析_第174张图片
          可以看出,主要的操作函数是sub_10002200,其中的参数被操纵文件和数字3或者4;另外一个操作就是删除文件。
          跟入函数sub_10002200:
          函数首先对被操纵文件进行复制:
          WannaCry病毒分析_第175张图片
          接下来再次进行文件后缀检查:
          WannaCry病毒分析_第176张图片
          如果后缀不是".WNCRY",则将文件本身的后缀名与 “.WNCRY” 进行拼接:
          WannaCry病毒分析_第177张图片
          继续往下,如果 “原始文件+.WNCRY” 文件不存在,则继续往下执行,调用函数sub_10001960(进行文件加密)
          WannaCry病毒分析_第178张图片
          跟入函数sub_10001960:

          • 函数首先进行文件打开,此处用的CreateFile函数,但是其中的文件操作参数其中dwCreationDisposition传入值为3,故是打开文件,如果操作值是4则是创建文件:
            WannaCry病毒分析_第179张图片

          • 继续往下,如果打开文件失败,则函数返回;如果打开文件成功,则执行接下来的操作:
            WannaCry病毒分析_第180张图片

          • 继续往下,获取文件时间信息,然后读取文件前8个字节的数据:
            WannaCry病毒分析_第181张图片

          • 接下来将读取到的数据与字符串"WANACRY!"进行比较:
            WannaCry病毒分析_第182张图片

          • 接下来将进行多个条件判断(此处的文件内容判断可以从后面的加密过程得出,因为判断的这些数据正式加密过程中写入的指定数据),对文件的指定位置的数据进行判断,判断文件是否已经被加密:
            WannaCry病毒分析_第183张图片

          • 继续往下,又将文件的指针设置到开始处:
            WannaCry病毒分析_第184张图片

          • 如果函数起始处传入的操作数是4,则接下来跳转到地址10001BB7处进行执行;传入其他操作数,则程序将跳转到loc_10001C5B,接下来分别分析这两块地址的操作:

            • 先分析10001BB7
            • 首先拼接字符串得到名为 原始文件名+“WNCRYT“ 的一个新文件名;然后创建此文件,此时文件是空文件:
              WannaCry病毒分析_第185张图片
            • 接下来,如果文件创建失败,则会再次进行尝试;如果文件创建成功,则进行一些内存赋值,然后跳转到loc_10001D2E (此地址处也是loc_10001C5B分支的跳转地址,也就是说先分析10001BB7分支的功能已经分析完成了——创建“WNCRYT”文件)
            • 再分析loc_10001C5B分支
            • 此分支的代码也比较迷,不断地在对内存中的文件进行读写,但是读写的数据都是同一内存地址的数据,不太懂是什么操作:
              WannaCry病毒分析_第186张图片
            • 这两个分支的功能都分析完了
          • 接下来从loc_10001D2E地址处继续分析,改地址处会对函数传入的操作数,文件大小等参数进行检查,然后再调用函数sub_10004370
            WannaCry病毒分析_第187张图片

          • 跟入函数sub_10004370进行分析:
            此处省略…

下载链接

这个排版转换实在是太恶心了,还剩好几十页,实在是绷不住了,准备上传PDF到github,感兴趣的朋友自行下载吧,github链接
O(≧口≦)o

你可能感兴趣的:(病毒分析,网络,安全)