内网安全之-NTLM协议详解

news2024/11/16 20:29:51
  • NTLM(New Technology LAN Manager)身份验证协议是微软用于Windows身份验证的主要协议之一。早起SMB协议以明文口令的形式在网络上传输,因此产生了安全性问题。后来出现了LM(LAN Manager)身份验证协议,它非常简单以至于很容易就被破解。后来微软提出了NTLM身份验证协议,以及更新的NTLM V2版本。NTLM协议既可以为工作组中的机器提供身份验证,也可以用于域环境身份验证。NTLM协议可以为SMB、HTTP、LDAP、SMTP等上层微软应用提供身份认证。

SSP和SSPI概念

1、SSPI

SSPI(Security Service Provider Interface 或 Security Support Provider Interface,安全服务提供接口) 是Windows定义的一套接口,该接口定义了与安全有关的功能函数,包括但不限于:

  • 身份认证机制
  • 为其他协议提供的Session security机制。Session security指的是会话安全,即为通讯提供数据完整性校验以及数据的加解密功能

SSPI接口定义了与安全有关的功能函数,用来获取验证、信息完整性、信息隐私等安全功能,该接口知识定义了一套接口函数,但是并没有实现具体的内容。

2、SSP

SSP(Security Service Provider,安全服务提供者) 是SSPI的实现者,微软自己实现了如下的SSP,用于提供安全功能,包括但不限于:

  • NTLM SSP:Windows NT 3.51中引入(msv1_0.dll),为Windows 2000之前的客户端-服务器域和非域身份验证(SMB/CIFS)提供NTLM质询/响应身份验证。
  • Kerberos SSP:Windows 2000中引入,Windows vista中更新为支持AES(kerberos.dll),Windows 2000及更高版本中首选的客户端-服务器域相互身份验证。
  • Digest SSP:Windows XP中引入(wdigest.dll),在Windows与kerberos不可用的非Windows系统间提供基于HTTP和SASL身份验证的质询/响应。
  • Negotiate SSP:Windows 2000 中引入(secur32.dll) ,默认选择 Kerberos,如果不可用则选择 NTLM 协议。Negotiate SSP 提供单点登录 能力,有时称为集成 Windows 身份验证(尤其是用于 IIS 时)。在 Windows 7 及更高版本中,NEGOExts 引入了协商使用客户端和服务器上 支持的已安装定制 SSP 进行身份验证。
  • Cred SSP:Windows Vista 中引入,Windows XP SP3 上也可用 (credssp.dll),为远程桌面连接提供单点登录(SSO)和网络级身份验证。
  • Schannel SSP:Windows 2000 中引入(Schannel.dll),Windows Vista 中 更新为支持更强的 AES 加密和 ECC[6]该提供者使用 SSL/TLS 记录来加密 数据有效载荷。
  • PKU2U SSP:Windows 7 中引入(pku2u.dll) , 在不隶属域的系统之间提 供使用数字证书的对等身份验证。

因为SSPI中定义了与Session Security有关的API。所以上层应用利用任何SSP与远程的服务进行了身份验证后,此SSP都会为本次连接生成一个随机Key。这个随机Key被称为Session Key。上层应用经过身份验证后,可以选择性的使用这个Key对之后发往客户端或接受自服务端的数据进行签名或加密。在系统层面,SSP就是一个dll,用来实现身份验证登安全功能。不同的SSP,实现的身份验证机制是不一样的。比如NTLM SSP实现的就是一种基于质询/响应身份验证机制,而Kerberos SSP实现的就是基于Ticket票据的身份验证机制。可以自定义编写SSP,然后注册到操作系统中,让操作系统支持自定义的身份验证方法。

LM Hash加密算法

