渗透测试之内核安全系列课程:Rootkit技术初探(四)

今天,我们来讲一下内核安全!

本文章仅提供学习,切勿将其用于不法手段!

目前,在渗透测试领域,主要分为了两个发展方向,分别为Web攻防领域和PWN(二进制安全)攻防领域。在PWN二进制领域免杀技术,一直是后渗透利用阶段的重要安全技术之一。

想要免杀,需要了解的安全技术知识包括软件加壳代码混淆(例如,使用花指令)、隐匿技术(例如,Rootkit技术)、动态加密内容

接上一篇文章,我们来继续讲述下 Rootkit技术 的相关基础知识点内容

在《 渗透测试之内核安全系列课程:Rootkit技术初探 》之前的文章中,我们讲述了 GDT 全局描述符表、LDT 局部描述符表、GDTR 全局描述符表 寄存器、LDTR 局部描述符表 寄存器 、一致性代码、非一致性代码、实模式、保护模式、线性地址 、PDPT 页目录指针表、PDT 页目录表、PTT 页表、P 页 、PDE 页目录表项 、PTE 页表项 、CR0 控制寄存器、CR2 页故障线性地址寄存器、 CR3 页目录基址寄存器 等非常重要的 基础知识 点 内容 

这些内容,是学习 Rootkit 技术 的基础 !

今天,我们来继续来重点讲解下 线性地址 到 物理地址 的 转换过程

首先,让我们来复习一下,相关的技术知识点

CR0 控制寄存器,最重要的两个比特位,分别是第 1 位 第 32 位

CR0控制寄存器的第1位 PE控制保护模式 的 开启关闭 !当 PE 位 是 1 时,保护模式 处于 开启 状态 ,当 PE 位 是 0 时,保护模式 处于 关闭 状态,此时 计算机 运行于 实模式

CR0控制寄存器的第32位 PG控制内存分页机制 的 开启关闭 !当 PG 位 是 1 时,内存分页机制 处于 开启 状态 ,当 PG 位 是 0 时,内存分页机制 处于 关闭 状态,此时 计算机 运行于 实模式

如果需要 启用 内存分页机制,那么 第 1 位 PE 位第 32 位 PG 位 的值,均要为 1

CR2 页故障线性地址寄存器,主要用于 在页异常情况发生时,存储 产生异常线性地址

发生页异常时(例如,指定的内存分页,并不存在 !这时,会触发 缺页中断 )CPU 会把引起 缺页中断线性地址 保存在 CR2 页故障线性地址寄存器 之中!

操作系统中的页异常处理程序(其实就是 缺页中断 所对应的  中断服务程序)可以通过检查 CR2 页故障线性地址寄存器 的 内容值 的方式,去筛查出 缺页中断 这个异常 是 由 虚拟地址空间(线性地址空间)中的哪个 线性地址访问  所引起的(CR2 页故障线性地址寄存器,主要用于定位错误,以及通过分页交换文件去辅助载入内存分页)!

我们需要知道,针对 缺页中断 ,从 硬盘 中 去载入 相对应的 页表资源 或 页资源,是由 缺页中断 对应的  中断服务程序 去自动完成的 !CR2 页故障线性地址寄存器,在 从 硬盘空间  向 内存空间 载入  指定页表资源 或 指定页资源 时,发挥了非常重要作用

CR3 页目录基址寄存器,主要用于 PDT 页目录表PDPT 页目录指针表物理寻址

CR3 页目录基址寄存器,存储了 PDT 页目录表 或 PDPT 页目录指针表物理内存地址

启用PAE 物理地址扩展的基础上,CR3 页目录基址寄存器高 27 位,被用于 进行 PDPT 页目录指针表 物理地址寻址

什么是 PAE 呢?

PAE ,指的是 物理地址扩展

