学习笔记: Mach-O 文件
“结构决定性质,性质决定用途”。如果不了解结构,是很难真正理解的。
通过一个示例的可执行文件了解Mach-O文件的结构
Mach-O基本结构
- Header: :文件类型、目标架构类型等
- Load Commands:描述文件在虚拟内存中的逻辑结构、布局
- Data: 在Load commands中定义的Segment的数据
Header
Header的结构定义在loader.h
/** The 64-bit mach header appears at the very beginning of object files for* 64-bit architectures.*/
struct mach_header_64 {// 魔数:64位的mach-o有两个取值// #define MH_MAGIC_64 0xfeedfacf -- 小端:Intel// #define MH_CIGAM_64 0xcffaedfe -- 大端:以前macOS在PowerPC安装uint32_t magic; /* mach magic number identifier */// cpu类型// 在machine.h中定义// 例子中的显示的cpu的Value是:CPU_TYPE_ARM,根据下面的定义 0x0000000C | 0x01000000 = 0x0100000C// #define CPU_ARCH_ABI64 0x01000000 /* 64 bit ABI */// #define CPU_TYPE_ARM ((cpu_type_t) 12)// #define CPU_TYPE_ARM64 (CPU_TYPE_ARM | CPU_ARCH_ABI64)int32_t cputype; /* cpu specifier *//** ARM64 subtypes* ARM64的具体类型* 例子中的显示的值是0,即CPU_SUBTYPE_ARM64_ALL*/// #define CPU_SUBTYPE_ARM64_ALL ((cpu_subtype_t) 0)// #define CPU_SUBTYPE_ARM64_V8 ((cpu_subtype_t) 1)// #define CPU_SUBTYPE_ARM64E ((cpu_subtype_t) 2)int32_t cpusubtype; /* machine specifier */// 文件类型/*** #define MH_OBJECT 0x1 -- .o文件,.a是.o的合集* #define MH_EXECUTE 0x2 -- 可执行文件* #define MH_DYLIB 0x6 -- 动态库* #define MH_DYLINKER 0x7 -- dyld链接器* #define MH_DSYM 0xa -- 符号表文件*/// 例子中的是2,即MH_EXECUTE,可执行文件uint32_t filetype; /* type of file */// Load Commands加载命令的条数// 例子中是23条uint32_t ncmds; /* number of load commands */// Load Commands部分的长度// 例子中是2864byteuint32_t sizeofcmds; /* the size of all the load commands */// mach-o的标志,通过位移枚举定义// 例子中的/*** #define MH_NOUNDEFS 0x1 -- 没有未定义的引用* #define MH_DYLDLINK 0x4 -- 已经静态链接过了,可以动态链接* #define MH_TWOLEVEL 0x8 -- 链接时:库名 + 函数减少同名冲突 见参考一* #define MH_PIE 0x200000 -- 每次加载主程序在一个随机地址,增加安全*/uint32_t flags; /* flags */// 保留uint32_t reserved; /* reserved */
};
Load Commands
每个Load Commands都有对应的结构体
LC_SEGMENT_64
/** The 64-bit segment load command indicates that a part of this file is to be* mapped into a 64-bit task's address space. If the 64-bit segment has* sections then section_64 structures directly follow the 64-bit segment* command and their size is reflected in cmdsize.*/
struct segment_command_64 { /* for 64-bit architectures */uint32_t cmd; /* LC_SEGMENT_64 */uint32_t cmdsize; /* includes sizeof section_64 structs */char segname[16]; /* segment name */uint64_t vmaddr; /* memory address of this segment */uint64_t vmsize; /* memory size of this segment */uint64_t fileoff; /* file offset of this segment */uint64_t filesize; /* amount to map from the file */int32_t maxprot; /* maximum VM protection */int32_t initprot; /* initial VM protection */uint32_t nsects; /* number of sections in segment */uint32_t flags; /* flags */
};
使用segment_command_64结构体的segment
Segment: __PAGEZERO
__PAGEZERO
用于捕捉NULL指针引用
#define LC_SEGMENT_64 0x19 // 即64位的segment// vm_prot.h
typedef int vm_prot_t;#define VM_PROT_NONE ((vm_prot_t) 0x00)// 读/写/执行
#define VM_PROT_READ ((vm_prot_t) 0x01) /* read permission */
#define VM_PROT_WRITE ((vm_prot_t) 0x02) /* write permission */
#define VM_PROT_EXECUTE ((vm_prot_t) 0x04) /* execute permission */
...
变量名 | 值 | 说明 |
---|---|---|
cmd | 0x19 | segment的类型 |
cmdsize | 0x48 | segment的长度, 这里是0x48 = 0x000000068 - 0x00000020 |
segname | 0x5F5F504147455A45524F000000000000 | segment的名,这里是__PAGEZERO, ASCII表示:5F = ‘_’,50 = ‘P’,41 = ‘A’…,4F = ‘O’ |
vmaddr | 0 | segment在虚拟内存的起始地址,8个字节uint64_t |
vmsize | 0x0000000100000000 | segment的长度,2^32 = 4GB,即64位的虚拟内存的前4G都是__PAGEZERO |
fileoff | 0 | 文件的偏移量,从磁盘的角度看 |
filesize | 0 | 占用文件的大小,这是磁盘的角度看,实际未占用磁盘大小 |
maxprot | 0 | 虚拟内存的最高的权限设置,未设置,即不能读,不能写,也不能被加载到cpu中执行 |
initprot | 0 | 初始化时的虚拟内存的权限设置,未设置 |
nsects | 0 | segment中包含的section的数量,这里为0个 |
flags | 0 | 标志,没有 |
Segment: __TEXT 代码
__TEXT
用于描述代码segment的一些信息
也是segment_command_64结构体,可以看到这个segment中的initprot中是有VM_PROT_EXECUTE,声明这部分是可以被执行的。segment中9个sections
Section: __text
每个section的结构体如下
struct section_64 { /* for 64-bit architectures */char sectname[16]; /* name of this section */char segname[16]; /* segment this section goes in */uint64_t addr; /* memory address of this section */uint64_t size; /* size in bytes of this section */uint32_t offset; /* file offset of this section */uint32_t align; /* section alignment (power of 2) */uint32_t reloff; /* file offset of relocation entries */uint32_t nreloc; /* number of relocation entries */uint32_t flags; /* flags (section type and attributes)*/uint32_t reserved1; /* reserved (for offset or index) */uint32_t reserved2; /* reserved (for count or sizeof) */uint32_t reserved3; /* reserved */
};
#define S_REGULAR 0x0 /* regular section */
#define S_ATTR_PURE_INSTRUCTIONS 0x80000000 // 这个sections只包含机器指令
#define S_ATTR_SOME_INSTRUCTIONS 0x00000400 /* section contains somemachine instructions */
变量名 | 值 | 说明 |
---|---|---|
sectname | 0x5F5F7465787400000000000000000000 | section的名称,__text |
segname | 0x5F5F5445585400000000000000000000 | section所属segment的名称,__TEXT |
addr | 0x0000000100005F04 | 虚拟内存的起始地址 |
size | 0x0000000000000564 | section的长度 |
offset | 0x5F04 | 代码在文件的具体偏移量,每个应用都不一样 |
align | 4 | 对齐 |
reloff | 0 | 静态链接重定位,.a文件中__objc_const能看到 |
nreloc | 0 | 静态链接重定位的符号的数量 |
flags | 0x80000400 | 标志,详见loader.h |
reserved1 | 保留,动态链接时的符号 | |
reserved2 | 保留,动态链接时的符号数量 | |
reserved3 | 保留 |
然后因为__PAGEZERO
占用了0x0000000100000000
加上前面文件占用了空间,所以应用的汇编代码的起始位置在0x5F04
位置,从上面的截图看确实如此
Section: __stubs
动态链接的符号,看reserved2有12个,这部分在二进制中的地址是0x0000000100006468
到0x0000000100006468
查看
这里存放的是运行时需要从系统和其他动态库中加载的符号
Section: __stub_helper
加载动态库有rebinding符号的过程,比如上面__stub
的需要12个外部的符号,__stub_helper
是辅助该过程能顺利完成
Section: __objc_stubs
__objc_stubs is a section in iOS binaries that contains stub functions for Objective-C calls. These stubs are used for debugging and analyzing Objective-C code
iOS Apps compiled with recent versions of XCode can generate stubs for msgSend calls, where each stub is just a call to the actual msgSend address after setting a specific selector:
应该是个高版本SDK跳过消息查找过程,加快方法调用的优化,后面再探究。
Section: __objc_methods
OC方法的信息
#define S_CSTRING_LITERALS 0x2 /* section with only literal C strings*/ // sections里只有C语言的常量字符串
Section:__objc_classname
OC的类名相关的描述,和__objc_methods
差不多
Section:__objc_methtype
OC的方法签名部分的描述
找到Data部分实际存的内容
Section: __cstring
C的常量字符串的描述
Section: __unwind_info
用于存储处理异常情况的信息
Segment: __DATA 数据
对数据部分的组织规则的描述,这部分也有一些sections
Section: __got
非懒加载指针,dyld 加载时会立即绑定表项中的符号
dyld_stub_binder 负责绑定符号,objc_msgSend消息发送,这两个懒加载没有意义
Seciton: __la_symbol_ptr
相对的是懒加载指针,表中的指针一开始都指向 __TEXT.__stub_helper
Section: __cfstring
Core Foundation 字符串
Section: __objc_classlist
记录了App中所有的class,包括meta class。该节中存储的是一个个的指针,指针指向的地址是class结构体所在的地址
这里Address是0x100008090
,去掉前面的0x100000000
(__PAGEZERO),找0x8090
的地址
里面的值是0x00000001000091A0
,描述是指针,再去找0x91A0
,走到__DATA.__objc_data
,这里存着实际的OC的类
Section: __objc_protolist
0x1000080A8 => 0x0000000100009298,到了 __DATA.__data
?
Section: __objc_imageInfo
主要用来区分OC的版本是 1.0 还是 2.0
Section: __objc_const
记录在OC内存初始化过程中的不可变内容,比如 method_t 结构体定义
Section: __objc_selrefs
标记哪些SEL对应的字符串被引用了
Section: __objc_classrefs
标记哪些类被引用了
Section: __objc_superrefs
Objective-C 超类引用
Section: __objc_ivar
存储程序中的 ivar 变量
Section: __objc_data
用于保存 OC 类需要的数据。最主要的内容是映射 __objc_const 地址,用于找到类的相关数据
Section: __data
初始化过的可变数据
Segment: __LINKEDIT
fileOffset是 0xc000,size是0x7850,两者相加得 0x13850,从下图可知Dynamic Loader Info 到Code Signature都是这个区间内,里面包含动态库加载哪些符号,符号表,二进制的签名信息。所以可执行文件的加载指令后的实际内容就是__TEXT,__DATA,__LINKEDIT,__PAGEZERO是占位
# 用size命令显示macho文件时就是4个段
$ size -x -m path/to/macho-execute
使用其他结构体的Command
Command:LC_DYLD_INFO_ONLY
描述dyld要绑定动态库的哪些符号,是强绑定还是弱绑定
/** The dyld_info_command contains the file offsets and sizes of * the new compressed form of the information dyld needs to * load the image. This information is used by dyld on Mac OS X* 10.6 and later. All information pointed to by this command* is encoded using byte streams, so no endian swapping is needed* to interpret it. */
struct dyld_info_command {uint32_t cmd; /* LC_DYLD_INFO or LC_DYLD_INFO_ONLY */uint32_t cmdsize; /* sizeof(struct dyld_info_command) */uint32_t rebase_off; /* file offset to rebase info */uint32_t rebase_size; /* size of rebase info */uint32_t bind_off; /* file offset to binding info */uint32_t bind_size; /* size of binding info */uint32_t weak_bind_off;uint32_t weak_bind_size; /* size of weak binding info */uint32_t lazy_bind_off;uint32_t lazy_bind_size; /* size of lazy binding infs */uint32_t export_off; /* file offset to lazy binding info */uint32_t export_size; /* size of lazy binding infs */
};
Command: LC_SYMTAB
macho文件的符号表的描述
/** The symtab_command contains the offsets and sizes of the link-edit 4.3BSD* "stab" style symbol table information as described in the header files* <nlist.h> and <stab.h>.*/
struct symtab_command {uint32_t cmd; /* LC_SYMTAB */uint32_t cmdsize; /* sizeof(struct symtab_command) */uint32_t symoff; /* symbol table offset */uint32_t nsyms; /* number of symbol table entries */uint32_t stroff; /* string table offset */uint32_t strsize; /* string table size in bytes */
};
Command: LC_DYSYMTAB
macho文件依赖的动态库的符号表
Command: LC_LOAD_DYLINKER
加载dyld链接器
/** A program that uses a dynamic linker contains a dylinker_command to identify* the name of the dynamic linker (LC_LOAD_DYLINKER). And a dynamic linker* contains a dylinker_command to identify the dynamic linker (LC_ID_DYLINKER).* A file can have at most one of these.* This struct is also used for the LC_DYLD_ENVIRONMENT load command and* contains string for dyld to treat like environment variable.*/
struct dylinker_command {uint32_t cmd; /* LC_ID_DYLINKER, LC_LOAD_DYLINKER orLC_DYLD_ENVIRONMENT */uint32_t cmdsize; /* includes pathname string */union lc_str name; /* dynamic linker's path name */
};
Command: LC_UUID
静态连接器生成的128位随机数,用于标识macho文件
/** The uuid load command contains a single 128-bit unique random number that* identifies an object produced by the static link editor.*/
struct uuid_command {uint32_t cmd; /* LC_UUID */uint32_t cmdsize; /* sizeof(struct uuid_command) */uint8_t uuid[16]; /* the 128-bit uuid */
};
Command: LC_VERSION_MIN_IPHONEOS
指定最低版本号
/** The version_min_command contains the min OS version on which this * binary was built to run.*/
struct version_min_command {uint32_t cmd; /* LC_VERSION_MIN_MACOSX orLC_VERSION_MIN_IPHONEOS orLC_VERSION_MIN_WATCHOS orLC_VERSION_MIN_TVOS */uint32_t cmdsize; /* sizeof(struct min_version_command) */uint32_t version; /* X.Y.Z is encoded in nibbles xxxx.yy.zz */uint32_t sdk; /* X.Y.Z is encoded in nibbles xxxx.yy.zz */
};
Command: LC_SOURCE_VERSION
指定iOS SDK系统库的版本
/** The source_version_command is an optional load command containing* the version of the sources used to build the binary.*/
struct source_version_command {uint32_t cmd; /* LC_SOURCE_VERSION */uint32_t cmdsize; /* 16 */uint64_t version; /* A.B.C.D.E packed as a24.b10.c10.d10.e10 */
};
Command: LC_MAIN
应用程序入口
/** The entry_point_command is a replacement for thread_command.* It is used for main executables to specify the location (file offset)* of main(). If -stack_size was used at link time, the stacksize* field will contain the stack size need for the main thread.*/
struct entry_point_command {uint32_t cmd; /* LC_MAIN only used in MH_EXECUTE filetypes */uint32_t cmdsize; /* 24 */uint64_t entryoff; /* file (__TEXT) offset of main() */uint64_t stacksize;/* if not zero, initial stack size */
};
地址是 0x6120,找到对应地址可知就是 _main
函数的地址
Command: LC_ENCRYPTION_INFO_64
/** The encryption_info_command contains the file offset and size of an* of an encrypted segment.*/
struct encryption_info_command {uint32_t cmd; /* LC_ENCRYPTION_INFO */uint32_t cmdsize; /* sizeof(struct encryption_info_command) */uint32_t cryptoff; /* file offset of encrypted range */uint32_t cryptsize; /* file size of encrypted range */uint32_t cryptid; /* which enryption system,0 means not-encrypted yet */
};
加密部分是Crypt Offset:0x4000 , Crypt Size: 0x4000,两者相加末尾地址为0x8000,根据下图看,实际加密的部分是代码Segment的内容
Command: LC_LOAD_DYLIB
有若干个该命令,用于加载系统及应用链接的动态库
/** Dynamicly linked shared libraries are identified by two things. The* pathname (the name of the library as found for execution), and the* compatibility version number. The pathname must match and the compatibility* number in the user of the library must be greater than or equal to the* library being used. The time stamp is used to record the time a library was* built and copied into user so it can be use to determined if the library used* at runtime is exactly the same as used to built the program.*/
struct dylib {union lc_str name; /* library's path name */uint32_t timestamp; /* library's build time stamp */uint32_t current_version; /* library's current version number */uint32_t compatibility_version; /* library's compatibility vers number*/
};/** A dynamically linked shared library (filetype == MH_DYLIB in the mach header)* contains a dylib_command (cmd == LC_ID_DYLIB) to identify the library.* An object that uses a dynamically linked shared library also contains a* dylib_command (cmd == LC_LOAD_DYLIB, LC_LOAD_WEAK_DYLIB, or* LC_REEXPORT_DYLIB) for each library it uses.*/
struct dylib_command {uint32_t cmd; /* LC_ID_DYLIB, LC_LOAD_{,WEAK_}DYLIB,LC_REEXPORT_DYLIB */uint32_t cmdsize; /* includes pathname string */struct dylib dylib; /* the library identification */
};
name字段指明加载路径
Command: LC_RPATH
前面动态库name里有@rpath变量的描述,@rpath的值在这里指定
Command: LC_FUNCTION_STARTS
该命令用于描述函数的起始地址信息,指向了链接信息段中 Function Starts 的首地址 Function Starts 定义了一个函数起始地址表,调试器和其他程序通过该表可以很容易地判断出一个地址是否在函数内
Command: LC_DATA_IN_CODE
该命令使用一个 struct linkedit_data_command 指向一个 data_in_code_entry 数组 data_in_code_entry 数组中的每一个元素,用于描述代码段中一个存储数据的区域
Command: LC_CODE_SIGATURE
签名信息的描述,从这里可知,二进制文件的签名是在文件内
Data
Load Commands部分是在描述MachO文件如何组织。比如代码部分的长度是多少,这种很像C语言操作数组时要传长度。如果再扩展一下概念,网络协议通过各种包的格式控制数据的传输,那前面这些命令也是在控制如何解析后面的Data。
参考
- MacOS 链接特性:Two-Level Namespace
- ghidra-issues
- MachO文件学习笔记
相关文章:
学习笔记: Mach-O 文件
“结构决定性质,性质决定用途”。如果不了解结构,是很难真正理解的。 通过一个示例的可执行文件了解Mach-O文件的结构 Mach-O基本结构 Header: :文件类型、目标架构类型等Load Commands:描述文件在虚拟内存中的逻辑结构、布局Data: 在Load commands中…...
基于GRPO将QWEN训练为和deepseek一样的推理模型!
GRPO 群体相对策略优化(GRPO)算法最初由deepseek团队提出,是近端策略优化(PPO)的一个变体。 GRPO 是一种在线学习算法,它通过使用训练过程中已训练模型自身生成的数据进行迭代改进。GRPO 目标背后的逻辑是在确保模型与参考策略保…...
STM32 外部中断EXTI
目录 外部中断基础知识 STM32外部中断框架 STM32外部中断机制框架 复用功能 重映射 中断嵌套控制器NVIC 外部中断按键控制LED灯 外部中断基础知识 STM32外部中断框架 中断的概念:在主程序运行过程中,出现了特点的中断触发条件,使得…...
Codex CLI - 自然语言命令行界面
本文翻译整理自:https://github.com/microsoft/Codex-CLI 文章目录 一、关于 Codex CLI相关链接资源 二、安装系统要求安装步骤 三、基本使用1、基础操作2、多轮模式 四、命令参考五、提示工程与上下文文件自定义上下文 六、故障排查七、FAQ如何查询可用OpenAI引擎&…...
健身会员管理系统(ssh+jsp+mysql8.x)含运行文档
健身会员管理系统(sshjspmysql8.x) 对健身房的健身器材、会员、教练、办卡、会员健身情况进行管理,可根据会员号或器材进行搜索,查看会员健身情况或器材使用情况。...
数据结构——快排和归并排序(非递归)
快速排序和归并排序一般都是用递归来实现的,但是掌握非递归也是很重要的,说不定在面试的时候面试官突然问你快排或者归并非递归实现,递归有时候并不好,在数据量非常大的时候效率就不好,但是使用非递归结果就不一样了&a…...
Trae,字节跳动推出的 AI 编程助手插件
Trae 插件是 Trae 旗下全新一代的人工智能编程助手(前身为 MarsCode 编程助手),以插件形式集成在本地开发环境中,具备极高的兼容性和灵活性,旨在提升开发效率和代码质量。它支持超过100种编程语言,兼容主流…...
Qt项目——Tcp网络调试助手服务端与客户端
目录 前言结果预览工程文件源代码一、开发流程二、Tcp协议三、Socket四、Tcp服务器的关键流程五、Tcp客户端的关键流程六、Tcp服务端核心代码七、客户端核心代码总结 前言 这期要运用到计算机网络的知识,要搞清楚Tcp协议,学习QTcpServer ,学…...
2021-11-10 C++蜗牛爬井进3退1求天数
缘由C大一编程题目。-编程语言-CSDN问答 int n 0, t 0;cin >> n;while ((n - 3)>0)n, t;cout << t << endl;...
玛哈特整平机:工业制造中的关键设备
在现代工业制造中,平整度是衡量材料加工质量的核心指标之一。无论是金属板材、塑料片材还是复合材料,若存在弯曲、翘曲或波浪形缺陷,将直接影响后续加工效率和成品质量。整平机(又称校平机、矫平机)作为解决这一问题的…...
LINUX419 更换仓库(没换成)find命令
NAT模式下虚拟机需与网卡处在同一个网段中吗 和VM1同个网段 会不会影响 这个很重要 是2 改成点2 倒是Ping通了 为啥ping百度 ping到别的地方 4399 倒是ping通了 准备下载httpd包 下不下来 正在替换为新版本仓库 报错 failure: repodata/repomd.xml from local: [Er…...
C# 预定义类型全解析
在 C# 编程中,预定义类型是基础且重要的概念。下面我们来详细了解 C# 的预定义类型。 预定义类型概述 C# 提供了 16 种预定义类型,包含 13 种简单类型和 3 种非简单类型。所有预定义类型的名称都由全小写字母组成。 预定义简单类型 预定义简单类型表…...
【仓颉 + 鸿蒙 + AI Agent】CangjieMagic框架(16):ReactExecutor
CangjieMagic框架:使用华为仓颉编程语言编写,专门用于开发AI Agent,支持鸿蒙、Windows、macOS、Linux等系统。 这篇文章剖析一下 CangjieMagic 框架中的 ReactExecutor。 这个执行器名字中的"React"代表"Reasoning and Acti…...
13.第二阶段x64游戏实战-分析人物等级和升级经验
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:12.第二阶段x64游戏实战-远程调试 效果图: 如下图红框,…...
Linux疑难杂惑 | 云服务器重装系统后vscode无法远程连接的问题
报错原因:本地的known_hosts文件记录服务器信息与现服务器的信息冲突了,导致连接失败。 解决方法:找到本地的known_hosts文件,把里面的所有东西删除后保存就好了。 该文件的路径可以在报错中寻找:比如我的路径就是&a…...
使用EXCEL绘制平滑曲线
播主播主,你都多少天没更新了!!!泥在干什么?你还做这个账号麻?!!! 做的做的(哭唧唧),就是最近有些忙,以及…… 前言&…...
你的电脑在开“外卖平台”?——作业管理全解析
你的电脑在开“外卖平台”?——作业管理全解析 操作系统系列文章导航(点击跳转) 程序员必看:揭开操作系统的神秘面纱 :从进程、内存到设备管理,全面解析操作系统的核心机制与日常应用。告别电脑卡顿&#x…...
平均池化(Average Pooling)
1. 定义与作用 平均池化是一种下采样操作,通过对输入区域的数值取平均值来压缩数据空间维度。其核心作用包括: 降低计算量:减少特征图尺寸,提升模型效率。保留整体特征:平滑局部…...
JavaScript中的Event事件对象详解
一、事件对象(Event)概述 1. 事件对象的定义 event 对象是浏览器自动生成的对象,当用户与页面进行交互时(如点击、键盘输入、鼠标移动等),事件触发时就会自动传递给事件处理函数。event 对象包含了与事件…...
OSPF综合实验(HCIP)
1,R5为ISP,其上只能配置Ip地址;R4作为企业边界路由器, 出口公网地址需要通过ppp协议获取,并进行chap认证 2,整个OSPF环境IP基于172.16.0.0/16划分; 3,所有设备均可访问R5的环回&…...
Unreal 从入门到精通之如何接入MQTT
文章目录 前言MQTT 核心特性MQTT 在 UE5 中的应用场景在 UE5 中集成 MQTTMqtt Client 的APIMqtt Client 使用示例最后前言 MQTT(Message Queuing Telemetry Transport)是一种专为物联网(IoT)和低带宽、高延迟网络环境设计的轻量级消息传输协议。它采用发布/订阅(Pub/Sub)…...
数据结构实验6.2:稀疏矩阵的基本运算
文章目录 一,实验目的二,问题描述三,基本要求四、算法分析(一)稀疏矩阵三元组表示法存储结构(二)插入算法(三)创建算法(四)输出算法(五…...
BDO分厂积极开展“五个一”安全活动
BDO分厂为规范化学习“五个一”活动主题,按照“上下联动、分头准备 、差异管理、资源共享”的原则,全面激活班组安全活动管理新模式,正在积极开展班组安全活动,以单元班组形式对每个班组每周组织一次“五个一”安全活动。 丁二醇单…...
那就聊一聊mysql的锁
MySQL 的锁机制是数据库并发控制的核心,作为 Java 架构师需要深入理解其实现原理和适用场景。以下是 MySQL 锁机制的详细解析: 一、锁的分类维度 1. 按锁粒度划分 锁粒度特点适用场景全局锁锁定整个数据库(FLUSH TABLES WITH READ LOC…...
Python番外——常用的包功能讲解和分类组合
目录 1. Web开发框架与工具 2. 数据处理与分析 3. 网络请求与爬虫 4. 异步编程 5. 数据库操作 6. 图像与多媒体处理 7. 语言模型与NLP 8. 安全与加密 9. 配置与工具 10. 其他工具库 11.典型组合场景 此章节主要是记录我所使用的包,以及模块。方便供自己方…...
【mongodb】数据库操作
目录 1. 查看所有数据库2. 切换到指定数据库(若数据库不存在,则创建)3. 查看当前使用的数据库4. 删除当前数据库5.默认数据库 1. 查看所有数据库 1.show dbs2.show databases 2. 切换到指定数据库(若数据库不存在,则…...
四月下旬系列
CUHKSZ 校赛 期中考试 DAY -1。 省流:前 1h 切 6 题,后 3h 过 1 题,读错一个本来很【】的题,被大模拟构造创【】了。 本地除了 VSCode 没有 Extensions,别的和省选差不多。使用 DEVC。 前 6 题难度 < 绿&#x…...
计算机网络 3-4 数据链路层(局域网)
4.1 局域网LAN 特点 1.覆盖较小的地理范围 2.较低的时延和误码率 3.局域网内的各节点之间 4.支持单播、广播、多播 分类 关注三要素 (出题点) ①拓扑结构 ②传输介质 ③介质访问控制方式 硬件架构 4.2 以太网 4.2.1 层次划分 4.2.2 物理层标准…...
WebSocket介绍
在网页聊天项目中,为了实现消息的发送和及时接收,我们使用了WebSocket,接下来就简单介绍一下这个WebSocket。 了解消息的转发逻辑 当两个不同客户端在不同的局域网中互相发送消息时,假如这两个客户端分别是a和b,因为…...
rpcrt4!COMMON_AddressManager函数分析之和全局变量rpcrt4!AddressList的关系
第一部分: 1: kd> x rpcrt4!addresslist 77c839dc RPCRT4!AddressList 0x00000000 1: kd> g Breakpoint 2 hit RPCRT4!OSF_ADDRESS::CompleteListen: 001b:77c0c973 55 push ebp 1: kd> g Breakpoint 11 hit RPCRT4!COMMON_Addr…...
Java Web 之 Tomcat 100问
Tomcat 是什么? Tomcat 是一个开源的 Java Servlet 容器和 Web 容器。 Tomcat 的主要功能有哪些? 三大主要功能: 运行 Java Web 应用。处理 HTTP 请求。管理 Web 应用。 如何安装 Tomcat ? 下载 Tomcat 安装包(A…...
ESB —— 企业集成架构的基石:功能、架构与应用全解析
企业服务总线(Enterprise Service Bus,ESB)是一种重要的企业级集成架构,以下为你详细介绍: 一、概念与定义 ESB 是一种基于面向服务架构(SOA)的中间件技术,它充当了企业内部不同应…...
wordpress SMTP配置qq邮箱发送邮件,新版QQ邮箱授权码获取方法
新版的QQ邮箱界面不同了,以下是新版的设置方法: 1. 进入邮箱后,点右上角的设置图标: 2. 左下角的菜单里,选择“账号与安全” : 3. 然后如下图,开启SMTP 服务: 4. 按提示验证短信&am…...
【操作系统原理04】进程同步
文章目录 大纲一.进程同步与进程互斥0.大纲1.同步2.互斥 二.进程互斥的软件实现方法0.大纲1.单标志法2.双标志先检查法3.双标志后检查法4.Peterson算法 三.进程互斥的硬件实现方法0.大纲1.中断屏蔽方法2.TestAndSet指令3.Swap指令 四.互斥锁五.信号量机制0.大纲1.概念2.整形信号…...
Java ThreadPoolExecutor 深度解析:从原理到实战
在 Java 的多线程编程领域,ThreadPoolExecutor是一个至关重要的工具类,它为开发者提供了强大且灵活的线程池管理能力。合理使用ThreadPoolExecutor,不仅能够提升应用程序的性能和响应速度,还能有效控制资源消耗,避免因…...
MCP 协议——AI 世界的“USB-C 接口”:解锁智能协作的新时代
在过去十年中,科技的进步已经改变了我们日常生活的方方面面。从智能手机的普及到物联网的快速发展,人们的生活被各种创新的技术重新定义。今天,我们即将迎来另一个里程碑式的转折点——MCP 协议的推出,它将为人工智能世界的协作与…...
知识就是力量——一些硬件的使用方式
硬件平台 正点原子ATK-MD0430 V2.0(4.3寸TFT LCD电容触摸屏/使用cc2530控制)1.硬件连接2. 软件驱动实现3. 优化与注意事项4. 示例工程参考5. 常见问题 正点原子ATK-MD0430 V2.0(4.3寸TFT LCD电容触摸屏/使用cc2530控制) 1.硬件连…...
机器学习(1)— 开发环境安装
机器学习(1)— 准备开发环境 一、前言 二、Ubuntu开发环境安装 1、NumPy安装 使用如下命令安装: sudo apt-get install python3-numpy2、PyTorch 安装 由于我电脑暂时没有英伟达显卡,暂时安装CPU版: pip3 insta…...
深入实战:使用C++开发高性能RESTful API
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
C++之虚函数 Virtual Function
1. 普通虚函数(Virtual Function) 定义:基类中用 virtual 声明,允许派生类 覆盖(Override)。特点: 基类可提供默认实现。派生类可选择性覆盖(若不覆盖,则调用基类版本&a…...
【java实现+4种变体完整例子】排序算法中【选择排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
以下是选择排序的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格: 一、选择排序基础实现 原理 每一轮遍历未排序部分,找到最小元素并交换到当前起始位置,逐步构建已排序序列。 代码示例 pu…...
DNS主从同步实验
dns域名解析原理 实验步骤1、主dns要完成dns解析:192.168.21.128 [rootlocalhost ~]# yum install bind -y [rootlocalhost ~]# systemctl start named [rootlocalhost ~]# vim /etc/named.conf options { listen-on port 53 { any; }; direct…...
UIjavaScritIU
1、直接执行js脚本:document.documentElement.scrollTop1000 document.getElementById(“su”).click() 弊端: js自己带的元素定位方法不如selenium的丰富 不支持xpath css 等 定位元素操作不是很灵活。 需要借助js脚本传入 -selenium定位 js 负责执行动…...
Manus技术架构、实现内幕及分布式智能体项目实战 线上高级实训班
Manus技术架构、实现内幕及分布式智能体项目实战 线上高级实训班 模块一:解密Manus分布式多智能体工作原理和架构内幕 基于Claude和Qwen的大模型智能体Manus为何能够迅速成为全球讨论热度最高、使用体验最好、产业界最火爆的大模型智能体产品? Ma…...
Java——二维数组
一、概念 二维数组也是一种容器,不同于一维数组,该容器存储的都是一维数组容器。 二、定义格式 1.数据类型[ ] [ ] 变量名; 2.数据类型 变量名 [ ] [ ]; 3.数据类型 [ ] 变量名 [ ]; 三、动态初始化 (一)书写 1.格式 数据…...
豆瓣图书数据采集与可视化分析(一)- 豆瓣图书数据爬取
文章目录 前言一、数据爬取步骤二、豆瓣图书页面分析1. 图书分类标签页面分析2. 图书页面分析 三、数据采集实现1. 图书分类标签数据采集2. 图书数据采集3. 把多个分类的CSV数据文件整合到一个CSV文件中 前言 在当今大数据时代,数据的获取与整理对于各个领域的研…...
车载诊断新架构--- SOVD初入门(上)
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...
test——自动化测试
目录 一概念 1自动化 2回归测试 3自动化分类 3.1接口自动化 3.2UI自动化 4自动化测试金字塔 5web自动化测试 6工作原理 二函数 1元素定位 1.1cssSelector 编辑1.2xpath 语法 2操作对象 2.1click() 2.2send_keys() 2.3clear() 2.4text 2.5get_attribu…...
Kubernetes相关的名词解释CoreDNS插件(2)
为什么需要DNS服务? service发现是k8s中的一个重要机制,其基本功能为:在集群内通过服务名对服务进行访问,即需要完成从服务名到ClusterIP的解析。 k8s主要有两种service发现机制:环境变量和DNS。没有DNS服务的时候&am…...
【记录】服务器用命令开启端口号
这里记录下如何在服务器上开启适用于外界访问的端口号。 方法 1 使用防火墙 1 su ,命令 输入密码 切换到root节点 2 开启防火墙 systemctl start firewalld3 配置开放端口 firewall-cmd --zonepublic --add-port8282/tcp --permanent4 重启防火墙 firewall-cmd…...