LM(LAN Manager)身份认证是微软推出的一个身份认证协议,其使用的机密算法是LM Hash加密算法。LM Hash本质是DES加密,尽管LM Hash较容易被破解,但为了保证系统的兼容性,Windows只是将LM Hash禁用了(Windows Vista和Windows Server 2008开始,Windows默认禁用了LM Hash)。LM Hash明文密码被限定在14位以内,也就是说,如果要停止使用LM Hash,将用户的密码设为14位以上即可。
LM Hash的值为:aad3b435b51404eeaad3b435b51404ee,说明LM Hash为空值或者被禁用了。
LM Hash加密流程:

  1. 将用户的明文口令转换为大写,并转换为16进制字符串。
  2. 如果转换后的16进制字符串的长度不足14字节(长度28),用0补全。
  3. 将14字节分为两组,每组7字节转换为二进制数据,每组二进制数据长度为56比特位。
  4. 将每组二进制数据按7比特位为一组,分为8组,每组末尾加0,在转换成16进制,这样每组也就成了8字节长的16进制数据。
  5. 将上面生成的16进制数据,分别作为DES加密秘钥对字符串“KGS!@#$%”进行加密,然后将加密后的两组密文进行拼接,得到最终的LM Hash值

加密实现代码:

# coding=utf-8
import base64
import binascii
from pyDes import *
import hashlib,binascii
import md5

def DesEncrypt(str, Des_Key):
    k = des(Des_Key, ECB, pad=None)
    EncryptStr = k.encrypt(str)
    return binascii.b2a_hex(EncryptStr)


def Zero_padding(str):
    b = []
    l = len(str)
    num = 0
    for n in range(l):
        if (num < 8) and n % 7 == 0:
            b.append(str[n:n + 7] + '0')
            num = num + 1
    return ''.join(b)

if __name__ == "__main__":

    test_str = raw_input("please input a string: ")

    # 用户的密码转换为大写
    test_str = test_str.upper()
    print('\033[91m'+"转换为大写:"+'\033[0m')
    print(test_str)
    #转换为16进制字符串
    test_str = test_str.encode('hex')
    print('\033[91m'+"转换为16进制字符串:"+'\033[0m')
    print(test_str)
    str_len = len(test_str)

    # 密码不足14字节将会用0来补全
    if str_len < 28:
        test_str = test_str.ljust(28, '0')
        print('\033[91m'+"不足14字节(长度28),用0来补全:"+'\033[0m')
        print(test_str)

    # 固定长度的密码被分成两个7byte部分
    t_1 = test_str[0:len(test_str) / 2]
    t_2 = test_str[len(test_str) / 2:]
    print('\033[91m'+"将14字节分为两组,每组7字节"+'\033[0m')
    print(t_1)
    print(t_2)

    # 每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度
    t_1 = bin(int(t_1, 16)).lstrip('0b').rjust(56, '0')
    t_2 = bin(int(t_2, 16)).lstrip('0b').rjust(56, '0')
    print('\033[91m'+"转换为二进制数据,每组二进制数据长度为56比特位"+'\033[0m')
    print(t_1)
    print(t_2)

    # 再分7bit为一组末尾加0,组成新的编码
    t_1 = Zero_padding(t_1)
    t_2 = Zero_padding(t_2)
    print('\033[91m'+"将每组二进制数据按7比特位为一组,分为8组,每组末尾加0"+'\033[0m')
    print(t_1)
    print(t_2)
    # print t_1
    t_1 = hex(int(t_1, 2))
    t_2 = hex(int(t_2, 2))

    t_1 = t_1[2:].rstrip('L')
    t_2 = t_2[2:].rstrip('L')
    print('\033[91m'+"两组分别转换为16进制字符串"+'\033[0m')
    print(t_1)
    print(t_2)

    if '0' == t_2:
        t_2 = "0000000000000000"
    t_1 = binascii.a2b_hex(t_1)
    t_2 = binascii.a2b_hex(t_2)

    # 上步骤得到的8byte二组,分别作为DES key为"KGS!@#$%"进行加密。
    LM_1 = DesEncrypt("KGS!@#$%", t_1)
    LM_2 = DesEncrypt("KGS!@#$%", t_2)
    print('\033[91m'+"上步骤得到的8byte二组,分别作为DES key为\"KGS!@#$%\"进行加密"+'\033[0m')
    print("LM_1:"+LM_1)
    print("LM_1:"+LM_2)

    # 将二组DES加密后的编码拼接,得到最终LM HASH值。
    print('\033[91m'+"将二组DES加密后的编码拼接,得到最终LM HASH值"+'\033[0m')
    LM_Hash = LM_1 + LM_2
    print ("LM_Hash:"+LM_Hash)

