MD5:e100c2c3f93cabf695256362e7de4443
根据先前的分析,是FSG壳,利用ESP定律直接脱壳。
脱完壳之后的文件信息 MD5:50DAEB6C0DB643027BA169335ABA90E5
动调脱完壳之后的文件,该部分为解密字符串,简单加密算法为 Str1 = Str ^ 0xCD - 7
字符串:
1 2 3 4 5 6 |
|
脱壳之后,由于IAT问题,部分API显示不完全,并不能完全有效的动调,因此需要回到脱壳前的文件去分析,但是脱完壳的文件依旧需要保留。
根据脱完壳的文件,定位WinMain函数为0x00401060,所以IDA打开未脱完壳的文件,定位0x00401060,在此处创建函数,然后F5
WinMain函数为解密字符串,加载自定义资源中的 FILE ,创建指定目录后移动文件并打开exe
资源段中的FILE文件实际上是一个受密码保护的 PDF 文件(MD5:59892a9875d74dd93a7718cae6af65d0)。
WinMain中的行为与实际行为不一致,010Editor 打开,在 .rsrc 段发现一个PE文件,该 PE 文件为在脱完壳之后文件末尾创建了一个新部分,包含病毒代码,实际上是病毒母体,用010Editor dump。
文件MD5:1103CB6763BB6518E8BAE56746EB2900
UPX2.02,依旧是ESP定律脱壳,脱完壳之后的文件 MD5:64D503FB528A9C4F0DD5B370AA5EE030
首先会修改注册表。修改1 2 3 4项后加载 MPR、WININET.DLL,接着修改5 6 7 8项,修改内容为:
1.将 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced 中 Hidden 键值改为 1 ,即隐藏已知文件扩展名;
2.将 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\policies\system 中 DisableTaskMgr 键值改为 1 ,即禁用任务管理器功能;
3.将 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\policies\system 中 DisableRegistryTools 键值改为 1 ,即
禁用禁用注册表编辑器功能;
4.在 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Security Center\Svc 中设置子键 _kkiuynbvnbrev406 ;
5.将 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings 中 GlobalUserOffline 键值修改为 0 ,即禁用当前用户脱机工作模式,允许联机;
6.将 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\policies\system 中 EnableLUA 键值修改为 0 ,即禁用用户账户控制 (UAC) ;
7.在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\Firewa\AuthorizedApplications\List 中添加当前程序路径,即创建一个防火墙规则,允许当前可执行文件通过防火墙访问网络;
8.将 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\Firewa 中 EnableFirewall 键值改为 0 DoNotAllowExceptions 键值改为 0,DisableNotifications 键值改为 1 ,即关闭防火墙、允许指定程序进行网络连接(添加防火墙白名单)、禁用防火墙通知。
修改完注册表之后,会加载 MPR、WININET.DLL,再获取计算机名称,储存在字符串 SubKey 中, SubKey 大于 2 则进行一些运算,将结果赋给 nullsub_1,之后创建一个名为 purity_control_90833 的内存映射文件对象,便于不同进程之间通过该名称共享内存映射文件对象。
接着根据当前用户和其计算机信息生成一个由 Software\用户名\计算结果 组成注册表键,并读写一些值,如果满足特定条件,将名为 purity_control_90833 的内存映射文件中的一段数据复制到指针 a1 所指向的内存区域中,便于后续使用。
如果未获取到唯一标识符的长度,则会获取到调用 GetTickCount() 获取系统启动后的毫秒数,并将其存储在 Target 中,接着使用 GetPrivateProfileStringA() 从 SYSTEM.INI 文件中读取指定区域和键的字符串值,并将其存储到 ReturnedString 缓冲区中。
接着如果在 SYSTEM.INI 文件中没找到所需的键值,则会将 dword_4140CC 的值设为 1,并使用生成一个随机数。然后,使用 wsprintfA() 将 TickCount 和随机数格式化为一个字符串,并保存在 ReturnedString 缓冲区中。最后,使用 WritePrivateProfileStringA() 将该字符串写回到 SYSTEM.INI 文件,以便以后的调用能直接读取并使用。MCIDRV_VER 和 DEVICEMB 为 SYSTEM.INI 中的新增项。
从 SYSTEM.INI 中读取 DEVICEMB 后面的整数值,并转换为字符串,用于随机生成文件名,未读取到则生成该随机数
生成的文件路径和随机生成的名称保存到一个内存地址中,并返回这个地址。C:\Windows\system32\drivers\
修改注册表,创建内存映射文件,生成唯一标识符之后,会创建多个线程
第一个线程用于分配内存,创建虚拟内存映射并附加到当前地址空间,提升进程权限,注入特定进程。
遍历系统进程,创建名为 [System Process]Mth32ProcessID 的互斥锁,如:[registry]M168 ,之后利用 OpenProcessToken、AdjustTokenPrivileges、LookupPrivilegeValue 函数提升进程特权为 SeSecurityPrivilege ,使进程具有 RWX 权限,接着查询用户SID信息、SID所对应的用户或组名,使用 VirtualAllocEx 在目标进程中申请内存,将要执行的代码写入该内存中,使用 CreateRemoteThread 动态创建一个远程线程,并指定线程函数为该申请到的内存地址,使用 WriteProcessMemory 将需要的参数写入该内存地址,对于用户不属于 system、local service、network service 的进程,执行远程线程注入
第二个线程用于删除注册表的子键路径,动态加载 ADVAPI32.DLL 、NTDLL.DLL 中的 API ,创建一个服务后,再创建一个线程来检测安全软件服务,接着打开名为 amsint32 的设备,再创建一个新线程用于扫描并检测安全软件进程。
递归删除 HKEY_CURRENT_USER\System\CurrentControlSet\Control\SafeBoot 和 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SafeBoot 子键及其包含的所有键和值,修改或重置系统安全模式设置,如
删除 HKEY_CURRENT_USER\SYSTEM\CurrentControlSet\Control\SafeBoot\Minimal\ ,会使用户无法进入安全模式。
加载驱动 C:\Windows\system32\drivers\ipfltdrv.sys 并以服务形式启动。
通过 SCM 启动安全软件服务来检测安全软件,并尝试启动失败的服务。
被检测的安全软件包括 Kaspersky、ESET、Avast、AVG、Dr.Web等的服务,具体服务详细说明如下:
sub_404BAA()为驱动注入(xp系统下),注入一段代码到 amsint32 设备中,流程如下:
1.清空字符数组 Buffer 和 NewFileName
2.获取系统目录,并检查路径后是否有 \ ,若没有则在其后面添加 \
3.获取系统信息,查询系统中所有模块的基址和大小等信息,并保存在内存块 hMem 中
4.从内存块 hMem 中取得指向第 n 个模块的指针,并将其所在库文件名存储在字符数组 lpLibFileName 中
5.生成随机一个文件名 NewFileName,文件名格式为:随机字符串+.exe 或 win+随机字符串+.exe
6.拷贝系统目录 Buffer 中的驱动程序到新文件 NewFileName,并加载该文件
7.释放内存块 hMem
8.获取函数指针 KeServiceDescriptorTable 并检查该指针是否为 NULL
9.检测驱动程序是否为 PE 格式,若不是则返回 0
10.获取导出函数表的 RVA 和函数数量
11.计算注入代码的位置。(从驱动程序的基地址 hModule+ 注入代码的 RVA v1开始)
12.为注入代码申请内存
13.将注入代码的地址写入 _DWORD 数组 v10 中,并将开头设置为特殊标记 666
14.打开驱动程序所在的文件,并通过 WriteFile 将注入代码写入驱动中
15.释放申请的内存,关闭加载的库文件,删除临时文件
16.返回 1 则表示注入成功
扫描防病毒软件进程
根据进程名的列表,整理出以下防病毒软件:
第三个线程用于 autorun.inf 文件的创建写入,枚举指定注册表中特定文件,并感染相关文件。
加载 sfc.dll 或 sfc_os.dll,用于动态加载 SfcIsFileProtected ,之后创建第一个子线程 sub_40DC44,该子线程首先会在 C:\Users\用户名\AppData\Local\Temp\ 下创建一个 随机字符串.exe 或 win + 随机字符串.exe 的文件,并写入内容,检测 MZ、PE 来验证写入是否成功,否则会退出当前子线程,之后会在驱动器根目录创建一个 autorun.inf 的文件。
autorun.inf 文件内容如下图,此处随机生成的文件为 fffimh.exe,且该文件被隐藏(文件MD5:3d1cd925b93dc2b2ea291170abcd684b)。
1 2 3 4 5 6 7 |
|
创建第二个子进程会遍历 HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache(记录最近打开过的应用程序的资源文件位置) 和 HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\ (指向当前用户的Shell配置信息下的键值,并感染该注册表中的可执行文件。
创建第三个子线程用于遍历 C 盘文件(只要 C 盘类型不是光驱)就会感染 exe 和 scr 文件,如果是一个文件名是与防病毒软件文件名相同,则会删除该文件。
第三个子线程执行休眠后,遍历并感染 HKEY_CURRENT_USER HKEY_LOCAL_MACHINE Software\Microsoft\Windows\CurrentVersion\Run 下的可执行文件,即感染开机自启动程序。
第四个线程会从硬编码中的 URL 下载文件,解密文件并执行该文件。
打开硬编码中的URL并下载文件,文件会被命名为 随机字符串.exe 或 win + 随机字符串.exe。URL 为:http://89.119.67[.]154/testo5/ 、http://kukutrustnet777[.]info/home.gif 、http://kukutrustnet888[.]info/home.gif 、http://kukutrustnet987[.]info/home.gif;
UA 为 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.1 (.NET CLR 3.5.30731)
解密下载的文件并执行,删除原来下载的加密文件。字符串 kukutrusted!. 和 GdiPlus.dll 很有可能是加密密钥
在第五个线程创建前,会创建一个名为 hh8geqpHJTkdns0 的内存映射文件。
第六个线程会遍历 C:\Users\shan\AppData\Local\Temp\ 目录,删除文件名长度大于 4 的 exe 以及删除 rar 文件
第七个线程会循环遍历一个句柄数组,它有0x186A0(100,000)个元素,检查其中的每一个句柄是否处于 signaled 状态。如果某个句柄处于 signaled 状态,就将该句柄关闭,并将其置为 0,在执行多线程时进行线程资源的分配调度。
第八个线程绑定端口 4098,创建一个新线程用于接收从控制端发送的数据
第九个线程作用与第八个线程类似,创建一个子线程,用于和控制端进行交互。
Sality病毒逆向分析 - 『病毒分析区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
Sality病毒分析与查杀 - 安全技术 - 深信服社区 (sangfor.com.cn)
Sality病毒 - 知乎 (zhihu.com)
Shellcode基础 ~ 逆向安全博客 (gitee.io)
木马爱修改的常见注册表项及其功能_cs08211317dn的博客-CSDN博客
Sality 病毒的驱动模块分析报告_~巴哥~的博客-CSDN博客
谨防数据泄密 | Sality病毒在Windows下迅速扩散 - FreeBuf网络安全行业门户
某软件广告弹窗模块感染Sality病毒,影响5万用户 (qq.com)
某医药生产车间中毒事件响应分析报告 - 安全内参 | 决策者的网络安全知识库 (secrss.com)
最后于 3天前 被megaparsec编辑 ,原因: