在安全工作里,恶意软件的分析,需要反汇编,跟踪,是最需要能力和最消耗人力的工作,如果能用大模型来干,那绝对是巨大进步。
Google发了一篇文章,给我们看到了希望:
从助理到分析师:Gemini 1.5 Pro 在恶意软件分析方面的强大功能
有这么好吗?我们试试。
本次测试对Gemini 1.5 Pro,Kimi,Claude,Deepseek进行了实验,实验的内容包括恶意软件和正常软件。其中,Claude,Deepseek因为输入受限,结果忽略。
01
真实恶意软件测试
本次共找了三个恶意软件,使用IDA Pro的免费版进行反汇编,反汇编后有两个太大,可用的只有一个。将asm 上传,统一使用google文章中用的prompt,如下:
Act as a malware analyst by thoroughly examining this decompiled executable code. Methodically break down each step, focusing keenly on understanding the underlying logic and objective. Your task is to craft a detailed summary that encapsulates the code's behavior, pinpointing any malicious functionality. Start with a verdict (Benign or Malicious), then a list of activities including a list of IOCs if any URLs, created files, registry entries, mutex, network activity, etc.
Gemini的结果
Gemini很贴心的给了一段反汇编代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
char szPath[MAX_PATH];
GetSystemDirectory(szPath, MAX_PATH);
strcat(szPath, "\drivers\");
strcat(szPath, "vdrv.sys");
// Attempt to load the driver
if (GetFileAttributes(szPath) != INVALID_FILE_ATTRIBUTES) {
printf("Driver already loaded.n");
} else {
// Attempt to copy the driver to the system directory
char szSource[MAX_PATH];
GetModuleFileName(NULL, szSource, MAX_PATH);
// Extract driver from the executable
// ... (Code for extracting 'vdrv.sys' from the executable) ...
// ... (Assume extraction is successful and driver is saved to 'extracted_driver.sys') ...
if (CopyFile("extracted_driver.sys", szPath, FALSE)) {
printf("Driver copied successfully.n");
} else {
printf("Failed to copy driver.n");
return 1;
}
// Load the driver
if (strcmp(szPath, "\\.\Global\vdrv") == 0) {
if (CreateFile(szPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL) == INVALID_HANDLE_VALUE) {
printf("Failed to load driver.n");
return 1;
}
} else {
if (Ioctl(0, CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS), NULL, 0, NULL, 0) != 0) {
printf("Failed to load driver.n");
return 1;
}
}
}
// ... (Potential for further malicious activity after driver load) ...
return 0;
}
然后给出结论:
结论:恶意
活动:
驱动程序安装:
检查现有的驱动程序文件。
vdrv.sys从可执行文件本身中提取。
将解压的驱动程序复制到目标位置。
CreateFile尝试使用或功能加载驱动程序Ioctl。
目标位置:
%SystemRoot%driversvdrv.sys
安装方法:
进一步恶意活动的可能性:
数据泄露:
窃取敏感信息(凭证、文件等)
远程代码执行:
允许攻击者控制受感染的系统。
系统监控:
收集系统信息(击键、网络流量等)
拒绝服务 (DoS):
破坏系统运行。
代码中包含一条注释,指出驱动程序加载后可能执行进一步的操作。这表明加载的驱动程序可能用于:
IOC:
文件:
%SystemRoot%driversvdrv.sys
Drivername:
vdrv.sys
潜在的网络活动:(
取决于驱动程序的功能,但尚不清楚)
分析:
该代码表现出明显的恶意行为迹象:
驱动程序安装:
在系统目录中安装驱动程序是恶意软件获取内核级权限的常用技术。
自包含驱动程序:
从可执行文件本身中提取驱动程序可以使恶意软件更能抵抗分析和删除。
进一步危害的可能性:
关于驱动程序加载后活动的评论强烈表明该恶意软件旨在执行有害操作。
建议:
立即移除:
删除驱动文件:
%SystemRoot%driversvdrv.sys
删除恶意可执行文件。
系统扫描:
使用更新的防病毒软件进行彻底的系统扫描。
驱动程序验证:
检查系统中是否加载了任何未经授权或可疑的驱动程序。
监控网络活动:
观察网络流量是否存在任何异常或可疑的连接。
免责声明:此分析基于提供的代码片段。恶意软件的实际行为可能因vdrv.sys驱动程序的功能而异,而这些功能并未包含在提供的代码中。
注意:此分析仅用于教育目的。尝试分析或与恶意软件交互可能很危险,只能由合格的安全专业人员在受控环境中进行。
看上去的结论,好象是对的。
Kimi的结果
基于提供的反编译代码,我将进行详细分析,以确定代码是否具有恶意行为。我将分几个步骤进行分析,重点理解代码的底层逻辑和目标。请注意,在没有完整上下文或实际二进制文件的情况下,此分析仅基于提供的代码片段。
### 结论:恶意
代码中包含几个指标,表明它可能是恶意的。与性能数据收集、注册表操作和文件操作相关的函数的存在,加上缺乏明确的良性功能,导致了这一分类。
### 活动和IOC(入侵指标):
#### 性能数据收集:
- **OpenPerformanceData@4**:此函数似乎负责打开性能数据对象。它检查基地址是否有效,并返回一个布尔值,指示成功或失败。
- **CollectPerformanceData@16**:此函数似乎收集性能数据。它涉及复杂的内存操作和检查,表明它可能正在收集系统指标或其他敏感信息。
- **ClosePerformanceData@0**:很可能是用来关闭性能数据对象的,表明数据收集是一个受控的过程。
#### 注册表操作:
- **DllRegisterServer@0**:将DLL注册为COM服务器。它创建与DLL相关的注册表键和值,可以用于持久化或配置DLL的行为。
- **DllUnregisterServer@0**:注销DLL,移除注册过程中创建的注册表项。这表明代码被设计为可以干净地安装和卸载,这是恶意软件避免被检测的常见策略。
#### 文件操作:
- **sub_65151600**:此函数似乎删除和创建文件。它删除一个文件,然后创建一个同名的新文件并向其写入数据。这可以用来用恶意文件替换合法文件,或者更新恶意软件本身。
- **sub_65151480**:涉及命令行执行和文件操作。它构建命令行并执行它,可以用来运行额外的恶意进程或脚本。
#### 网络活动:
- 虽然提供的代码中没有明确显示与网络相关的函数,但性能数据收集和文件操作的存在可能是通过网络传输数据的前奏。
#### 互斥锁:
- 在提供的代码中没有明确的互斥锁创建。然而,使用临界区(例如,`InitializeCriticalSection`)表明了同步机制,可以用来确保对资源的独占访问,这是恶意软件在执行过程中避免冲突的常见做法。
### 结论:
代码表现出与恶意软件一致的行为,特别是在性能数据收集、用于持久化的注册表操作和可能用于自我更新或替换系统文件的文件操作方面。缺乏明确的良性功能和这些指标的存在导致将代码分类为恶意的。需要进一步的动态分析和在受控环境中进行检查,以确认其确切的恶意行为并识别任何其他IOC。
判断为恶意,看上去是对的,但其分析,不太靠谱。
首先,性能数据收集和恶意软件关系不大,注册表操作和文件操作可以用来判断,但未说明操作哪个注册表。对于两个函数,拿其中一个,用mlm01.com做反编译,看到的是
staticint SDLCALL SDL_SYS_SaveBMP(SDL_Surface *surface, constchar *file){
HANDLE hFile;
DWORD NumberOfBytesWritten;
DeleteFile(file);
hFile = CreateFile(file, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
return0;
}
if (!WriteFile(hFile, surface->pixels, surface->h * surface->pitch,
&NumberOfBytesWritten, NULL)) {
CloseHandle(hFile);
return0;
}
CloseHandle(hFile);
return1;
}
这就是个写文件,另一个则是性能处理的注册表操作,与恶意无关。(int UnRegisterPerf(int argc, char *argv[]))
基本结论:Kimi的结果,看上去判断正确,但依据是错误的。
02
正常软件
大模型能识别恶意软件,但会不会误判呢,咱找个正常的试试。
我用本机的企业微信里的一个dll,试试,这个是
tms_qimei.dll,有签名
Gemini的结果
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define KEY_NAME "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
int main() {
char path[MAX_PATH];
GetModuleFileName(NULL, path, MAX_PATH);
HKEY hKey;
if (RegOpenKeyEx(HKEY_CURRENT_USER, KEY_NAME, 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) {
DWORD dwDisposition;
if (RegCreateKeyEx(hKey, "malware_name", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) {
DWORD dwSize = (DWORD)strlen(path) + 1;
RegSetValueEx(hKey, NULL, 0, REG_SZ, (const BYTE*)path, dwSize);
RegCloseKey(hKey);
}
}
// ... (rest of the code)
return 0;
}
以下是结论部分
结论:恶意
活动:
持久性:
注册表项:HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunmalware_name
注册表值:恶意软件可执行文件的完整路径。
该代码尝试通过在下创建注册表项来建立持久性HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun。
此注册表项用于在系统启动时自动执行恶意软件。
国际奥委会:
分析:
初始化:
代码首先使用 检索当前正在执行的可执行文件的完整路径GetModuleFileName。
该信息对于持久机制至关重要。
持久性机制:
该代码尝试打开Run注册表项,这是程序注册自动启动的常用位置。
如果该项打开成功,它会在该项下创建一个名为“malware_name”的新子项Run。
最后,它将这个新创建的子项的值设置为可执行文件的完整路径,确保恶意软件在系统启动时执行。
笔记:
本次分析重点关注所提供的代码片段中观察到的持久性机制。
该// ... (rest of the code)部分可能包含其他恶意功能,例如:
数据泄露:
窃取密码、凭证或系统数据等敏感信息。
远程访问木马 (RAT):
使攻击者能够远程控制受感染的系统。
DDoS 攻击:
对目标系统发起分布式拒绝服务攻击。
加密货币挖矿:
未经用户同意利用系统资源进行加密货币挖矿。
数据销毁:
删除或修改关键系统文件。
建议:
删除持久化机制:
删除注册表项HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunmalware_name。
扫描系统是否存在恶意软件:
使用信誉良好的防病毒或反恶意软件彻底扫描系统以查找任何剩余的恶意软件组件。
监控系统活动:
定期监控系统日志和网络流量以发现可疑活动。
保持软件更新:
确保所有操作系统和软件应用程序都更新了最新的安全补丁。
免责声明: 此分析基于提供的代码片段,可能不涵盖实际恶意软件的所有功能。
此信息仅用于教育和研究目的。严禁任何恶意活动或试图利用漏洞的行为。
判断是恶意的,这个就有点过分了,完全无法接受。
Kimi的结果
这次Kimi有个告警,超限了
判决:恶意
详细分析
概述
提供的反编译可执行代码似乎是一个复杂的软件,具有大量的功能和操作。该代码是用类似汇编语言的低级语言编写的,这是旨在混淆其真实性质和逃避检测的恶意软件的典型特征。大量内存分配、释放和字符串操作函数的存在表明,该代码旨在动态创建和管理数据结构,这是恶意软件用来存储和操作数据的常见技术。
恶意行为的主要功能和指标
动态内存管理
该代码广泛使用 和 (例如和 ) 等函数来分配和释放内存。恶意软件经常使用它来创建在执行过程中可能会发生变化的数据结构,从而使静态分析更加困难。
operator new
operator delete
??2
??3
字符串操作
字符串操作有许多实例,包括 、 、 、 和 等函数。这些用于构造和修改字符串,这些字符串可用于各种用途,例如构建文件路径、URL 或命令字符串。
strlen
strcpy
strcat
sprintf
文件和流操作
该代码包括与文件和流操作相关的函数,例如 、 和 .这些操作可用于读取或写入系统上的文件,可能用于数据泄露、持久性或删除其他有效负载。
fopen
fclose
fread
fwrite
fflush
网络活动
尽管提供的代码中没有显式网络函数,但字符串操作和文件操作的存在可能表示网络活动。例如,构建 URL 和发出 HTTP 请求是恶意软件用来与命令和控制 (C2) 服务器通信的常用技术。
错误处理和异常管理
该代码包括广泛的错误处理和异常管理,具有 和 等函数。这表明该代码旨在正常处理各种运行时错误,这是恶意软件用来避免崩溃和保持低调的一种技术。
__CxxFrameHandler4
__GSHandlerCheck
加密和哈希函数
有对加密和哈希函数的引用,例如 和 。这些可用于各种目的,包括为数据完整性检查生成哈希值、加密数据或验证签名。
memcmp
memset
线程和互斥体管理
该代码包括与线程和互斥锁管理相关的函数,例如 和 。这表明该代码设计为在多线程环境中运行,该环境可用于执行并发操作,例如并行数据处理或规避单线程分析工具。
_Mtx_lock
_Mtx_unlock
混淆和反分析技术
代码是高度混淆的,许多函数和操作没有明确、直接的目的。这是恶意软件用来规避静态和动态分析工具的常见技术。
入侵指标 (IOC)
文件路径和名称
该代码构建文件路径和名称,可用于识别恶意软件与之交互的特定文件或目录。例如,使用 和 建议恶意软件检查是否存在特定文件或目录。
PathAppendA
PathFileExistsA
注册表项
尽管提供的代码中没有明确的注册表操作,但 and 等函数的存在表明恶意软件可能与 Windows 注册表交互以加载或操作 DLL。
GetModuleFileNameA
LoadLibraryA
网络 URL
该代码构造可以是 URL 的字符串,尽管不存在显式网络函数。这表明恶意软件可能与外部服务器通信,可能用于命令和控制或数据泄露。
互斥锁
使用互斥锁 ( 和 ) 表明恶意软件可能使用命名互斥锁来同步多个实例或线程之间的操作。这可用于确保一次只运行一个恶意软件实例或协调不同线程之间的活动。
_Mtx_lock
_Mtx_unlock
结论
提供的反编译代码表现出通常与恶意软件相关的几个特征。动态内存管理、字符串操作、文件和流操作以及错误处理的广泛使用表明,该代码旨在执行复杂且可能有害的操作。混淆和反分析技术的存在进一步表明,该代码旨在逃避检测和分析。根据这些观察结果,该代码被归类为恶意代码。
03
总结
1.大模型的输入输出长度受限,无法一次性输入完整软件的代码,是一个问题。
2.从两个大模型测试的结果看,Gemini对恶意软件的判断好象有点道理,其它全是胡扯,尤其是对正常软件的判断。
综上,说明目前通用大模型做软件分析还是无法胜任。
注:本次实验得到华清未央机器语言大模型的帮助,表示感谢。
https://mlm01.com
END
读了这么久,还没点个关注?
Google原文地址:
https://cloud.google.com/blog/topics/threat-intelligence/gemini-for-malware-analysis
原文始发于微信公众号(AI与安全):通用大模型分析恶意软件,完全不靠谱
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论