image.png

NTLM Hash加密算法

为了解决LM Hash加密和身份验证方案中的安全弱点,微软与1993年在Windows NT 3.1中首次引入了NTLM Hash。微软从Windows Vista和Windows 2008开始,默认禁用了LM Hash,只存储NTLM Hash,而LM Hash的位置则为空。
NTLM Hash算法是微软为了在提高安全性的同时保证兼容性而设计的散列加密算法。NTLM Hash是基于MD4加密算法进行加密的。

1、NTLM加密流程

NTLM Hash是由明文密码经过三步加密而成:
NTLM Hash =md4(unicode(hex(password)))
NTLM Hash的加密流程分为三步,具体如下:

  1. 先将用户密码转换为16进制格式
  2. 再将16进制格式的字符串进行ASCII转Unicode编码
  3. 最后对Unicode编码的16进制字符串进行标准MD4单向哈希加密

实现代码:

# coding=utf-8
from Cryptodome.Hash import MD4
import binascii
from cprint import cprint

#转为16进制格式
def str_to_hex(string):
  return ' '.join([hex(ord(t)).replace('0x', '') for t in string])

#再将16进制格式的字符串进行ASCII转Unicode编码
def hex_to_unicode(string):
  return string.replace(" ","00")+"00"

#最后对Unicode编码的16进制字符串进行标准MD4单向哈希加密
def unicode_to_md4(string):
  m = MD4.new()
  m.update(binascii.a2b_hex(string))
  return m.hexdigest()

if __name__ == "__main__":
    string = input("please input a string: ")
    HEX = str_to_hex(string)
    cprint.err("HEX编码:")
    print(HEX)
    Unicode = hex_to_unicode(HEX)
    cprint.err("ASCII转Unicode编码")
    print(Unicode)
    NTLm_Hash = unicode_to_md4(Unicode)
    cprint.err("对Unicode编码的16进制字符串进行标准MD4单向哈希加密得到NTLM Hash")
    print(NTLm_Hash)

image.png
或者使用Python命令进行加密

python3 -c 'import hashlib,binascii; print("NTLM_Hash:"+binascii.hexlify(hashlib.new
("md4", "123456".encode("utf-16le")).digest()).decode("utf-8"))'

image.png

2、Windows系统存储的NTLM Hash

用户密码经过NTLM Hash机密后存储在 %SystemRoot%\system32\config\SAM 文件里。
当用户输入密码进行本地认证的过程中,所有的操作都是在本地进行的。系统将用户输入的密码转换为NTLM Hash,然后与SAM文件中的NTLM Hash进行比较,相同说明密码正确,反之错误。当用户注销、重启、锁屏后,操作系统会让winlogon.exe显示登录界面,也就是输入框。当winlogon.exe接收收入后,将密码交给lsass.exe进程,lsass.exe进程中会存一份明文密码,将明文密码加密成NTLM Hash,与SAM数据库进行比较认证。使用mimikatz就是从lsass.exe进程中抓取明文密码或密码Hash。
一般抓取到的密码格式第一部分是用户名,第二部分是用户的SID值,第三部分是LM Hash,第四部分是NTLM Hash,其余部分为空。

NTLM协议认证

NTLM身份认证协议是一种基于Challenge/Response质询响应验证机制,由三种类型消息组成。

  • type 1(协商,Negotiate)
  • type 2(质询,Challenge)
  • type 3(认证,Auth)

NTLM身份认证协议有NTLM v1和NTLM v2两个版本,目前使用最多的是NTLM v2版本。他们之间最显著的区别就是Challenge质询值与加密算法不同,共同之处就是都是使用NTLM Hash进行加密。

1、工作组环境下的NTLM认证

