第一次分析勒索病毒
0x01 前言
接到客户通知,有个PC中了勒索病毒,领导让尽量分析一下给客户个回复,着急的我赶紧翻书翻教程,一顿qwer,最终还是没能将文件恢复,但是分析过程中又学习了一些知识,借此分享。
先附下加密后的截图
0x02 样本信息
程序名: 7407.tmp.exe
样本大小:445952
MD5:b65014814bbbd09367df4a86c0d4204d
加壳混淆:UPX 0.89 - 3.x
在线检测
分析工具:OD、X32dbg、IDA、火绒剑、微步在线
0x03 监控运行分析程序行为
- 自身复制
- 修改注册表
- 监控单个文件的操作流程
- netstat监控无网络行为
- import导入函数中无加密函数,怀疑没有使用公用的加密算法进行加密
0x04 脱壳后OD分析-进入误区
- 由于是UPX加壳,直接用脱壳工具就掉了
- GetTempFileNameA获取tmp目录
- getTempFile
- 打印机的相关操作(不知道有什么用,反正是进入误区了)
到此,程序运行退出,文件也没加密,这就肯定有反调试了,但是OD有插件啊,怀疑程序对INT 3断点有反调检测,直接把所有断线都取消了重新设置一下:进入call后,在第二行下断点
此时发现程序还是会自动退出,同时文件也开始被加密了,查看进程列表和火绒剑,发现又多了一个7407.tmp.exe进程,调用位置也和调试的病毒程序一样。于是重新在 CreateProcessW下断点,刚开始病毒程序有其他反调检测,程序发现被调试时会重新起一个进程,后来通过火绒剑发现无调试时也有创建进程操作;
接着尝试在 WriteMemory下断点,这下找到了真实的病毒执行体
- dump真实病毒程序 PE头文件,找到OEP
下一步在主程序使用ResumeThread恢复新进程前,使用X32DBG附加新进程;可以在ResumeThread处下断点,再附加新进程。
0x05 X32dbg分析-真实病毒文件
- 删除卷影副本
在 WriteFile、CreateFileW、ReadFile、DeleteFileW、GetWindowsDirectoryA处下断点,运行程序,断下来后,回溯进入程序领空
此时找到sub_402880为病毒进程加密一个的整个操作
- 往下翻,找到主要的加密(计算)依据 (key) sub_4034C0
- 找到加密CALL,这里确定是加密CALL的原因是,执行这个CALL后,发现之前读取到文件内容的Buffer区域中,被写入了新的数据,且该数据和文件被加密后的16进制内容相同。
a. 读取到的文件内容
b. 执行了sub_403960后数据变化
c. WinHex查看加密后文件
- 根据sub_403960执行前压栈信息,发现有一个重要的计算依据,可以叫做加密key,由 第三步sub_4034C0得到
- 尝试分析加密参数生成、文件内容加密的计算方法 – 没成功,有些复杂
a. key 值计算CALL内部
对比IDA Pro
b. 加密CALL内部
对比IDA Pro
到此,发现key值也有一个动态的计算依据,这个需要重新回溯,而且计算过程比较麻烦,所以结束了。
0x06 总结
写注册表操作
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\7407.tmp.exe
自身复制
C:\Windows\System32\7407.tmp.exe
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\7407.tmp.exe
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\7407.tmp.exe病毒不会蠕虫传播、无明显的网络行为
没有加密操作,只是自定义了一些函数,对文件内容读取、运算,写入新文件,删除源文件
目前测试火绒杀毒不能识别病毒文件
分析到这,通知用户在中毒机器上 杀掉所有 7407.tmp.exe进程,删除对应注册表、自身复制的文件,使用磁盘恢复工具尝试一下能不能恢复文件。
0x07 分析过程中的一些小知识点
- 调试时发现反调插件已经有了,还是一调试就退出,先尝试把异常忽略关闭,看看是否可行;同时考虑程序检测导入函数是否被下断点(原因是OD在设置CC断点时,会将对应位置的机器码修改为 CC01,反调试程序会检测这个位置),这时可以尝试在CALL内第二行设置断点
- 对于自身启动新进程,通过内存将真实文件内容写入的方式,可以通过火绒剑一步一步监控,再找对应的API函数,下断点调试
- OD中找到一个函数,想要在IDA中找到对应位置,因为IDA有伪代码,一般情况,直接跳转地址,发现找不到,此时,使用 函数地址 - OD中基址 + IDA基址 ,再使用G跳转,也可以找到特征字符,在IDA中使用 alt + b搜索位置