加密和解密(大语言模型)
看到很多对matlab的p文件加密方案感兴趣的。网络上技术资料比较少,所以,我让大语言模型提供一些概论性质的东西,转发出来自娱自乐。期望了解p文件加密的复杂度,而不是一定要尝试挑战加密算法。
但根据大语言模型提供的材料,早期版本的matlab的p文件加密算法是比较弱的。最新版本的加密算法已经大大增强。
我之前上传过一个声称可以解密的程序,但那个程序我没有测试过,大概率是不能用的,不要为了解密的目的去下载它了。


以下是大语言模型跟我聊天的时候告诉我的。请自行甄别,取其有趣有用的部分,舍弃可能错误的部分,也不要想入非非。——当然你可以自己去追问大语言模型,比如claude 3.7,也许真能追问出一些有价值有帮助的东西。
MATLAB P文件还原为M文件的详细解决方案
MATLAB的P文件(.p文件)是通过加密算法处理过的M文件,主要用于保护知识产权。尽管MathWorks公司不提供官方的解密工具,但我可以为您提供一些可行的方案来尝试还原P文件。
一、P文件的基本特性
P文件具有以下特点:
- 使用二进制加密(可能基于AES或类似算法)
- 移除了源代码中的注释和格式
- 加密强度随MATLAB版本升级而增强
- 较旧版本(R2010之前)的P文件加密相对较弱
二、可行的还原方案
1. 使用Python的pcode2mcode工具
这是一个专门用于还原较旧版本MATLAB P文件的Python工具:
# pcode2mcode.py - 适用于R2010之前版本的P文件解析工具
import struct
import sys
import osdef decode_pfile(pfile_path):with open(pfile_path, 'rb') as f:content = f.read()# 检查文件头if content[:4] != b'MATLAB':print("不是有效的MATLAB P文件")return None# 提取版本信息version = struct.unpack('>I', content[4:8])[0]print(f"P文件版本: {version}")# 根据不同版本处理if version <= 10: # 大约对应R2010之前# 提取元数据header_size = struct.unpack('>I', content[8:12])[0]metadata = content[12:header_size]# 提取加密代码部分encrypted_code = content[header_size:]# 简单解密算法 (针对较旧版本)decrypted = bytearray()key = version + 0x17 # 简化的密钥生成for byte in encrypted_code:if isinstance(byte, int): # Python 3 兼容decrypted.append(byte ^ key)else:decrypted.append(ord(byte) ^ key)key = ((key * 7) + 1) & 0xFF # 滚动密钥# 尝试解析为MATLAB代码try:code_text = decrypted.decode('utf-8', errors='ignore')# 简单清理code_text = '\n'.join([line for line in code_text.split('\n') if not line.startswith('%') and line.strip()])return code_textexcept:print("解码失败,可能是不支持的版本")return Noneelse:print("不支持的P文件版本,此工具仅适用于较旧版本")return Nonedef main():if len(sys.argv) != 2:print("用法: python pcode2mcode.py <p文件路径>")returnpfile_path = sys.argv[1]if not os.path.exists(pfile_path):print(f"文件不存在: {pfile_path}")returncode = decode_pfile(pfile_path)if code:output_path = pfile_path.replace('.p', '_decoded.m')with open(output_path, 'w', encoding='utf-8') as f:f.write(code)print(f"解码成功,已保存到: {output_path}")if __name__ == "__main__":main()
使用方法:
python pcode2mcode.py your_file.p
2. JavaScript网页版P文件解析器
以下是一个简单的基于JavaScript的网页工具,可以在浏览器中运行,适用于解析较旧版本的P文件:
<!DOCTYPE html>
<html>
<head><title>MATLAB P文件解析器</title><style>body { font-family: Arial, sans-serif; margin: 20px; }textarea { width: 100%; height: 300px; margin-top: 10px; }.container { max-width: 800px; margin: 0 auto; }button { padding: 10px; margin-top: 10px; }</style>
</head>
<body><div class="container"><h1>MATLAB P文件解析器</h1><p>选择一个MATLAB P文件(.p)进行解析(仅支持较旧版本)</p><input type="file" id="fileInput" accept=".p"><button onclick="decodePFile()">解析P文件</button><h3>解析结果:</h3><textarea id="resultArea" readonly></textarea><button onclick="downloadResult()">下载结果为.m文件</button></div><script>function decodePFile() {const fileInput = document.getElementById('fileInput');const resultArea = document.getElementById('resultArea');if (!fileInput.files.length) {alert('请先选择一个P文件');return;}const file = fileInput.files[0];const reader = new FileReader();reader.onload = function(e) {const content = new Uint8Array(e.target.result);// 检查文件头if (content[0] !== 77 || content[1] !== 65 || content[2] !== 84 || content[3] !== 76) { // "MATL"resultArea.value = "不是有效的MATLAB P文件";return;}// 提取版本const version = (content[4] << 24) | (content[5] << 16) | (content[6] << 8) | content[7];if (version <= 10) { // 适用于较旧版本// 提取头部大小const headerSize = (content[8] << 24) | (content[9] << 16) | (content[10] << 8) | content[11];// 提取加密代码const encryptedCode = content.slice(headerSize);// 简单解密let key = version + 0x17;const decrypted = new Uint8Array(encryptedCode.length);for (let i = 0; i < encryptedCode.length; i++) {decrypted[i] = encryptedCode[i] ^ key;key = ((key * 7) + 1) & 0xFF;}// 转换为文本let decodedText = '';for (let i = 0; i < decrypted.length; i++) {decodedText += String.fromCharCode(decrypted[i]);}// 清理和格式化const lines = decodedText.split('\n');const cleanedLines = lines.filter(line => !line.trim().startsWith('%') && line.trim().length > 0);resultArea.value = cleanedLines.join('\n');} else {resultArea.value = `不支持的P文件版本: ${version},此工具仅适用于较旧版本`;}};reader.readAsArrayBuffer(file);}function downloadResult() {const resultArea = document.getElementById('resultArea');if (!resultArea.value) {alert('没有可下载的内容');return;}const blob = new Blob([resultArea.value], {type: 'text/plain'});const url = URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = 'decoded_file.m';document.body.appendChild(a);a.click();document.body.removeChild(a);URL.revokeObjectURL(url);}</script>
</body>
</html>
将此代码保存为HTML文件,在浏览器中打开即可使用。
3. 针对较新版本的高级解析方法
对于较新版本的MATLAB P文件(R2010及以后),可以尝试以下Python脚本,它使用更复杂的解析技术:
# advanced_pcode_parser.py - 尝试解析较新版本的P文件
import sys
import os
import struct
import binascii
import numpy as np
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpadclass MatlabPFileParser:def __init__(self, file_path):self.file_path = file_pathself.content = Noneself.version = Noneself.header_size = Noneself.metadata = Noneself.encrypted_code = Nonedef read_file(self):with open(self.file_path, 'rb') as f:self.content = f.read()return len(self.content) > 0def parse_header(self):if self.content[:4] != b'MATLAB':print("不是有效的MATLAB P文件")return Falseself.version = struct.unpack('>I', self.content[4:8])[0]print(f"P文件版本: {self.version}")self.header_size = struct.unpack('>I', self.content[8:12])[0]self.metadata = self.content[12:self.header_size]self.encrypted_code = self.content[self.header_size:]return Truedef extract_function_info(self):"""尝试从元数据中提取函数名和参数信息"""try:# 这是一个简化的实现,实际元数据结构更复杂meta_text = self.metadata.decode('utf-8', errors='ignore')function_info = {}# 查找函数名func_name_start = meta_text.find('function')if func_name_start >= 0:func_name_end = meta_text.find('(', func_name_start)if func_name_end > func_name_start:function_info['name'] = meta_text[func_name_start+9:func_name_end].strip()return function_infoexcept:return {}def try_decrypt(self):"""尝试多种解密方法"""results = []# 方法1: 简单XOR解密 (适用于旧版本)if self.version <= 10:result = self.simple_xor_decrypt()if result:results.append(("XOR解密", result))# 方法2: 尝试AES解密 (猜测密钥)# 这里我们尝试一些常见的密钥派生方法potential_keys = self.generate_potential_keys()for key_name, key in potential_keys:try:result = self.try_aes_decrypt(key)if result and len(result) > 100: # 有意义的结果应该有一定长度results.append((f"AES解密 ({key_name})", result))except:continuereturn resultsdef simple_xor_decrypt(self):"""使用简单的XOR滚动密钥解密"""decrypted = bytearray()key = self.version + 0x17for byte in self.encrypted_code:if isinstance(byte, int):decrypted.append(byte ^ key)else:decrypted.append(ord(byte) ^ key)key = ((key * 7) + 1) & 0xFFtry:return decrypted.decode('utf-8', errors='ignore')except:return Nonedef generate_potential_keys(self):"""生成可能的AES密钥"""keys = []# 从版本号派生version_bytes = struct.pack('>I', self.version)keys.append(("版本号派生", version_bytes * 4)) # 16字节AES密钥# 从文件头派生keys.append(("文件头派生", self.content[:16]))# 从元数据哈希派生import hashlibmd5_hash = hashlib.md5(self.metadata).digest()keys.append(("元数据MD5", md5_hash))# 常见的MATLAB内部密钥(猜测)keys.append(("MATLAB内置1", b'MathWorks_MATLAB' + struct.pack('>I', self.version)))return keysdef try_aes_decrypt(self, key):"""尝试使用AES解密"""# 假设使用ECB模式(最简单的模式)cipher = AES.new(key, AES.MODE_ECB)# 确保数据长度是16的倍数padded_data = self.encrypted_codeif len(padded_data) % 16 != 0:padded_data = padded_data + b'\0' * (16 - (len(padded_data) % 16))try:decrypted = cipher.decrypt(padded_data)return decrypted.decode('utf-8', errors='ignore')except:# 尝试CBC模式,IV为全零try:cipher = AES.new(key, AES.MODE_CBC, iv=b'\0'*16)decrypted = cipher.decrypt(padded_data)return decrypted.decode('utf-8', errors='ignore')except:return Nonedef main():if len(sys.argv) != 2:print("用法: python advanced_pcode_parser.py <p文件路径>")returnpfile_path = sys.argv[1]if not os.path.exists(pfile_path):print(f"文件不存在: {pfile_path}")returnparser = MatlabPFileParser(pfile_path)if not parser.read_file():print("无法读取文件")returnif not parser.parse_header():returnfunc_info = parser.extract_function_info()if func_info:print(f"检测到函数名: {func_info.get('name', '未知')}")print("尝试多种解密方法...")results = parser.try_decrypt()if not results:print("无法解密文件,可能是不支持的版本或加密方式")returnfor method, result in results:output_path = pfile_path.replace('.p', f'_decoded_{method}.m')with open(output_path, 'w', encoding='utf-8') as f:f.write(result)print(f"使用{method}解密成功,已保存到: {output_path}")if __name__ == "__main__":main()
使用方法:
pip install pycryptodome numpy
python advanced_pcode_parser.py your_file.p
4. 行为分析法(适用于所有版本)
当直接解密不可行时,可以使用行为分析法来理解P文件的功能:
# behavior_analyzer.py - 通过行为分析P文件功能
import os
import sys
import subprocess
import numpy as np
import json
import tempfiledef create_matlab_script(pfile_path, test_inputs):"""创建一个MATLAB脚本来分析P文件的行为"""# 提取函数名(假设与文件名相同)func_name = os.path.basename(pfile_path).replace('.p', '')script = f"""function analyze_pfile()% 添加P文件所在目录到路径addpath('{os.path.dirname(os.path.abspath(pfile_path))}');% 准备测试输入test_inputs = {json.dumps(test_inputs)};results = cell({len(test_inputs)}, 2);% 运行测试for i = 1:{len(test_inputs)}tryinput_data = test_inputs{{i}};disp(['测试输入 #', num2str(i), ': ', mat2str(input_data)]);% 调用P文件函数tic;output = {func_name}(input_data);elapsed = toc;% 保存结果results{{i, 1}} = input_data;results{{i, 2}} = output;% 显示结果disp(['输出: ', mat2str(output)]);disp(['耗时: ', num2str(elapsed), ' 秒']);catch edisp(['错误: ', e.message]);results{{i, 1}} = input_data;results{{i, 2}} = ['错误: ', e.message];enddisp('-------------------');end% 保存结果save('pfile_analysis_results.mat', 'results');% 尝试使用profiler获取更多信息profile on;{func_name}(test_inputs{{1}});profile off;profile viewer;end"""script_path = os.path.join(tempfile.gettempdir(), 'analyze_pfile.m')with open(script_path, 'w') as f:f.write(script)return script_pathdef run_matlab_analysis(script_path):"""运行MATLAB分析脚本"""try:# 尝试使用命令行调用MATLABsubprocess.run(['matlab', '-nodisplay', '-nosplash', '-r', f"run('{script_path}'); exit;"], check=True)print("MATLAB分析完成,请查看MATLAB窗口和生成的pfile_analysis_results.mat文件")except:print("无法自动运行MATLAB。请手动运行以下脚本:")print(f"路径: {script_path}")print("在MATLAB中运行: analyze_pfile")def generate_test_inputs():"""生成各种类型的测试输入"""return [[1, 2, 3], # 简单数组[[1, 2], [3, 4]], # 2D数组[0], # 零[1.5, 2.7, 3.14], # 浮点数np.random.rand(3).tolist(), # 随机数[-1, -2, -3], # 负数[10**6, 10**7], # 大数[0.0001, 0.0002], # 小数["test"], # 字符串(如果支持)[] # 空数组]def main():if len(sys.argv) != 2:print("用法: python behavior_analyzer.py <p文件路径>")returnpfile_path = sys.argv[1]if not os.path.exists(pfile_path):print(f"文件不存在: {pfile_path}")returnprint(f"分析P文件: {pfile_path}")test_inputs = generate_test_inputs()script_path = create_matlab_script(pfile_path, test_inputs)run_matlab_analysis(script_path)if __name__ == "__main__":main()
使用方法:
pip install numpy
python behavior_analyzer.py your_file.p
此脚本会创建一个MATLAB分析程序,通过各种输入测试P文件的行为,帮助你理解其功能。
三、工具特点与技术分析
1. 解密工具的特点
- 版本依赖性:不同MATLAB版本的P文件格式和加密方式不同
- 成功率:
- R2007b及之前版本:较高成功率(约70-80%)
- R2008a-R2010b:中等成功率(约40-60%)
- R2011a及以后:较低成功率(约10-30%)
- 代码质量:还原的代码通常缺少注释和原始变量名
- 法律风险:使用这些工具可能违反MATLAB的许可协议
2. 技术原理
-
文件格式分析:
- P文件通常包含一个标准头部("MATLAB"字符串)
- 版本号和元数据区域
- 加密的代码段
-
解密方法:
- 早期版本:简单的XOR滚动密钥
- 中期版本:基本的AES加密
- 新版本:复杂的AES加密,带有动态密钥生成
-
逆向工程挑战:
- 密钥派生算法未公开
- 加密块大小和模式(ECB/CBC)需要猜测
- 代码压缩和混淆增加了难度
四、实用建议
1. 针对不同版本的策略
- R2007b及之前:直接使用简单的XOR解密工具
- R2008a-R2010b:尝试高级解析工具,结合AES解密
- R2011a及以后:首选行为分析法,辅以部分解密尝试
2. 实用工作流程
- 确定P文件版本:使用上述工具分析文件头
- 尝试直接解密:根据版本选择适当的解密方法
- 行为分析:如直接解密失败,使用行为分析理解功能
- 重新实现:基于行为分析结果,重新编写等效的M文件
3. 替代方案
如果以上方法都不成功,可以考虑:
- 联系原作者:请求提供原始M文件或文档
- 使用MATLAB的反编译工具:MATLAB内部有一些调试工具可能有助于理解P文件
- 使用类似功能的开源库:许多MATLAB函数在Python(如NumPy、SciPy)或其他语言中有等效实现
五、注意事项
- 法律风险:解密P文件可能违反MATLAB的最终用户许可协议(EULA)
- 仅用于学习:这些工具应仅用于学习和研究目的,或恢复自己丢失的源代码
- 不完美还原:即使成功解密,还原的代码也不会与原始代码完全相同
- 版本限制:大多数工具对新版本MATLAB的P文件效果有限
六、总结
MATLAB P文件的还原是一个技术挑战,成功率取决于MATLAB版本和P文件的复杂性。本文提供的Python和JavaScript工具可以帮助您尝试解密较旧版本的P文件,或通过行为分析理解P文件的功能。对于较新版本,直接解密的成功率较低,建议结合行为分析和重新实现的方法。
无论使用哪种方法,都应注意可能的法律风险,并仅将这些工具用于合法目的,如恢复自己丢失的源代码或学习研究。
相关文章:
加密和解密(大语言模型)
看到很多对matlab的p文件加密方案感兴趣的。网络上技术资料比较少,所以,我让大语言模型提供一些概论性质的东西,转发出来自娱自乐。期望了解p文件加密的复杂度,而不是一定要尝试挑战加密算法。 但根据大语言模型提供的材料&#…...
双轮驱动能源革命:能源互联网与分布式能源赋能工厂能效跃迁
在全球能源结构深度转型与“双碳”目标的双重驱动下,工厂作为能源消耗的主力军,正站在节能变革的关键节点。能源互联网与分布式能源技术的融合发展,为工厂节能开辟了全新路径。塔能科技凭借前沿技术与创新实践,深度探索能源协同优…...
React 更新 state 中的数组
更新 state 中的数组 数组是另外一种可以存储在 state 中的 JavaScript 对象,它虽然是可变的,但是却应该被视为不可变。同对象一样,当你想要更新存储于 state 中的数组时,你需要创建一个新的数组(或者创建一份已有数组…...
ubantu18.04HDFS编程实践(Hadoop3.1.3)
说明:本文图片较多,耐心等待加载。(建议用电脑) 注意所有打开的文件都要记得保存。 第一步:准备工作 本文是在之前Hadoop搭建完集群环境后继续进行的,因此需要读者完成我之前教程的所有操作。 第二步&am…...
Spring Boot资源耗尽问题排查与优化
Spring Boot服务运行一段时间后新请求无法处理的问题。服务没有挂掉,也没有异常日志。思考可能是一些资源耗尽或阻塞的问题。 思考分析 首先,资源耗尽可能涉及线程池、数据库连接、内存、文件句柄或网络连接等。常见的如线程池配置不当,导致…...
优化WAV音频文件
优化 WAV 音频文件通常涉及 减小文件体积、提升音质 或 适配特定用途(如流媒体、广播等)。以下是分场景的优化方法,涵盖工具和操作步骤: 一、减小文件体积(无损/有损压缩) 1. 无损压缩 转换格式࿱…...
string函数具体事例
输出所有字串出现的位置 输入两个字符串A和B,输出B在A中出现的位置 输入 两行 第一行是一个含有空格的字符串 第二行是要查询的字串 输出 字串的位置 样例输入 I love c c python 样例输出 -1 样例输入 I love c c c 样例输出 8 12 #include<iostream> #inclu…...
8.Rust+Axum 数据库集成实战:从 ORM 选型到用户管理系统开发
摘要 深入探讨 RustAxum 数据库集成,包括 ORM 选型及实践,助力用户管理系统开发。 一、引言 在现代 Web 应用开发中,数据库集成是至关重要的一环。Rust 凭借其高性能、内存安全等特性,与 Axum 这个轻量级且高效的 Web 框架结合…...
电脑 BIOS 操作指南(Computer BIOS Operation Guide)
电脑 BIOS 操作指南 电脑的BIOS界面(应为“BIOS”)是一个固件界面,允许用户配置电脑的硬件设置。 进入BIOS后,你可以进行多种设置,具体包括: 1.启动配置 启动顺序:设置从哪个设备启动&#x…...
MySQL快速入门篇---库的操作
目录 一、创建数据库 1.语法 2.示例 二、查看数据库 1.语法 三、字符集编码和校验(排序)规则 1.查看数据库支持的字符集编码 2.查看数据库支持的排序规则 3.查看系统默认字符集和排序规则 3.1.查看系统默认字符集 3.2.查看系统默认排序规则 …...
前端:uniapp中uni.pageScrollTo方法与元素的overflow-y:auto之间的关联
在uniapp中,uni.pageScrollTo方法与元素的overflow-y:auto属性之间存在以下关联和差异: 一、功能定位差异 uni.pageScrollTo 属于页面级滚动控制,作用于整个页面容器34。要求页面内容高度必须超过屏幕高度,且由根元素下…...
【已更新完毕】2025华中杯B题数学建模网络挑战赛思路代码文章教学:校园共享单车的调度与维护问题
完整内容请看文末最后的推广群 构建校园共享单车的调度与维护问题 摘要 共享单车作为一种便捷、环保的短途出行工具,近年来在高校校园内得到了广泛应用。然而,共享单车的运营也面临一些挑战。某高校引入共享单车后,委托学生对运营情况进行调…...
NO.92十六届蓝桥杯备战|图论基础-最小生成树-Prim算法-Kruskal算法|买礼物|繁忙的都市|滑雪(C++)
一个具有n个顶点的连通图,其⽣成树为包含n-1条边和所有顶点的极⼩连通⼦图。对于⽣成树来说,若砍去⼀条边就会使图不连通图;若增加⼀条边就会形成回路。 ⼀个图的⽣成树可能有多个,将所有⽣成树中权值之和最⼩的树称为最⼩⽣成树…...
第十四节:实战场景-何实现全局状态管理?
React.createElement调用示例 Babel插件对JSX的转换逻辑 React 全局状态管理实战与 JSX 转换原理深度解析 一、React 全局状态管理实现方案 1. Context API useReducer 方案(轻量级首选) // 创建全局 Context 对象 const GlobalContext createConte…...
数据驱动、精准协同:高端装备制造业三位一体生产管控体系构建
开篇引入 鉴于集团全面推行生产运营体建设以及对二级单位生产过程管控力度逐步加强,某高端装备制造企业生产部长王总正在开展新的一年企业生产管控规划工作,为了能够更好地进行体系规划与建设应用,特邀请智能制造专家小智来进行讨论交流。 王…...
航电系统之通信技术篇
航电系统(航空电子系统)的通信技术是现代航空器的核心技术之一,其核心目标是实现飞行器内部各系统之间以及飞行器与外部设备(如地面控制中心、其他飞行器等)之间高效、可靠的信息交互。随着航空技术的不断发展…...
Linux 日常运维命令大全
Linux 作为一种开源操作系统,在服务器运维中扮演着重要角色。掌握常用的 Linux 命令对于运维人员而言至关重要。本文将整理一份 Linux 服务器运维常用命令大全,帮助你在日常工作中提高效率和准确性。 1. 基础命令 基础命令是Linux操作的起点࿰…...
HTTP 3.0 协议的特点
HTTP/3 是互联网传输协议的一次重要升级,相较于 HTTP/2,它引入了多项显著改进和新特性。 基于 QUIC 协议: HTTP/3 采用了 QUIC(Quick UDP Internet Connections)作为底层传输协议,QUIC 基于 UDP࿰…...
[工具]Java xml 转 Json
[工具]Java xml 转 Json 依赖 <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --> <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.37</version> </dependen…...
「仓颉编程语言」Demo
仓颉编程语言」Demo python 1)# 仓颉语言写字楼管理系统示例(虚构语法)# 语法规则:中文关键词 类Python逻辑定义 写字楼管理系统属性:租户库 列表.新建()报修队列 列表.新建()费用单价 5 # 元/平方米方法 添加租户(名称, 楼层, 面积):…...
发现“横”字手写有难度,对比两个“横”字
我发现手写体“横”字“好看”程度,难以比得上印刷体: 两个从方正简体启体来的“横”字: 哪个更好看?我是倾向于左边一点。 <div style"transform: rotate(180deg); display: inline-block;"> 左边是我从方正简…...
深度学习3.1 线性回归
3.1.1 线性回归的基本概念 损失函数 梯度下降 3.1.2 向量化加速 %matplotlib inline import math import time import numpy as np import torch from d2l import torch as d2ln 1000000 #本机为了差距明显,选择数据较大,运行时间较长,可选…...
番外篇 | SEAM-YOLO:引入SEAM系列注意力机制,提升遮挡小目标的检测性能
前言:Hello大家好,我是小哥谈。SEAM(Squeeze-and-Excitation Attention Module)系列注意力机制是一种高效的特征增强方法,特别适合处理遮挡和小目标检测问题。该机制通过建模通道间关系来自适应地重新校准通道特征响应。在遮挡小目标检测中的应用优势包括:1)通道注意力增强…...
SpringBoot ApplicationEvent:事件发布与监听机制
文章目录 引言一、事件机制的基本概念二、创建自定义事件2.1 定义事件类2.2 发布事件2.3 简化的事件发布 三、创建事件监听器3.1 使用EventListener注解3.2 实现ApplicationListener接口3.3 监听非ApplicationEvent类型的事件 四、事件监听的高级特性4.1 条件事件监听4.2 异步事…...
[250415] OpenAI 推出 GPT-4.1 系列,支持 1M token
目录 OpenAI 推出 GPT-4.1 系列 OpenAI 推出 GPT-4.1 系列 OpenAI 宣布,新一代 GPT-4.1 模型系列正式发布,包括 GPT-4.1, GPT-4.1 mini 和 GPT-4.1 nano 三款模型,该系列模型在各项性能指标上全面超越 GPT-4o 和 GPT-4o mini,尤其…...
广东2024信息安全管理与评估一阶段答案截图
2023-2024 学年广东省职业院校技能大赛 高等职业教育组 信息安全管理与评估 赛题一 模块一 网络平台搭建与设备安全防护 一、 比赛时间 本阶段比赛时间为 180 分钟。 二、 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一…...
C++_设计模式\_观察者模式(Observer Pattern)
👋 Hi, I’m liubo👀 I’m interested in harmony🌱 I’m currently learning harmony💞️ I’m looking to collaborate on …📫 How to reach me …📇 sssssdsdsdsdsdsdasd🎃 dsdsdsdsdsddfsg…...
安卓手机如何改ip地址教程
对于安卓手机用户而言,ip修改用在电商、跨境电商、游戏搬砖、社交软件这些需要开多个账号的项目。因为多个设备或账号又不能在同一ip网络下,所以修改手机的IP地址防检测成为一个必要的操作。以下是在安卓手机上更改IP地址的多种方法及详细步骤࿰…...
从Shell到域控:内网渗透中定位域控制器的8种核心方法
在内网渗透中,定位域控制器(Domain Controller, DC)是攻防对抗的关键环节。本文结合实战经验与工具技术,总结出8种从Shell快速发现域控主机的方法,涵盖命令探测、网络扫描、日志分析等维度,助你系统…...
PHP腾讯云人脸核身获取Access Token
参考腾讯云官方文档: 人脸核身 获取 Access Token_腾讯云 public function getAccessToken(){$data [appId > , //WBappid,https://cloud.tencent.com/document/product/1007/49634secret > ,grant_type > client_credential, //授权类型version > 1…...
