Petya及Notpetya的核心差异分析
这段时间针对恶意软件NotPetya的分析文章已经出了很多了,这篇文章的内容相当于只是对目前已存在内容的一次补充,而本文所要讨论的重点就是Petya和Notpetya这两款新型勒索软件之间的核心差异。
在几个月之前,我曾发表过一篇关于“Petya感染MBR(主引导记录)”的文章。在那篇文章中,我解释了勒索软件感染计算机启动过程的方法,以及它是如何执行自己的内核代码的。而在今天这篇文章中,我将给大家介绍这两款恶意软件之间所存在的关键技术差异。
差别#1:XOR密钥
Petya和NotPetya都会读取MBR,并使用一个简单的XOR密钥来对MBR进行加密。但两者之间的区别就在于,Petya使用0x37来作为加密密钥,而NotPetya使用的是0x07。
Petya的加密密钥:
NotPetya的加密密钥:
差别#2:迷你内核的扇区空间
Petya运行的是迷你内核代码,而并非原始内核代码。这些代码负责处理整个加密过程、伪造CHKDSK信息、以及显示骷髅头和勒索信息。NotPetya的迷你内核负责的事情跟Petya差不多,只不过它不负责显示那个闪烁的骷髅头而已。
除此之外,Petya的迷你内核代码从扇区0x22开始,而NotPetya的却是从扇区0x02(紧邻MBR扇区)开始。
差别#3:重启风格
在向受感染磁盘中写入了MBR和迷你内核代码之后,Petya和NotPetya都会通过让受感染系统重启来激活恶意软件的第二个感染阶段。
Petya在初始化重启过程时使用的是NtRaiseHardErrorAPI,而NotPetya使用了CreateProcessW API来发送命令“shutdown.exe /r /f”,并通过这行命令实现了计划重启。
Petya的重启过程:
NotPetya的重启过程:
差别#4:显示骷髅头
Petya在伪造CHKDSK的操作完成之后便会在目标用户的屏幕上显示一个红色的骷髅头。NotPetya在完成了磁盘加密操作之后同样会显示伪造的CHKDSK信息,但在此之后并不会显示骷髅图案。
下图显示的是Petya的虚拟内存截图,其中包含有伪造CHKDSK的字符串信息、勒索信息、以及扭曲的骷髅头图形。
Petya的虚拟内存截图:
下图显示的是NotPetya的虚拟内存截图,其中包含有用于伪造CHKDSK的数据以及相关的勒索信息,而原本应该包含骷髅头图案的那部分空间却是空白的。
Petya的虚拟内存截图:
差别#5:勒索信息
Petya和NotPetya的勒索信息是完全不同的,具体请看下面给出的截图。
Petya的勒索信息:
NotPetya的勒索信息:
总结
虽然Petya和NotPetya有这么多的不同之处,但从其他角度来看,它们两个也有很多相似的地方。比如说在破坏性方面,它们两个的杀伤力都是非常强的,而且两者都会通过重写MBR来使受感染设备瘫痪。
对付这种类型的恶意软件,最好的方法就是将你的重要文件进行离线存储。需要注意的是,无论你不小心感染了这两种勒索软件的哪一种,你都不要轻易地按照攻击者的要求支付赎金,因为就算你支付了赎金也没人能够保证你能够拿回那些属于你的文件。
IoC
Petya:
MD5: af2379cc4d607a45ac44d62135fb7015
Detection: W32/Petr.A!tr
NotPetya:
MD5: 71b6a493388e7d0b40c83ce903bc6b04
Detection: W32/Petya.EOB!tr
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 文件操作——读取
- YAML,另一种标记语言?不止是标记语言!
- Canal binlog 日志管理器与GTID简介
- RNA-Seq的Counts和FPKM数据如何转换成TPM?
- Java代码审计基础之反射
- 手把手教你用Python开发“剪刀石头布”小游戏【附源码】
- For语句
- 使用go语言制作dll封装Sprintf函数给VBA使用
- 同事埋了个坑:Insert into select语句把生产服务器炸了
- VBA使用API_01:读取文件
- 从0到1,撸一个IDEA插件,So Easy!
- VBA调用外部对象02:FileSystemObject
- VCS与Verdi的联合仿真
- ADC数据接入到AXI-Steam Interface
- Java面试必问:ThreadLocal终极篇 淦!