勒索病毒是一种新型电脑病毒,主要以邮件、程序木马、网页挂马的形式进行传播。这种病毒利用各种加密算法对文件进行加密,被感染者一般无法解密,必须拿到解密的私钥才有可能破解。
现在就用C语言来实现一下系统文件加密及解密功能,简单模拟勒索病毒的加解密原理。
1. 对系统文件进行简单加解密
假设桌面存在如下图所示的文件夹“l30n9ry0n”,我们需要获取其信息再进行文件遍历及加密操作,需要用到操作系统API、加密算法,像勒索病毒一样可以还原文件的,还需要解密算法。
1.在编写一个简单的加密函数前,首先需要创建文件并执行打开、读写操作。
1 |
|
2.计算文件大小,查看该文件可知共142字节。
在C代码里的基本流程为:
- 设置光标(文件指针)到文件末尾
- 计算光标距离文件头的字节数
- 设置光标位置到文件头(便于后面的加密操作)
1 | //2.获取文件大小 |
3.循环插入字节实现简单的加密。
如果在进行文件操作时,遇到权限不够的情况下,需要进行相关的提权操作,再进行加密处理。
1 | //获取文件所有内容 |
运行完后在C代码当前目录下生成一个ddd.txt
文件,发现一个简单的加密或扰乱完成。
为什么文件显示的字节与计算的字节不一样?对于文本流,因为会执行行末字符映射,所以文本文件的字节数可能和程序写入的字节数不同。基于此,可以用二进制方式读写文件。同时,使用二进制可以读取大型文件如.exe
文件、音视频文件等。
4.编写一个遍历文件夹的函数,实现对整个目录进行加密处理。
通常遍历文件夹采用递归,依次遍历某个目录的文件夹,深度搜索文件夹中的内容,如果是文件就加密,如果是文件夹就继续深度搜索,直至找到文件依次返回,从而实现整个目录的文件遍历。
- 调用
GetCurrentDirectory()
函数获取当前目录
1 |
|
- 调用
FindFirstFile()
函数获取目录下第一个文件 - 如果找到第一个文件,则循环调用
FindNextFile()
函数获取下一个文件 - 如果找到的是文件夹,则拼接新的文件夹路径继续递归遍历文件
1 |
|
5.完整代码如下:
1 |
|
可以看到修改日期是今天,创建日期也是今天,因为原本的文件都被删除了。并且文件都加了密,文件文件乱码、图片不能显示、EXE也不能执行。
6.编写解密功能。
当我们中了勒索病毒,就需要解密。在真实环境中,MD5、hash、SHA-1都是比较常用的加密算法。编写解密功能有两种方法:
- 全部读入内存,修改后重新存入文件
- 边读边写到另一新建文件,要修改的部分修改后存入新建文件,其它部分原封不动写入,写完删除加密文件,并将这个新文件改为加密文件的名字
1 |
|
最终结果如下:
除了文本文件其它文件都复原了,这是为什么😓但是复原的文件都比最初始的文件多了2个字节,救命我也不知道为什么,可能是字符\0
之类的?
2. OD逆向分析加密PE文件
将上面编写的代码编译成EXE文件,我是拿去32位Win 7系统上编译的,这样编译出来的EXE也是32位,才能加载进OD分析。
1 | gcc main.c -o main |
载入OD后,右键 -> 查找 -> 当前模块中的名称,查看该EXE调用到了哪些API函数。
选中FindFirstFileA()
右键 -> 在每个参考上设置断点,如果在断点窗口没有看到断点,也就是断点没下成功,那就用另一种方法:在CPU窗口右键 -> 查找 -> 所有模块间的调用,找到FindFirstFileA()
右键 -> 在每个调用到 FindFirstFileA 上设置断点,找到两处。在断点窗口中选中某一个断点右键 -> 反汇编窗口中跟随,可以查看这条指令上下有什么特别的指令。
运行,第一次断下显示:
第二次断下显示:
继续F7调试发现可以看到参数传递、字符串拼接、睡眠函数等内容,重点是我们要通过call分析进入到加密函数中,然后去分析加密函数里的算法从而实现逆向破解。
在逆向分析的过程中,需要思考几个问题:
- OD逆向怎么判断恶意样本执行或检测了哪些文件
- OD逆向怎么判断恶意样本是否具有注册表操作、系统进程获取、屏幕截屏等操作
- OD逆向怎么判断恶意样本的网络操作,IP地址、邮箱、域名访问请求情况
- OD逆向怎么判断恶意样本是否具有蠕虫传播感染功能
- 怎么溯源一个恶意样本
3. 在线沙箱分析
在恶意样本逆向分析中,在线平台给我们提供了强大的支撑,我们拿到一个样本后可以先对其进行在线监测。其操作比较简单,就是将恶意样本上传至指定在线网址即可。常见的在线沙箱分析包括:
以VirusTotal沙箱为例,将我们的main.exe
传上去,等待它检测。结果67家安全供应商中只有9家没有将这个文件标记为恶意文件。
我们还可以看到样本的基本信息、文件历史信息以及PE文件节点信息。
如果样本有恶意家族关联,它也能给出相应的信息。