工作组环境下NTLM认证流程可以分为4个步骤

  1. 当客户端需要访问服务器的某个服务时,就需要进行身份认证。于是,当客户端输入服务器的用户名和密码进行验证的时候,客户端就会缓存服务器密码的NTLM Hash值。然后,客户端会向服务端发送一个请求,该请求利用NTLM SSP生成NTLMSSP_NEGOTIATE消息(被称为Type 1 NEGOTIATE协商消息)
  2. 服务端接收到客户端发送过来的Type 1消息后,会读取其中的内容并从中选择出自己所能接收的服务内容,加密等级,安全服务等。然后传入NTLMSSP,得到NTLMSSP_CHALLENGE消息(被称为Type 2 Challenge质询消息),并将此Type 2 消息发回客户端。此Type 2消息中包含了一个由服务端生成的16位随机值,此随机值被称为Challenge质询值,服务端会将该Challenge质询值缓存起来。
  3. 客户端收到服务端返回的 Type 2 消息后,读取出服务端所支持的内容,并取 出其中的 Challenge 质询值,用缓存的服务器密码的 NTLM Hash 对其进行加密得 到 Response 消息。最后将 Response 和一些其他信息封装到 NTLMSSP_AUTH 认证消息中(被称为 Type 3 Authenticate 认证消息),发往服务端。
  4. 服务端在收到 Authenticate 认证消息后,从中取出 Net-NTLM Hash。然后 用自己密码的 NTLM Hash 对 Challenge 质询值进行一系列加密运算,得到自己 计算的 Net-NTLM Hash。并比较自己计算出的 Net-NTLM Hash 和客户端发送 的 Net-NTLM Hash 是否相等。如果相等,则证明客户端输入的密码正确,从而 认证成功,反之则认证失败。

2、域环境下的NTLM认证

域环境下的NTLM认证流程可以分为6个步骤:

  1. 客户端想要访问服务器的某个服务,需要进行身份认证。于是,在客户端输入 服务器的用户名和密码进行验证之后,客户端会缓存服务器密码的 NTLM Hash 值。然后,客户端会向服务端发送一个请求,该请求利用 NTLM SSP 生成 NTLMSSP_NEGOTIATE 消息(被称为 Type 1 NEGOTIATE 协商消息)
  2. 服务端接收到客户端发送过来的 Type 1 消息,会读取其中的内容,并从中选 择出自己所能接受的服务内容,加密等级,安全服务等。然后传入 NTLM SSP, 得到 NTLMSSP_CHALLENGE 消息(被称为 Type 2 Challenge 质询消息),并 将此 Type 2 消息发回给客户端。此 Type 2 消息中包含了一个由服务端生成的 16 位随机值,此随机值被称为 Challenge 质询值,服务端将该 Challenge 值缓存起来。
  3. 客户端收到服务端返回的 Type 2 消息,读取出服务端所支持的内容,并取出 其中的 Challenge 质询值,用缓存的服务器密码的 NTLM Hash 对其进行加密得到 Response 消息,Response 消息中可以提取出 Net-NTLM Hash。最后将Response 和一些其他信息封装到 NTLMSSP_AUTH 消息中(被称为 Type 3 Authenticate 认证消息),发往服务端。
  4. 服务端接收到客户端发送来的 NTLMSSP_AUTH 认证消息后,通过 Netlogon 协议与域控建立一个安全通道,将验证消息发给域控。
  5. 域控收到服务端发来的验证消息后,从中取出 Net-NTLM Hash。然后从数据 库中找到该用户的 NTLM Hash,对 Challenge 进行一系列加密运算,得到自己计 算的 Net-NTLM Hash。并比较自己计算出的 Net-NTLM Hash 和服务端发送的 Net-NTLM Hash 是否相等,如果相等,则证明客户端输入的密码正确,认证成 功,反之认证失败,域控将验证结果发给服务端。
  6. 服务端根据 DC 返回的结果,对客户端进行回复。

3、NTLM v1和NTLM v2的区别

