文章目录

  • Avaddon勒索
  • 解密工具
  • 解密工具原理
  • 解密工具优化
  • 关于文件大小的疑惑
  • Avaddon勒索加密流程补充
  • 解密工具实现
  • 相关资料

Avaddon勒索

该勒索病毒使用C++语言进行编写,采用RSA-2048和AES-256加密算法对文件进行加密,加密库使用的是Windows自带的CryptAPI

被该勒索加密后的文件后缀为avdn

解密工具

国外安全研究人员发布了一款Avaddon勒索病毒解密工具,解密工具源代码地址:

https://github.com/JavierYuste/AvaddonDecryptor

经过测试,这个工具确实是可以解密被Avaddon勒索加密的文件,下面是 我输出的解密时的日志

想要解密被加密的文件 需要具备下面几个条件

  1. 当前存活的勒索进程
  2. 勒索进程的dump文件
  3. 一份被加密的文件
  4. 一份被加密文件的原始文件

然后调用下面这个命令

python3 main.py -f <encrypted_file> -o <original_file> -d <memory_dump> --folder <folder_to_decrypt>

就可以解密机器上所有的被加密文件了(需要修改源码中写死的三个路径 才能把解密脚本跑起来)

解密工具原理

目前我的需求是把这个解密能力集成的到公司的工具里,再来分析一下代码

首先在dump文件中搜索所有可能的密钥,然后返回一个偏移列表,再根据这个偏移列表,去拿到所有的key

输出的日志显示offset有90个,也就是说有90个AES的密钥

然后利用搜索到的key去解密文件,每解密一次,都去和源文件进行比对,比对成功则说明密钥正确

比对成功之后,开始解密整个系统的文件。

解密文件时,传入被加密的文件路径和解密后的文件路径以及密钥文件路径,然后调用DecryptFile.exe对文件进行解密

需要特殊处理的是,如果文件大小大于0x100000个字节,那么解密完成之后需要将0x10000字节后的数据全部复制到解密后的文件。

也就是说这个勒索实际上只会加密前0x10000个字节,这个细节在目前已有的分析报告中并没有提及。

解密完成之后,将文件截断为原始文件大小

那么这里其实有一个问题,为什么可以根据内置的特征码搜索到AES密钥?那个密钥的特征码是哪来的?

作者在代码中给出了这样一句注释

# Dump the process with procdump.exe -ma <PID>
# Pattern to search for (part of the key_data_s structure, in particular alg_id, flags and key_size):
# 106600000100000020000000

根据这个提示,找到了这个结构体,原文出处:https://forums.codeguru.com/showthread.php?79163-Structure-of-HCRYPTKEY-Data

struct key_data_s
{void *unknown; // XOR-eduint32_t alg;uint32_t flags;uint32_t key_size;void* key_bytes;
};

勒索采用的是AES256 ,那 alg = 0x00006610,keysize=0x00000020, flags= 0x1

则特征值对应:106600000100000020000000

这个结构体来自于CryptApi,作者是逆向了cryptsp.dll和rsaenh.dll这两个dll得到的这个数据结构。

也就是说,这种在内存中暴力搜索密钥去解密被加密文件的方式,只适用于调用了CryptApi,并且随机生成密钥的情况。

那么有没有可能将作者的源码进行优化呢?答案是有

解密工具优化

在这之后,bd也针对该勒索发布了一款解密工具,根据提示,也是基于上面的代码做了一个图形化的工具而已。

工具只需要一个被加密文件和被加密前的源文件,不需要选择进程,不需要dump文件,就能对整个文件夹进行解密,但是我这里测试是解密失败的。分析一下这个工具有没有什么可借鉴的地方

bd的做法是遍历整个系统的进程

直接在内存里匹配密钥,

如果匹配完成,就直接读取,然后调用解密程序。

关于文件大小的疑惑

根据网上的分析报告提示

最后附加的24个字节中前4个字节是原始文件大小,但这个大小似乎不太对。如果原始文件大小是0x01EB0B,那么

0x01EB0B-512-24=0x1E8F3

但上图被加密文件数据的大小是0x20000,这个文件大小这么来看的话是对不上的。直到我即将完成我的解密工具的时候,解密出来的文件在末尾总是会出现一堆0。

