最近在分析 PLAY 勒索家族的样本,在加密文件之前,样本首先检查文件的扩展名是否在一个列表里,从而决定之后的加密行为。
为了提升分析难度,也为了降低被杀软检测的风险,这个勒索病毒对执行中使用的字符串继续了编码,因此需要检查的扩展名列表并不是明文保存在样本中的。
不仅如此,与很多勒索病毒不同,扩展名之间并没有连接成整个字符,而是通过循环的方式逐个进行解码,再比较。
勒索样本总共进行了三次不同的循环,解码出了三个不同的列表,包括目录黑名单(不进行加密的目录)、文件扩展名黑名单、以及是否全部加密的扩展名白名单(具有在名单中的扩展名文件内容会全部加密)。
在这三个列表中,第三个列表的长度接近 200,也就是说要进行接近 200 次循环。
因此如果想要获得这个扩展名列表的全部内容,单步调试的方式就显得十分不明智。
因此我想到了调试器的跟踪记录功能,但是之前只是知道这个概念,具体应该如何操作并不清楚。在此记录此次使用的方法,方便后续学习。
我截取了循环的代码片段,可以看到这里做了 193 次循环,在调用 DcryptString
解密出当前要检查的扩展名字符串之后,会调用 _wcsstr
函数比较当前文件扩展名和解码出来的扩展名是否相同。
在调用 _wcsstr
之前,会通过 push
操作将两个参数,即要比较的字符串,压入栈中。其中 push ecx
操作压入的就是解码出来的扩展名,也就是要记录的数据。
我找到了参考资料 菜鸟的福音-x64dbg完美追踪方案 和 X64Dbg 介绍->表达式
根据以上资料,在调试器中选择 跟踪 -> 步过直到条件满足,填写
切换到 日志 选项卡,可以看到记录内容。因为我是在所有 call
命令执行的时候做记录,因此会有一些 ???
至此,问题解决