zoukankan      html  css  js  c++  java
  • Wannacry分析

    一、加密程序(WannaCryptor.exe)

    1.释放

    ①概览

     

    ②细节

    加载资源(多个zip文件),使用开源代码解压,zip文件标志(PK…)

          

         解压所得:

        b.wry (bmp)

      c.wry (含有一些网址,torproject等)

      m.wry (rtf)

      r.wry (txt)

      t.wry (加密的dll)

      u.wry (vc6.0 MFC)

       

      通过CSP获取RSA_AES提供者句柄,导入RSA 私钥句柄,这是用于解密dll

      

      KEY BLOB(篇幅过长,仅显示部分)

     

    读取被加密dll文件信息,加密文件头部含有经2048RSA加密过的AES密钥得到的256字节密文

     

    解密256字节密文得到16字节明文(AES密钥)再用AES密钥解密文件得到dll

     

    注:这时可以从内存中dump出dll文件(我的方式是直接从OD内存中复制16进制,粘贴到010ed

    将dll 按0x1000粒度对齐并加载到imagebase。

    实现:修复IAT,修复重定位,修复区段内存属性,调用tls, 调用DllEntryPoint

     

    获取并调用dll唯一的一个导出函数

     

    2.加密(StartSchedule)

    Ⅰ.总览

     

     

     

    Ⅱ.细分

     ①设置当前目录到注册表

     

    ②如果系统版本为vista以后,创建计划任务,否则,添加注册表启动项

     

    创建计划任务方式

    命令行:

     

    1.xml内容

     

    查看计划任务:

    控制面板->系统和安全->管理工具->计划任务

    每一分钟调用一次加密程序

      

    ③批处理添加!WannaDecryptor!.exe快捷方式

     

    生成bat文件并调用

     

    ④生成勒索文档

     

    勒索内容:

     

    ⑤生成随机2048RSA密钥对,并将其公钥存入文件,私钥被导入的2048RSA公钥加密,存入文件。

     

    ⑥线程一

    每隔25秒,获取当前时间,并向.res文件中(覆盖式)写入时间和随机八字节数据

    表层:

     

    内层:

      生成8字节随机数据

       

           线程内:

        

    ⑦线程二

    测试RSA公钥/私钥(加密极小文件,演示解密所用密钥),需要保存私钥的文件存在才能运行。

          

    ⑧线程三

    检测新加的磁盘,加密,并写入垃圾数据

     

    ⑨线程四

    在前置条件成立情况下(初始不成立),创建进程 !WannaDecryptor!.exe

     

    Ⅲ.加密

    A.最核心加密函数(多次调用)被我命名为Encrypt_A_directory

    其内部函数调用:

    1.调用first_round_encrypt函数,遍历文件,分别保存文件夹路径和文件路径在不同的双向链表中,然后遍历文件路径链表,调用encrypt_by_fileType,将未加密文件的路径放入新的链表,以待后续加密。

    2.遍历保存文件路径的双向链表,调用encrypt_by_fileType,实现对未加密文件的加密。

    3.遍历保存文件夹路径的双向链表,在每个文件夹下,添加勒索信息文件和解密工具快捷方式

    4.释放链表

    B. first_round_encrypt函数分析

    1.保存文件夹路径

     

    2.保存文件路径

     

    3.遍历链表,加密文件,核心函数encrypt_by_fileType

     

    C. encrypt_by_fileType函数分析

    对文件类型进行选择,调用aes_encrypt

     

    D. aes_encrypt函数分析

    根据文件类型,改后缀,或者加后缀,调用encrypt_file1

     

    E. encrypt_file1函数分析

    1.对于要处理文件,读取其内容,进行判断是否经过处理,并检查其类型

     

    2.对于小文件,创建新文件,其名为原文件后加T

     

    3.对于大文件,将前0x10000字节复制到文件尾部,并清空前0x10000字节

     

    4.生成随机AES密钥,用RSA公钥加密,得到密文。进行密钥扩展,得到DWORD[4*11],向文件中写入WANNACRY, AES密文字节数,密文,文件类型,文件大小。

     

    5.每次拷贝0x100000字节,进行加密

     

    E.encrypt_分析

    循坏每次取16字节,调用AES_encrypt_16bytes

     

    F.AES_encrypt_16bytes分析

    轮密钥加变化

     

    9轮变换

     

     S盒变换

     

    8.对于小文件的AES密钥加密,可能会用另外RSA公钥

     

    如果是用的另外公钥,将文件路径写入f.wry,待后面解密器演示

     

    Ⅳ.加密流程分析

           返回到分析Most_Important_Encrypt

           1.导入密钥

     

           2.加密指定目录

      <desktop>

      All UsersDesktop

      My Documents

      All UsersDocuments

     

    3.全盘加密

    先加密非网盘,再加密网盘

     

    4. 启动解密器,两次全盘写入大量垃圾数据覆盖并删除。

     

    encrypt_and_wirte_junk_data

     

    二、解密程序

    解密程序为vc6.0 MFC 程序,根据命令行参数,有三种不同功能

    OnInitDialog内部:

           1.命令行参数为 v

           Cmd 命令删除shandowCopy

       

    2.命令行参数c

           下载torbrowser,连接tor服务器

     

           ①从文件中获取网址

     

      ②下载torbrowser

      失败,已经没有那个版本了,现在都10.0了

     

    然后是以127.0.0.1去连tor服务器

     

    3.无命令行参数

           生成界面

     

  • 相关阅读:
    包含游标、数组的例子
    团队开发的注意点
    养成逻辑的习惯
    C# DEV 右键出现菜单
    C#中ToString数据类型格式大全 千分符(转)
    Oracle系统查询的语句
    PLSQLDevelop 查询当前未完成的会话
    Oracle 异常工作中出现的
    Oracle 返回结果集 sys_refcursor
    DevExpress.XtraEditors.TextEdit,设定为必须number类型的。
  • 原文地址:https://www.cnblogs.com/jf-blog/p/13030349.html
Copyright © 2011-2022 走看看