NTLM v1 身份认证协议和 NTLM v2 身份认证协议是 NTLM 身份认证协议的不同版本。目前使用最多的是 NTLM v2 版本。NTLM v1 与 NTLM v2 最显著的区别就 是 Challenge 质询值与加密算法不同,共同之处就是都是使用的 NTLM Hash 进 行加密。
Challenge质询值

  • NTLM v1 :8字节
  • NTLM v2 : 16字节

Net-NTLM Hash使用的加密算法

  • NTLM v1:DES加密算法
  • NTLM v2:HMAC-MD5加密算法

4、LmCompatibilityLevel

LmCompatibilityLevel 值用来确定网络登录使用的质询/响应身份验证协议。此选 项会影响客户端使用的身份验证协议的等级、协商的会话安全的等级以及服务器接 受的身份验证的等级,如下是 LmCompatibilityLevel 为不同值的含义:

含义
0客户端使用 LM 和 NTLM 身份验证,但从不使用 NTLM v2 会话安全性。域控制器接受 LM、NTLM 和 NTLM v2身份验证。
1客户端使用 LM 和 NTLM 身份验证,如果服务器支持 NTLM v2 会话安全性,则使用 NTLM v2 会话安全性。域控制器接受 LM、NTLM 和 NTLM v2 身份验证。
2客户端仅使用 NTLM 身份验证,如果服务器支持 NTLM v2 会话安全性,则使用 NTLM v2 会话安全性。域控制器接受 LM、NTLM 和 NTLM v2 身份验证。
3客户端仅使用 NTLM v2 身份验证,如果服务器支持 NTLM v2 会话安全性,则使用 NTLM v2 会话安全性。域控制器接受 LM、NTLM 和 NTLM v2 身份验证。
4客户端仅使用 NTLM v2 身份验证,如果服务器支持 NTLM v2 会话安全性,则使用 NTLM v2 会话安全性。域控制器拒绝 LM 身份验证,但接受 NTLM 和 NTLM v2 身份验证。
5客户端仅使用 NTLM v2 身份验证,如果服务器支持 NTLM v2 会话安全性,则使用 NTLM v2 会话安全性。域控制器拒绝 LM 和 NTLM 身份验证,但接受 NTLM v2 身份验证。

如何手动进行修改?
打开本地安全策略–》安全设置–》本地策略–》安全选项–》网络安全:LAN管理器身份验证级别,默认其值是没有定义的,使用默认值

NTLM协议的安全问题

从上面 NTLM 认证的流程中我们可以看到,在 Type 3 Auth 认证消息中是使用用户密码的 Hash 计算的。因此当我们没有拿到用户密码的明文而只拿到 Hash 的情况下,我们可以进行 **Pass The Hash(PTH)攻击,也就是哈希传递攻击。同样,还是在 Type3 消息中,存在 Net-NTLM Hash,当攻击者获得了 Net- NTLM Hash 后,可以进行中间人攻击,重放 Net-NTLM Hash,这种攻击手法也就是NTLM Relay(NTLM 中继)**攻击。并且由于 NTLM v1 版本协议加 密过程存在天然缺陷,可以对 Net-NTLM v1 Hash 进行爆破,得到 NTLM Hash。拿到 NTLM Hash 后即可进行横向移动。

1、Pass The Hash

Pass The Hash(PTH)哈希传递攻击是内网横向移动的一种方式。主要原因是 NTLM 认证过程中使用的是用户密码的 NTLM Hash 来进行加密。因此当我们获取到了用户密码的 NTLM Hash 而没有解出明文时,我们可以利用该 NTLM Hash 进行哈希传递攻击,对内网其他机器进行 Hash 碰撞,碰撞到使用相同密码的机器。然后通过 135 或 445 端口横向移动到使用该密码的其他机器。

2、NTML Relay

NTLM Relay 其实严格意义上并不能叫 NTLM Relay,而是应该叫 Net-NTLM Relay。它是发生在 NTLM 认证的第三步,在 Response 消息中存在 Net-NTLM Hash,当攻击者获得了 Net-NTLM Hash 后,可以进行中间人攻击,重放 Net- NTLM Hash,这种攻击手法也就是 NTLM Relay(NTLM 中继)攻击。

