f1828c5dd3055cba77ccf62bc90cb21b

样本入口

原始样本带了比较简单的混淆:
image.png

直接使用de4dot去混淆之后,可以比较清楚的看到Main函数的执行逻辑:
image.png

这里Main函数的逻辑比较简单,但是在执行Main之前,程序其实还做了很多初始化工作。

变量初始化

初始化的代码如下:
image.png

由于静态变量的赋值是早于Main函数调用的,所以攻击者只需要在类的任何地方声明静态变量并赋值为函数的返回值,那么就可以在Main函数执行前进行函数调用。

经过初步分析,从1962行到4995行代码应该都是一些静态函数的定义
image.png

image.png

直接在第一个静态变量赋值的地方设置断点,启动进程选择不中断
image.png

成功命中断点之后,程序则会调用Class0.b()方法,并在该方法中调用smethod_0
image.png

这里可以看出来,smethod_0是一个简单的字符串转换方法,这里第一次调用的时候,转换得到的字符串为.txt
image.png

程序还初始化了一些其他的变量,分别是
QJDFjPqkSr “$%SMTPDV$”
GrabbedClp “”
HSHChecker “$#TheHashHere%&”

SMTP配置信息
TheSMTPEmail “info@bosut.mk”
TheSMTPPSWD “0XsKEemhd6EE”
TheSMTPServer “mail.bosut.mk”
TheSMTPReciver “babakamz@yandex.com”
TheSMTPPort “587”

此样本是通过SMTP邮件通信的,并为设置FTP服务器信息
TheFTPUsername “”
TheFTPPSWD “”
TheFTPURL “”
TheTelegramToken “”
TheTelegramID “”

利用随机数和预定义的乱码字符串拼接出一个密码:
PASSWORD “ZyiAEnXWZP819042623”

Timer设置

此外,在静态变量初始化的时候,程序会设置7个定时器。
image.png

第一个名为KPPlogS的计时器中,主要是通过事件委托执行KeyboardSender方法
image.png

_Scrlogtimerrr用于执行TakeScreenshot
image.png

_Clpreptimerr对应加载ClipboardReplacer
_clprEPs对应加载ClipboardSender

_kLLTIm计时器用于给操作_KLLTIm变量
image.png
_TPSSends对应TheStoragePWSenderTimer方法,但是在本样本中,此函数体为空
image.png

最后的_ProHfutimer和上面的_kLLTIm功能类似:
image.png

基本信息收集

程序会通过多个函数组合,收集当前PC的基本信息并存储到TheInfo变量中:
image.png

包括PC Name
image.png

当前的日期时间:
image.png

本机的出口IP:
image.png

再尝试通过freegeoip获取本机的地理位置:
image.png

回到Main

基本信息初始化成功之后,程序则会回到Main函数继续执行。
首先是判断Cookies路径@”C:\Users\User\AppData\Roaming\Microsoft\Windows\Cookies”是否存在,如果存在,则尝试遍历删除该路径下的所有文件。
image.png

尝试获取并删除Chrome和Firefox的Cookies:
image.png

然后设置各个计时器的启动时间:
image.png

启动一个新线程,通过SetWindowsHookExA进行键盘监听
image.png

开始窃密

键盘钩子设置完成之后,可以看到程序连续调用了多个函数,根据函数命名,可以猜测功能可能是窃取相关的资料和信息,包括
Outlook
Foxmail
QQ
Vivaldi
Chromium
360_English
360_China
Brave
Torch
UC
Opera
FileZilla
Microsoft
Discord
FireFox
Thunderbird
image.png

在COVIDSTOutlook函数中,程序会调用一个自定义的GetOutlookPasswords函数以获取outlook的相关密码。
程序首先会定义一个list并将解密四个值添加到list中,分别是
“IMAP Password”
“POP3 Password”
“HTTP Password”
“SMTP Password”

接着,程序会继续解密四个变量并和Registry.CurrentUser一起传递到smethod_18中
image.png

smehtod_18的主要功能是读取传递进来的注册表键值并返回:
image.png

这里解密的四个注册表键值分别是:
@”Software\Microsoft\Office\15.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676”
@”Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676”
@”Software\Microsoft\Windows Messaging Subsystem\Profiles\9375CFF0413111d3B88A00104B2A6676”
@”Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676”

如果能够成功获取到注册表路径,则会尝试遍历读取这些注册表的值并解密出对应密码:
image.png

其他函数的具体实现大同小异,这里就不一一展开了。

一系列窃密函数执行完之后,如果成功获取到了一组以上的密码,程序则会调用TheStoragePWSender函数
image.png