物理地址扩展(PAE) 中央处理器 CPU 的一项功能,它的作用是:使 x86 系列的处理器 能够在支持 PAE 物理地址扩展 技术 的 部分 Windows 操作系统环境(是否支持 PAE 物理地址扩展,与系统版本有关。例如, Windows 7 (32 位)   、Windows Server 2008 仅 (32 位)  、Windows Vista 仅 (32 位)  、Windows Server 2003 仅 (32 位)  、Windows XP (32 位) )中 访问 4 GB 以上物理内存地址。 能够访问的内存物理地址大小,取决于中央处理器CPU能够支持最大内存物理地址上限(例如,64位 CPU,所能支持的最大物理内存)!

未启用 PAE 物理地址扩展机制 之前,32位 线性地址 寻址,线性地址 的 结构高 10 位 的 页目录 表项索引 、中 10 位 的 页表 表项索引、低 12 位 的 页内偏移量 共同组成 !

已启用 PAE 物理地址扩展机制 之后,32位 线性地址 寻址,线性地址 的 结构高 2 位 的 页目录指针 表项索引 、中高 9 位 的 页目录 表项索引、中 9 位 的 页表 表项索引、低 12 位 的 页内偏移量 共同组成 !

注意,在 启用 PAE 物理地址扩展机制 之后,页目录表 中 每个子项大小8个字节( 64位 )

注意,在 启用 PAE 物理地址扩展机制 之后,页目录表 中 的 子项 数量 最多为 512 个

注意,在 启用 PAE 物理地址扩展机制 之后,页表 中 每个子项大小8个字节( 64位 )

注意,在 启用 PAE 物理地址扩展机制 之后,页表 中 的 子项 数量 最多为 512 个

32位操作系统环境 下,页目录( PDT ) 、 页表( PTT ) 、 页( P ) 内存空间 大小 均为 4 KB ( 4096 B ,4096 个字节)

32位操作系统环境 下,在未启用 PAE 物理地址扩展机制 之前, 页目录表( PDT )子项数量1024 个子项大小4字节(32位)

32位操作系统环境 下,在未启用 PAE 物理地址扩展机制 之前, 页表( PTT )子项数量1024 个子项大小4字节(32位)

32位操作系统环境 下,在已启用 PAE 物理地址扩展机制 之后, 页目录表( PDT )子项数量 512 个子项大小 8字节( 64位 )

32位操作系统环境 下,在已启用 PAE 物理地址扩展机制 之后, 页表( PTT )子项数量512 个子项大小8字节( 64位 )

32位操作系统环境 下,在已启用 PAE 物理地址扩展机制 之后, 页目录指针表( PDPT )4 个 页目录指针 组成,每个指针 指向 一个 页目录表(PDT)CR3寄存器 的内容值 定义,会发生一定的变化,CR3寄存器 的内容值 的 低 5 位 不再使用CR3寄存器 的内容值 的 高 27 位 被用于指向 页目录指针表 PDPT 的 基址(页目录指针表 PDPT 的 起始地址)(物理内存地址)

页目录( PDT ) 、页表( PTT ) 、页( P )内存边界 均是以 4 KB 对齐的!也就是说,页目录 、页表 、页 的 内存空间 的 起始地址(物理地址)除了第一个以 0 为起点的 内存空间(0~4095) 之外,其它的内存空间 的 起始地址(物理地址),都是 以4KB的整数倍 为起点的。

让我们再来深入研究一下 页目录(PDT)页表(PTT)的 相关知识点内容!

在 32位 的 操作系统环境 下,页目录( PDT ) 和 页表( PTT ) 的子项数量,均为 1024 !每个子项的内存空间大小,均为 4个字节 ( 4096 B ,4096 个字节)!

4 个 字节( BYTE ),等于 32 个 比特位( BIT ) !

页目录( PDT ) 每个子项(PDE)高20位(第13-32位)页表空间基址(起始地址)(物理内存地址)