3、Net-NTLM v1 Hash破解

由于 NTLM v1 身份认证协议加密过程存在天然缺陷,只要获取到 Net-NTLM v1 Hash,都能破解为 NTLM hash,这与密码强度无关。在域环境中这更有效,因为域中使用 hash 即可远程连接目标机器。如果域控允许发送 NTLM v1 响应的话, 我们就可以通过与域控机器进行 NTLM 认证,然后抓取域控的 Net-NTLM v1 Hash,破解为 NTLM Hash。使用域控的机器账号和哈希即可导出域内所有用户哈希。

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

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

相关文章

排序问题—java实现

冒泡排序 算法思想&#xff1a; 每次比较相邻元素&#xff0c;若逆序则交换位置&#xff0c;每一趟比较n-1次&#xff0c;确定一个最大值。故需比较n趟&#xff0c;来确定n个数的位置。 外循环来表示比较的趟数&#xff0c;每一趟确定一个最大数的位置内循环来表示相邻数字两…

2024考研国家线公布,各科分数线有哪些变化?考研国家线哪些涨了,哪些跌了?可视化分析告诉你

结论在文章结尾 2024考研国家线 一、近五年国家线趋势图-学术硕士 文学 管理学 工学照顾专业 体育学 交叉学科 军事学 历史学 理学 享受少数名族照顾政策的考生 中医类照顾专业 教育类 艺术类 医学 工学 哲学 法学 农学 经济学 二、近五年国家线趋势图-专业硕士 中医 应用心理 …

IPSEC VPN-详解原理

目录 IPSEC提供的安全服务 IPSEC协议簇 ​编辑 安全协议 1.传输模式 2. 隧道模式 AH ---鉴别头协议 AH提供的安全服务&#xff1a; AH头部 AH的保护范围 1.传输模式 2.隧道模式 ​编辑 ESP ---封装安全载荷协议 ESP提供的安全服务&#xff1a; ESP的头部 ESP的保护范围 1.传输…

如何选择合适的数据可视化工具?

如果是入门级的数据可视化工具&#xff0c;使用Excel插件就足够了&#xff01; Excel插件&#xff0c;tusimpleBI 是一款 Excel 图表插件&#xff0c;提供超过120项图表功能&#xff0c;帮助用户制作各种 Excel 所没有的高级图表&#xff0c;轻轻松松一键出图。 它能够制作10…

【送书福利!第一期】《ARM汇编与逆向工程》

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f618;《CTF专栏》超级详细的解析&#xff0c;宝宝级教学让你从蹒跚学步到健步如飞&#x1f648; &#x1f60e;《大数据专栏》大数据从0到秃头&#x1f47d;&…

SD-WAN解决企业在工业互联网时代的新困境

工业互联网迎来全新的发展契机&#xff0c;而SD-WAN技术将成为制造企业快速崭露头角的得力助手&#xff01; 制造业的数字化转型已成为经济全球化和数字化浪潮的必然产物。许多制造企业迅速向人口密集区域扩张&#xff0c;呈现出分支众多、布局分散的特点。随着工业互联网的蓬勃…

Linux环境开发工具之yum

前言 前面我们已经对基本的指令和权限进行了介绍&#xff0c;本期开始我们将介绍常用的开发工具。例如&#xff1a;软件包管理器yum。 本期内容介绍 Linux上安装软件的方式 什么是yum yum的相关操作 yum的本地配置和yum源 一、Linux上安装软件的方式 在介绍Linux上如何安装一…

upload-lab 11-20解法