末尾的这一堆0,直接导致了解密后的文件和解密前的文件md5对比失败,一开始我以为是程序逻辑上的bug,但是后来发现并不是。实际上

文件大小的计算方式如下:

加密后的文件大小(小于0x100000)=原始文件大小+填充0的字节数+512+24

以下面某个文件为例:

  • 原始文件大小为:0x2EE82
  • 加密后的文件大小为:0x30218

  • 填充0的字节数为4478
0x30218=0x2EE82+4478+512+24

最后填充的0实际上是为了对齐到0x2000个字节,因为该样本每次会加密0x2000个字节,如果不足2000那么在加密的过程可能会导致异常退出。

Avaddon勒索加密流程补充

解决了文件大小的问题,这里对Avaddon勒索的AES加密流程做一个补充。

对于文件大小小于0x10000的文件,首先会在文件末尾填充0,将大小补齐到0x2000,然后将样本进行加密处理,每次加密0x2000个字节

对于文件大小大于0x10000的文件,直接加密前0x10000个字节,0x10000以后的部分不做加密处理。所以在末尾不需要填充0

解密工具实现

那么到这里,已经填完了所有的坑,可以做一个相对来说最优化的解决方案。整个解密流程如下:

BOOL Check(LPCTSTR lpszFile);

首先判断是否是该家族的加密文件,判断条件有三个,两个末尾24字节写死的特征码和文件大小的计算是否满足条件

void GetValidPid();

然后获取有效进程的PID,遍历整个进程,并且获取进程映像文件的md5,将md5和注册表启动项中的映像文件做对比,如果对比成功,说明可能是潜在的勒索进程。
这个勒索是会将路径写到启动项,可以通过这个方法来过滤掉绝大部分的进程,提高后面特征匹配的效率

ScanAddress(hProcess, (char*)"106600000100000020000000", 0);

接着遍历所有的有效进程,搜索特征码,获取到所有可能的Key

BOOL GetUniqueKey(LPCTSTR szSourceFile, LPCTSTR szEncryptedFile);

用所有可能的Key文件去解密被加密文件,如果解密出来的文件和源文件md5一致,那么视为密钥获取成功。
成功获取密钥的条件也可以用文件格式的魔数头来做判断,但是并不符合我的应用场景。

void DecryptAllFiles(LPCTSTR FileDirectory);

开始解密整个需要解密的目录

记录一下整个过程和一些踩过的坑,这个解密工具写了快1100行代码,花了6天左右的时间。工程这里就不发了。

相关资料

勒索分析:https://www.freebuf.com/articles/others-articles/249109.html

解密工具: https://github.com/JavierYuste/AvaddonDecryptor

勒索解密工具分析:https://mp.weixin.qq.com/s?__biz=MzA4ODEyODA3MQ==&mid=2247486514&idx=1&sn=6464b9066980a6c045a33ef58dd5b6b0&chksm=902fa31aa7582a0c88242eb816fb466cbb7f94fe33b3e8b14f1f769d6d493961eaf9721cc87d#rd

密工具分析:https://mp.weixin.qq.com/s?__biz=MzA4ODEyODA3MQ==&mid=2247486514&idx=1&sn=6464b9066980a6c045a33ef58dd5b6b0&chksm=902fa31aa7582a0c88242eb816fb466cbb7f94fe33b3e8b14f1f769d6d493961eaf9721cc87d#rd