页目录( PDT ) 每个子项(PDE) 的 第 1 位  P( Present )位 ,用于标记,PDE( 页目标表项 )指向的页面内容( 页表 PTT大页 Large Page是否存在( 如果不存在,可能会触发 缺页中断,从而 通过 虚拟内存 技术 中的 分页文件交换技术,将存储在 物理硬盘 中的 分页内容 载入到 物理内存 中 )!  。

页目录( PDT ) 每个子项(PDE) 的 第 2 位  R/W( Read/Write ) 位  ,用于标记,PDE( 页目标表项 )指向的页面内容( 页表 PTT大页 Large Page是否可写( 当 RW 位 的 值 为 0 时,PDE 页目录表项 指向 的 页面 只读 !当 RW 位 的 值 为 1 时,PDE 页目录表项 指向 的 页面 可读、可写 )!  。

页目录( PDT ) 每个子项(PDE) 的 第 3 位  U/S( User/Supervisor )位  ,用与标记,PDE( 页目标表项 )指向的页面内容( 页表 PTT大页 Large Page是否允许用户态程序( 特权级:R3 )访问(如果 U位 的内容值 为 0 , 则代表着,这个子项 指向 的 页表( 4KB 大小 ) 或 页( 大页,4MB 大小 ) 仅能够 被 操作系统 的 内核程序去进行 访问 和 操作) !

页目录( PDT ) 每个子项(PDE) 的 第 4 位  PWT( Page-level Write-Through ) 位   , 用于控制 页面 的 写入 策略( PWT 位 内容值 被 设置为 1 时,它 指示 中央处理器 CPU 对 指定页面写操作 应使用 写穿( Write-Through )策略,而不是 常见的 写回( Write-Back)策略写穿( Write-Through )策略 的 实现原理 为, 中央处理器 CPU 对 缓存在 CPU高速缓存 中的 页面内容 执行 写回操作时,缓存在 CPU高速缓存 中的 页面内容 会被 立即写入到 物理内存 之中 !写回( Write-Back)策略 实现原理 ,首先,中央处理器 CPU 会把 缓存在 CPU高速缓存 中的页面内容 进行  “脏”(dirty)标记处理脏标记(dirty)表示缓存在 CPU高速缓存 中的 页面内容 是需要被写回物理内存中去的)!之后,被缓存在 CPU高速缓存 中的 页面内容 会在合适的时机(如缓存行被替换或系统空闲时),被异步写回物理内存中去 )!

页目录( PDT ) 每个子项(PDE) 的 第 5 位  PCD( Page Cache Disable )位  ,用于 控制 对应 页面 的 缓存 能力(当 PCD 位 内容值 被 设置为 1 时,PDE 页目录表项 指向 的 页面内容( 页表 PTT大页 Large Page不能 被 CPU 进行 缓存 操作 !当 PCD 位 内容值 被 设置为 0 时,PDE 页目录表项 指向 的 页面内容( 页表 PTT大页 Large Page能够 被 CPU 进行 缓存 操作 )!

页目录( PDT ) 每个子项(PDE) 的 第 6 位  A(Accessed)位  ,用于标记,PDE(页目标表项)指向的页面内容( 页表 PTT大页 Large Page 是否已经被访问过

页目录( PDT ) 每个子项(PDE) 的 第 7 位  D(Dirty)位  ,用于标记,PDE( 页目录表项 )指向的页面内容( 页表 PTT大页 Large Page 是否已经被修改过

页目录( PDT ) 每个子项(PDE) 的 第 8 位  PS(Page Size)位  , 用于说明 PDE( 页目录表项 )指向的页面内容( 页表 PTT大页 Large Page )的空间大小( 页表 PTT页面大小4 K B大页 Large Page 页面大小 4 M B ,这涉及到了 页面大小扩展(PSE)技术 ) 。

页目录( PDT ) 每个子项(PDE) 的 第 9 位  G(Global)位  ,用于标记,PDE( 页目录表项 )指向的页面内容( 页表 PTT大页 Large Page )的 可访问属性 是否为 全局性的( 如果 PDE( 页目录表项 )的 G(Global)位 的 内容值被设置为 1则代表 PDE( 页目录表项 )指向的页面内容( 页表 PTT大页 Large Page )的 页面属性全局性的!全局页面,能够被多个进程进行共享访问 !并且,全局页面页面属性进程切换之时 不会被刷新这种 公有页面,通常是通过 CreateFileMapping 系统调用 创建与分配 的 ! 如果 PDE( 页目录表项 )的 G(Global)位 的 内容值被设置为则代表 PDE( 页目录表项 )指向的页面内容( 页表 PTT大页 Large Page )是 进程私有 的,只有创建这个页面( 页表 PTT大页 Large Page )的进程可以去 访问操作 它!这种 私有页面,通常是通过 VirtualAlloc 系统调用进行 创建与分配 的 )!

页目录( PDT ) 每个子项(PDE) 的 第 10-12 位  AVL(Available)  , 这是一个在较处理器架构中引入的标志位,主要用于支持 页目录表 的 优化 和 特性AVL位,通常被用于,指示 页目录表项(PDE)是否可被用于执行某些优化操作!例如,页目录表项 的 合并 或 快速查找 如果 处理器 或 操作系统,检测 到 某个页目录表项 的 AVL位 被设置 为 非 0 值 时,处理器 或 操作系统 可以利用这一信息去执行 更为 高效 的 内存管理操作 !需要注意的是,AVL位 的 具体含义 和 行为 可能由于 不同 的 处理器架构 和 操作系统 而 存在 差异)!

注意,在页目录PDT )的子项( PDE )中,PS 位(Page Size)位 ,是非常重要的!PS位( 第8位 ),仅在 PDE( 页目录项 ) 中存在,是 PDE( 页目录项 ) 中非常值得一提的比特位!当 PDE( 页目录项 ) 的 PS 位( 第8位 ) 为 0 时,代表,PDE( 页目录项 )指向 页表( 页表大小为 4KB )!,当 PDE( 页目录项 ) 的 PS 位( 第8位 ) 为 1 时,代表PDE( 页目录项 )直接指向页( P ),这时,页的大小为 4MB(这是一个大页),此时,这个大页( 4MB 大小的物理页)的物理地址计算公式为: PDE( 页目录项 ) 的 高 10 位  +  线性地址 的 低 22 位 。

上述的页目录( PDT )的子项(PDE)除了前7位之外,其它各比特位用途不固定(各关键比特位的位置,同样不固定),因操作系统类型、CPU 版本不同而存在差异!

页表( PTT )每个子项(PTE) 的 高20位(第13-32位)为 页空间 的 基址(起始地址)(物理内存地址)!

页表( PTT )每个子项(PTE) 的 第 1 位  P( Present )位 ,用于标记,PTE( 页表项 )指向的页面内容是否存在( 如果不存在,可能会触发 缺页中断,从而 通过 虚拟内存 技术 中的 分页文件交换技术,将存储在 物理硬盘 中的 分页内容 载入到 物理内存 中 )!  。

页表( PTT )每个子项(PTE) 的 第 2 位  R/W( Read/Write ) 位  , 用于标记,PTE( 页表项)指向的页面内容是否可写( 当 RW 位 的 值 为 0 时,PTE 页表项 指向 的 页面 只读 !当 RW 位 的 值 为 1 时,PTE 页表项 指向 的 页面 可读、可写 )!  。

页表( PTT )每个子项(PTE) 的 第 3 位  U/S( User/Supervisor )位  ,用与标记,PTE( 页表项 )指向的页面内容( 页 P )是否允许用户态程序( 特权级:R3 )访问(如果 U位 的内容值 为 0 , 则代表着,这个子项 指向 的  页( 4 K B 大小 ) 仅能够 被 操作系统 的 内核程序去进行 访问 和 操作) !

页表( PTT )每个子项(PTE)(PTE) 的 第 4 位  PWT( Page-level Write-Through ) 位  第 4 位  PWT( Page-level Write-Through ) 位   , 用于控制 页面 的 写入 策略( PWT 位 内容值 被 设置为 1 时,它 指示 中央处理器 CPU 对 指定页面写操作 应使用 写穿( Write-Through )策略,而不是 常见的 写回( Write-Back)策略写穿( Write-Through )策略 的 实现原理 为, 中央处理器 CPU 对 缓存在 CPU高速缓存 中的 页面内容 执行 写回操作时,缓存在 CPU高速缓存 中的 页面内容 会被 立即写入到 物理内存 之中 !写回( Write-Back)策略 实现原理 ,首先,中央处理器 CPU 会把 缓存在 CPU高速缓存 中的页面内容 进行  “脏”(dirty)标记处理脏标记(dirty)表示缓存在 CPU高速缓存 中的 页面内容 是需要被写回物理内存中去的)!之后,被缓存在 CPU高速缓存 中的 页面内容 会在合适的时机(如缓存行被替换或系统空闲时),被异步写回物理内存中去 )!

页表( PTT )每个子项(PTE) 的 第 5 位  PCD( Page Cache Disable )位  ,用于标记,PTE(页表项)指向的页面内容是否允许被进行页面缓存操作( 当 PCD 位 内容值 被 设置为 1 时,PTE 页表项 指向 的 页面内容( 页 P )不能 被 CPU 进行 缓存 操作 !当 PCD 位 内容值 被 设置为 0 时,PTE 页表项 指向 的 页面内容( 页 P能够 被 CPU 进行 缓存 操作 )!

页表( PTT )每个子项 的 第 6 位  A(Accessed)位  ,用于标记,PTE(页表项)指向的页面内容是否已经被访问过!

页表( PTT ) 每个子项(PTE) 的 第 7 位  D(Dirty)位  ,用于标记,PTE(页表项)指向的页面内容是否已经被修改过!

页表( PTT ) 每个子项(PTE) 的 第 8 位  PAT 位(Page Attribute Table),是奔腾3及以后版本的CPU引入的一个页属性表标识位(当 PTE(页表项)的 PAT位内容值 被设置为 1 时,它允许通过一系列专用寄存器(MBR)为每个页面提供更详细的属性设置。这些属性设置可以提供更精细的内存访问控制,包括缓存策略、内存类型等,从而优化系统的性能和响应速度)!

页表( PTT ) 每个子项(PTE) 的 第 9 位  G 位  , 用于标记,PTE( 页表项 )指向的页面内容( 页 )的 可访问属性 是否为 全局性的( 如果 PTE( 页表项 )的 G(Global)位 的 内容值被设置为 1则代表 PTE( 页表项 )指向的页面内容( 页 )的 页面属性全局性的!全局页面,能够被多个进程进行共享访问 !并且,全局页面页面属性进程切换之时 不会被刷新这种 公有页面,通常是通过 CreateFileMapping 系统调用 创建与分配 的 ! 如果 PTE( 页表项 )的 G(Global)位 的 内容值被设置为则代表 PTE( 页表项 )指向的页面内容( 页 )是 进程私有 的,只有创建这个页面( 页 )的进程可以去 访问操作 它 !这种 私有页面,通常是通过 VirtualAlloc 系统调用进行 创建与分配 的 )!

页表( PTT ) 每个子项(PTE) 的 第 10-12 位  AVL(Available)位  , 这是一个在较处理器架构中引入的标志位,主要用于支持 页表 的 优化 和 特性AVL位,通常被用于,指示 页表项(PTE)是否可被用于执行某些优化操作!例如,页表项 的 合并 或 快速查找 如果 处理器 或 操作系统,检测 到 某个页表项 的 AVL位 被设置 为非 0 值 时,处理器 或 操作系统 可以利用这一信息去执行 更为 高效 的 内存管理操作 !需要注意的是,AVL位 的 具体含义 和 行为 可能由于 不同 的 处理器架构 和 操作系统 而 存在 差异)!

上述的页表( PTT )的子项(PTE)除了前7位之外,其它各比特位用途不固定(各关键比特位的位置,同样不固定),因操作系统类型、CPU 版本不同而存在差异!

记住,无论是 页目录( PDT ),还是 页表( PTT ) ,亦或者是 页( P )  ,在一般情况下,它们的 限长(空间大小)均为 4 KB( 4096 B ,4096 字节 )!对于 页( P ),会存在 大页 的情况,当 页( P )的 类型为 大页 时, 页( P )空间大小4 M B  !

页目录( PDT )、 页表( PTT )、页( P )、页目录项( PDE )、 页表项( PTE )等更详细、更精准的信息,请参见 《 Intel 微处理器 》这本书!《 Intel 微处理器 》是由美国的Barry B.Brey (德幅瑞大学)编著的,由 北京航空航天大学 的 金惠华、艾明晶、尚利宏 等专业人士进行翻译!《 Intel 微处理器 》出版自 机械工业出版社 !《 Intel 微处理器 》这本书出版自 2010 年,虽然十多年过去了,但是,底层基础知识,底层的技术架构,还是具备非常重要的参考价值的 !

在未来的课程中,我们可能会去研究 数据执行保护( DEP )非统一内存访问( NUMA )

虚拟内存技术 中的 分页交换技术实现,原定于在本章进行讲解,但介于篇幅限制,决定改为 在未来章节中进行有关的内容讲解

请关注下一篇,渗透测试之内核安全系列课程:Rootkit技术初探(五)

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

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

相关文章

汽车网络安全深入分析

汽车网络安全的重要性及背景 随着科技的飞速发展,汽车行业正经历着一场深刻的变革。汽车不再仅仅是一种交通工具,而逐渐演变成了一个具备高度智能化和互联化的复杂系统。在这个过程中,汽车网络安全的重要性日益凸显。 汽车网络安全的重要意义不言而喻。首先,它关乎到用户的…

python列表---基本语法(浅拷贝,深拷贝等)

文章目录 引言:列表的注意事项1 list中的浅拷贝与深拷贝1.1浅拷贝(Shallow Copy)浅拷贝的方法浅拷贝的效果1.2深拷贝(Deep Copy)深拷贝的方法深拷贝的效果1.3 总结:浅拷贝 vs 深拷贝1.4 为什么浅拷贝顶层元素如果是不可变数据就不能共享,不是传的是引用就相当于传的是地…

⌈ 传知代码 ⌋ 以思维链为线索推理隐含情感

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

速览三版HTTP的改进策略

HTTP(Hypertext Transfer Protocol)是互联网通信的基础协议,自从其第一个版本推出以来,经历了多个版本的改进,每个版本都针对之前的不足进行了优化和增强。以下是HTTP/1.1、HTTP/2和HTTP/3的主要改进总结: …

大学体育(二)(华中科技大学) 中国大学MOOC答案2024版100分完整版

大学体育(二)(华中科技大学) 中国大学MOOC答案2024版100分完整版 有氧运动 有氧运动单元测验 1、 世界卫生组织对18-64岁年龄组成年人的运动建议是:每周至少( )分钟的中等强度有氧身体活动,或者每周至少&a…

Linux网络命令——tcpdump

tcpdump是Linux下的一个网络数据采集分析工具,也就是常说的抓包工具 tcpdump 核心参数 tcpdump [option] [proto] [dir] [type] 例如:$ tcpdump -i eth0 -nn -s0 -v port 80 option 可选参数: -i : 选择要捕获的接口,通常是以太…

定时器中断计数

1.定时器中断配置步骤 (1)RCC开启时钟。 (2)选择时基单元的时钟源(内部时钟源)。 (3)配置时基单元:预分频器、自动重装器、计数模式等。 (4)配…

2024.05.27 校招 实习 内推 面经

绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、实习 | 博世软件中心2025届实习生招聘(内推) https://mp.weixin.qq.com/s/zjQNwfEebNi9oNww-DiJ7g 2、校招&实习 | 腾讯混元大模型招募顶尖技术学生 校招&…

OpenGauss数据库-3.数据库管理

第1关:创建数据库 gsql -d postgres -U gaussdb -w passwd123123 create database accessdb with ownergaussdb templatetemplate0;第2关:修改数据库 gsql -d postgres -U gaussdb -w passwd123123 alter database accessdb rename to human_tpcds; 第…

OpenGauss数据库-6.表空间管理

第1关:创建表空间 gsql -d postgres -U gaussdb -W passwd123123 CREATE TABLESPACE fastspace OWNER omm relative location tablespace/tablespace_1; 第2关:修改表空间 gsql -d postgres -U gaussdb -W passwd123123 ALTER TABLESPACE fastspace R…

Docker装不上怎么办

最近Docker的消息相信大家都已经知道了,你在安装Docker的时候如果还用官网的源安装的话基本上都会因为网络问题安装不上,那么Docker就不能使用了吗,当然不是,我们可以通过阿里云的地址去安装,废话不多说,直…

C++ 贪心算法——跳跃游戏、划分字母区间

一:跳跃游戏 55. 跳跃游戏 题目描述:给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回 true &#xff1…

《大道平渊》· 拾壹 —— 商业一定是个故事:讲好故事,员工奋发,顾客买单。

《大道平渊》 拾壹 "大家都在喝,你喝不喝?" 商业一定是个故事,人民群众需要故事。 比如可口可乐的各种故事。 可口可乐公司也只是被营销大师们, 作为一种故事载体,发挥他们的本领。 营销大师们开发故事…

基于51单片机俄罗斯方块小游戏

基于51单片机俄罗斯方块游戏 (仿真+程序) 功能介绍 具体功能: 1.用LCD12864显示游戏界面; 2.用四个按键控制游戏(左、右移、下移、翻转); 3.游戏规则和平时玩的俄罗斯方块一样&a…

点估计参数估计

点估计(Point Estimation)是一种统计推断的方法,用于通过样本统计量来估计总体参数。在概率论和数理统计中,点估计是将总体的未知参数估计为某个确定的值或在某个确定的点上,因此也被称为定值估计。 定义: …

ESP32连接xbox手柄

本文简单介绍一下如何使用ESP32连接xbox的蓝牙手柄,使之变成一个相对通用的遥控器。 硬件平台 XBOX ONE S手柄蓝牙版 EPS32-DOWN-V3,需要注意Xbox One S手柄使用经典蓝牙,ESP32有较多型号仅支持BLE,需要选一个支持经典蓝牙BLE的…

AXI Quad SPI IP核中命令的使用

1 双通道SPI和混合内存模式下支持的常用命令 对于配置中Mode设置为Dual且Slave Device设置为Mixed的情况,IP核支持表3-1中列出的命令。这些命令在Winbond、Micron和Spansion内存设备上具有相同的命令、地址和数据行为。 某些命令,如fast read、dual I/…

从年金理论到杠杆效应,再到财务报表与投资评估指标

一、解释普通年金终值和普通年金现值的概念。 普通年金终值:以利率为1%,每期收款100元,5期为例,普通年金终值的折算过程如图: 普通年金现值:以利率为1%,每期收款100元,5期为例&am…

【RabbitMQ】RabbitMQ配置与交换机学习

【RabbitMQ】RabbitMQ配置与交换机学习 文章目录 【RabbitMQ】RabbitMQ配置与交换机学习简介安装和部署1. 安装RabbitMQ2.创建virtual-host3. 添加依赖4.修改配置文件 WorkQueues模型1.编写消息发送测试类2.编写消息接收(监听)类3. 实现能者多劳 交换机F…

(C++)string模拟实现

string底层是一个是字符数组 为了跟库里的string区别,所以定义一个命名空间将类string包含 一、构造 1.构造函数 注意:将char*传给const char*是范围缩小,因此只能1:1构造一个 strlen遇到nullptr解引用会报错,因此…