pass11 查看代码 这里我们先解读下代码 $is_upload false; $msg null; if(isset($_POST[submit])){# 定义了白名单数组$ext_arr array(jpg,png,gif);# 截取上传文件名最后一个带点的文件后缀 $file_ext substr($_FILES[upload_file][name],strrpos($_FILES[upload_file][n…

10:00面试,10:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

SHELL——条件判断语句练习

目录 一、练习题目 二、解答过程 1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查次磁盘剩余空间。 安装邮件服务 配置邮件服务 编写脚本work1.sh 添加计划任务 2、判断web服务是否运行&#xff1a;…

基于PyTorch的视频分类实战

1、数据集下载 官方链接&#xff1a;https://serre-lab.clps.brown.edu/resource/hmdb-a-large-human-motion-database/#Downloads 百度网盘连接&#xff1a; https://pan.baidu.com/s/1sSn--u_oLvTDjH-BgOAv_Q?pwdxsri 提取码: xsri 官方链接有详细的数据集介绍&#xf…

疯狂 META:Aavegotchi 新一季稀有度挖矿来了!

经过数周的激烈讨论和参与&#xff0c;AavegotchiDAO 再次投票决定资助新一季的稀有度挖矿活动&#xff0c;这也是我们神奇的第八季&#xff01;朋友们&#xff0c;我们又开始啦——拿出你们最好的装备&#xff0c;擦亮那些可穿戴设备&#xff0c;准备好赚钱吧&#xff01; 与…

HarmonyOS系统开发ArkTS入门案例及组件

目录 一、声明式UI 二、ArkTs 快速入门案例 三、组件 四、渲染控制 一、声明式UI 声明式UI就是一种编写用户界面的范式或方式、 ArArkTS 在继承了Typescript语法的基础上&#xff0c;主要扩展了声明式UI开发相关的能力。 声明式UI开发范式大致流程&#xff1a;定义页面…

IPv4到IPv6的过渡策略

IPv4到IPv6的过渡是一个复杂且必要的过程&#xff0c;随着全球互联网的不断发展&#xff0c;IPv4地址资源的枯竭使得向IPv6过渡成为一项紧迫的任务。IPv6提供了更广阔的地址空间、更高的安全性和更灵活的路由方式&#xff0c;是未来互联网发展的必然趋势。下面将详细阐述如何从…

面向对象【内部类】

什么是内部类 将一个类 A 定义在另一个类 B 里面&#xff0c;里面的那个类 A 就称为内部类&#xff08;InnerClass&#xff09;&#xff0c;类 B 则称为外部类&#xff08;OuterClass&#xff09; 为什么要声明内部类 具体来说&#xff0c;当一个事物 A 的内部&#xff0c;还…

基于SpringBoot的后勤管理系统【附源码】

后勤管理系统开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myecli…

LLM 面试知识点——模型基础知识

1、主流架构 目前LLM(Large Language Model)主流结构包括三种范式,分别为Encoder-Decoder、Causal Decoder、Prefix Decode。对应的网络整体结构和Attention掩码如下图。 、 各自特点、优缺点如下: 1)Encoder-Decoder 结构特点:输入双向注意力,输出单向注意力。 代表…

【C语言】linux内核pci_save_state

一、中文注释 //include\linux\pci.h /* 电源管理相关的例程 */ int pci_save_state(struct pci_dev *dev);//drivers\pci\pci.c /*** pci_save_state - 在挂起前保存PCI设备的配置空间* dev: - 我们正在处理的PCI设备*/ int pci_save_state(struct pci_dev *dev) {int i;/* X…

HTML + CSS 核心知识点- 定位

简述&#xff1a; 补充固定定位也会脱离文档流、不会占据原先位置 1、什么是文档流 文档流是指HTML文档中元素排列的规律和顺序。在网页中&#xff0c;元素按照其在HTML文档中出现的顺序依次排列&#xff0c;这种排列方式被称为文档流。文档流决定了元素在页面上的位置和互相之…

基于Spring Boot的美食分享系统设计与实现

摘 要 美食分享管理&#xff0c;其工作流程繁杂、多样、管理复杂与设备维护繁琐。而计算机已完全能够胜任美食分享管理工作&#xff0c;而且更加准确、方便、快捷、高效、清晰、透明&#xff0c;它完全可以克服以上所述的不足之处。这将给查询信息和管理带来很大的方便&#x…