Avaddon勒索解密工具原理解析相关推荐

  1. H5 可视化构建工具原理解析(一)

    前言 总共进 8 万行代码实现H5可视化构建工具,自去年十月开始陆续做了大半年,现已投入到业务中使用,虽然算是个人项目,但组件和部署模块涉及大量公司业务代码,就不开源了,主要讲讲实现思路,算是该项目的 ...

  2. exe软伯解密工具_值得收藏!最全勒索解密工具等你来拿

    勒索病毒是近年来呈爆发趋势的一种计算机病毒,也一直是深信服安全团队的重点"关爱"对象. 近期,深信服安全团队汇总了众多解密工具信息,有需要者可自取哦!(工具很多,建议收藏) 01 ...

  3. java php rsa加密解密算法_PHP rsa加密解密算法原理解析

    php服务端与客户端交互.提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密 1.加密解密的 ...

  4. 2023年七大最佳勒索软件解密工具

    勒索软件是当下最恶毒且增长最快的网络威胁之一.作为一种危险的恶意软件,它会对文件进行加密且无法破解,并用其进行勒索来换取报酬,很多企业都遭受到了类似威胁,之前某士康几十亿勒索的案例相信大家应该听过. ...

  5. Bitdefender 发布GandCrab V5.2勒索病毒解密工具 (免费)

    2018年1月28日,我们的观察分析师在Bitdefender威胁地图上看到了一个小小的点.这是我们每天在Bitdefender看到的数以百万计的点点,但这一点突显了一个新的勒索软件家族的诞生,这些勒 ...

  6. 别再回来了!GandCrab勒索软件最终版本解密工具降世

    6月17日,对于最丰富的勒索家族GandCrab的最新版本的新解密工具已经免费发布在www.nomoreransom.org (一个收集最全的勒索软件解密工具的网站) https://www.nomo ...

  7. 比特梵德再次发布GandCrab勒索软件免费解密工具

    对于GandCrab勒索软件的受害者来说,这应该是一个好消息.罗马尼亚反病毒软件公司比特梵德(Bitdefender)已经与欧洲刑警组织.美国联邦调查局.罗马尼亚警方以及其他国家(保加利亚.法国.匈牙 ...

  8. 勒索病毒java解密_被CrazyCrypt2.1勒索病毒加密了?已有一键解密工具!

    原标题:被CrazyCrypt2.1勒索病毒加密了?已有一键解密工具! 背景概述 近日,国外分析人员报出CrazyCrypt 2.1勒索病毒,该勒索病毒集加解密模块于一体,通过AES加密算法对文件进行 ...

  9. plist解密_免费解密工具针对ThiefQuest Mac勒索软件

    端点安全公司SentinelOne的研究人员创建了一个工具,使用户能够恢复由名为ThiefQuest的Mac恶意软件加密的文件,该恶意软件为勒索软件. ThiefQuest最初名为EvilQuest, ...

最新文章

  1. 织梦 ajax 返回,Dede织梦arclist标签+Ajax实现织梦首页分页-叙述织梦
  2. python函数基础和装饰器
  3. java 枚举 循环_java – 在枚举中实现内部接口时的循环继承
  4. 15:18 2009-7-5 小结
  5. 面试必问!Tomcat 优化篇!
  6. K8S 部署 ingress-nginx (三) 启用 https
  7. python内置模块有哪些_python中那些小众但有用的内置模块
  8. EditThisCookie使用
  9. 利用xor给shellcode加壳
  10. android 菜单 功能键,Android交互体验必知:功能按键事件
  11. 仿芒果TV微信小程序
  12. Xcode添加include目录
  13. python函数使用大全_SPSS常见函数及使用方法
  14. VBA实战技巧精粹014:关于Range总结
  15. 厉害了,竟有程序员在GitHub上建了一个新华词典数据库
  16. 农业银行联行号怎么查询_中国农业银行大额联行号12位是什么,怎么查找
  17. biosrecovery什么意思_卡刷和线刷手机什么意思 Recovery使用方法
  18. 检测视频中的人脸,并画出矩形框
  19. 端午节,我用 Python 画了一盘粽子送给大家
  20. mysql 修改数据库字段update_SQL语句update修改数据库字段

热门文章

  1. DL之YoloV3:Yolo V3算法的简介(论文介绍)、各种DL框架代码复现、架构详解、案例应用等配图集合之详细攻略
  2. Crawler:基于urllib库获取cn-proxy代理的IP地址
  3. java web: Servlet JSP MVC
  4. 洛谷——P1549 棋盘问题(2)
  5. select 实现server I/O多路复用通信
  6. Linux系统新建用户用ssh远程登陆显示-bash-4.1$
  7. EXPRESS.JS再出发
  8. UI控件问题和XCode编译警告和错误解决方法集锦 (持续更新ing)
  9. QT中Sqlite的使用
  10. Android 下拉刷新