当前位置: 首页 > article >正文

【iOS安全】使用LLDB调试iOS App | LLDB基本架构 | LLDB安装和配置

LLDB基本架构

参考:
https://crifan.github.io/ios_re_dynamic_debug/website/debug_code/lldb_debugserver.html
https://book.crifan.org/books/ios_re_debug_debugserver_lldb/website/

在这里插入图片描述
在这里插入图片描述

LLDB安装和配置

1. 让iPhone中出现/Developer/usr/bin/debugserver

最初的iPhone中没有 /Developer/usr/bin/debugserver

图片名称

需要让iPhone中出现/Developer/usr/bin/debugserver

1.1 启动xcode并创建项目

用数据线把iPhone连到MacBook ,MacBook 上打开xcode,创建项目并连接设备,自动配置好后xcode就会把debugserver发送到iPhone上

1.2 报错:MacBook xcode连接iPhone时报错xxx is not available

在这里插入图片描述

Window → Devices and Simulators 报错如下:
在这里插入图片描述

The current device configuration is unsupported. This iPhone 8 (Model A1863, A1905, A1906, A1907) is running iOS 14.3 (18C66), which is not supported by Xcode 11.7.
Domain: com.apple.dtdevicekit
Code: 601
Recovery Suggestion: To run on this device, please update to a version of Xcode that supports iOS 14.3. You can download Xcode from the Mac App Store or the Apple Developer website.
User Info: {DVTRadarComponentKey = 487927;DeviceType = "iPhone10,1";
}

解决方法:
参考:https://developer.apple.com/forums/thread/659166
在这里插入图片描述
从这里下载14.3的支持文件
https://github.com/JinjunHan/iOSDeviceSupport/tree/master/iOSDeviceSupport

复制粘贴到
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/

但是出现新的报错:
在这里插入图片描述
在这里插入图片描述

DetailsFailed to start remote service on device.
Domain: com.apple.dtdevicekit
Code: 811
Recovery Suggestion: Please check your connection to your device.
User Info: {DVTRadarComponentKey = 261622;
}
--
The service is invalid.
Domain: com.apple.dt.MobileDeviceErrorDomain
Code: -402653150
User Info: {DVTRadarComponentKey = 261622;MobileDeviceErrorCode = "(0xE8000022)";"com.apple.dtdevicekit.stacktrace" = (0   DTDeviceKitBase                     0x000000011d61e81a DTDKCreateNSErrorFromAMDErrorCode + 2331   DTDeviceKitBase                     0x000000011d630161 __63-[DTDKRemoteDeviceConnection startFirstServiceOf:unlockKeybag:]_block_invoke + 5642   DTDeviceKitBase                     0x000000011d62f829 __48-[DTDKRemoteDeviceConnection futureWithSession:]_block_invoke_3 + 223   DTDeviceKitBase                     0x000000011d620df9 __DTDKExecuteInSession_block_invoke_2 + 354   DTDeviceKitBase                     0x000000011d620209 __DTDKExecuteWithConnection_block_invoke_2 + 4735   DTDeviceKitBase                     0x000000011d620007 __DTDKExecuteWithConnection_block_invoke + 1066   libdispatch.dylib                   0x00007fff70ae9658 _dispatch_client_callout + 87   libdispatch.dylib                   0x00007fff70af56ec _dispatch_lane_barrier_sync_invoke_and_complete + 608   DVTFoundation                       0x0000000103f24138 DVTDispatchBarrierSync + 2089   DVTFoundation                       0x0000000103efaa93 -[DVTDispatchLock performLockedBlock:] + 6410  DTDeviceKitBase                     0x000000011d61ff08 DTDKExecuteWithConnection + 22611  DTDeviceKitBase                     0x000000011d620c63 DTDKExecuteInSession + 37612  DTDeviceKitBase                     0x000000011d62f66a __48-[DTDKRemoteDeviceConnection futureWithSession:]_block_invoke_2 + 13113  DVTFoundation                       0x0000000103f215c4 __DVT_CALLING_CLIENT_BLOCK__ + 714  DVTFoundation                       0x0000000103f23206 __DVTDispatchAsync_block_invoke + 119415  libdispatch.dylib                   0x00007fff70ae86c4 _dispatch_call_block_and_release + 1216  libdispatch.dylib                   0x00007fff70ae9658 _dispatch_client_callout + 817  libdispatch.dylib                   0x00007fff70aeec44 _dispatch_lane_serial_drain + 59718  libdispatch.dylib                   0x00007fff70aef609 _dispatch_lane_invoke + 41419  libdispatch.dylib                   0x00007fff70af8c09 _dispatch_workloop_worker_thread + 59620  libsystem_pthread.dylib             0x00007fff70d43a3d _pthread_wqthread + 29021  libsystem_pthread.dylib             0x00007fff70d42b77 start_wqthread + 15
);
}
--
System InformationmacOS Version 10.15.7 (Build 19H1323)
Xcode 11.7 (16142)

但是手机上出现构建好的App

解决方法见下文

1.3 报错:运行编写的App时报错Failed to start remote service on device.

在这里插入图片描述

在这里插入图片描述

DetailsFailed to start remote service on device.
Domain: com.apple.dtdevicekit
Code: 811
Recovery Suggestion: Please check your connection to your device.
User Info: {DVTRadarComponentKey = 261622;
}
--
The service is invalid.
Domain: com.apple.dt.MobileDeviceErrorDomain
Code: -402653150
User Info: {DVTRadarComponentKey = 261622;MobileDeviceErrorCode = "(0xE8000022)";"com.apple.dtdevicekit.stacktrace" = (0   DTDeviceKitBase                     0x000000011d61e81a DTDKCreateNSErrorFromAMDErrorCode + 2331   DTDeviceKitBase                     0x000000011d630161 __63-[DTDKRemoteDeviceConnection startFirstServiceOf:unlockKeybag:]_block_invoke + 5642   DTDeviceKitBase                     0x000000011d62f829 __48-[DTDKRemoteDeviceConnection futureWithSession:]_block_invoke_3 + 223   DTDeviceKitBase                     0x000000011d620df9 __DTDKExecuteInSession_block_invoke_2 + 354   DTDeviceKitBase                     0x000000011d620209 __DTDKExecuteWithConnection_block_invoke_2 + 4735   DTDeviceKitBase                     0x000000011d620007 __DTDKExecuteWithConnection_block_invoke + 1066   libdispatch.dylib                   0x00007fff70ae9658 _dispatch_client_callout + 87   libdispatch.dylib                   0x00007fff70af56ec _dispatch_lane_barrier_sync_invoke_and_complete + 608   DVTFoundation                       0x0000000103f24138 DVTDispatchBarrierSync + 2089   DVTFoundation                       0x0000000103efaa93 -[DVTDispatchLock performLockedBlock:] + 6410  DTDeviceKitBase                     0x000000011d61ff08 DTDKExecuteWithConnection + 22611  DTDeviceKitBase                     0x000000011d620c63 DTDKExecuteInSession + 37612  DTDeviceKitBase                     0x000000011d62f66a __48-[DTDKRemoteDeviceConnection futureWithSession:]_block_invoke_2 + 13113  DVTFoundation                       0x0000000103f215c4 __DVT_CALLING_CLIENT_BLOCK__ + 714  DVTFoundation                       0x0000000103f23206 __DVTDispatchAsync_block_invoke + 119415  libdispatch.dylib                   0x00007fff70ae86c4 _dispatch_call_block_and_release + 1216  libdispatch.dylib                   0x00007fff70ae9658 _dispatch_client_callout + 817  libdispatch.dylib                   0x00007fff70aeec44 _dispatch_lane_serial_drain + 59718  libdispatch.dylib                   0x00007fff70aef609 _dispatch_lane_invoke + 41419  libdispatch.dylib                   0x00007fff70af8c09 _dispatch_workloop_worker_thread + 59620  libsystem_pthread.dylib             0x00007fff70d43a3d _pthread_wqthread + 29021  libsystem_pthread.dylib             0x00007fff70d42b77 start_wqthread + 15
);
}
--
System InformationmacOS Version 10.15.7 (Build 19H1323)
Xcode 11.7 (16142)

不好使的解决办法:
https://cloud.tencent.com/developer/ask/sof/107747170

在这里插入图片描述
cd ~/Library/Developer/Xcode/DerivedData
rm -rf *

解决方法:
安装Xcode 12.3

1.4 报错: Signing for xxx requires a development team

Signing for “lldbTest” requires a development team.Select a development team in the Signing & Capabilities editor.
在这里插入图片描述
解决方法:
在这里插入图片描述

添加team
在这里插入图片描述

1.5 报错: iPhone is not available. Please reconnect the device

iPhone is not available. Please reconnect the device
在这里插入图片描述
解决方法:
参考:https://blog.csdn.net/zjpjay/article/details/108770188

Window → Devices And Simulators 能看到报错信息
在这里插入图片描述
在这里插入图片描述
我是iOS 14.3,因此可以下载xcode 12.3

下载地址
https://developer.apple.com/download/all/

使用xcode 12.3之后出现新的报错
在这里插入图片描述

1.6 报错: iPhone is not available. Please reconnect the device

Failed to start remote service “com.apple.debugserver” on device.
Please check your connection to your deviice.

解决方法:
我没管这个报错,好像没什么影响,这一步骤只要保证iPhone中出现/Developer/usr/bin/debugserver即可

1.7 iPhone中出现debugserver

/Developer/usr/bin/debugserver
在这里插入图片描述

2. 确保iPhone中debugserver有正确的权限entitlement

2.1 从iPhone中导出debugserver到MacBook

在这里插入图片描述

2.2 MacBook上给debugserver加权限

参考:https://www.cnblogs.com/ludashi/p/5730338.html

找到iPhone中的debugserver,在macos上进行如下操作:

2.2.1 根据机型对debugserver进行瘦身
lipo -thin arm64 debugserver -output debugserver

-thin后方填写你的测试机相应的ARM指令集架构即可
指令集架构参考:https://blog.csdn.net/zgpeace/article/details/104290302
在这里插入图片描述
在这里插入图片描述

2.2.2 安装ldid
brew install ldid
2.2.3 导出debugserver现有的权限

参考:https://www.jianshu.com/p/fa2f080fb4bb

ldid -e debugserver > debugserver-origin.entitlements

我导出的:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict><key>com.apple.springboard.debugapplications</key><true/><key>com.apple.backboardd.launchapplications</key><true/><key>com.apple.backboardd.debugapplications</key><true/><key>com.apple.frontboard.launchapplications</key><true/><key>com.apple.frontboard.debugapplications</key><true/><key>seatbelt-profiles</key><array><string>debugserver</string></array><key>com.apple.private.logging.diagnostic</key><true/><key>com.apple.security.network.server</key><true/><key>com.apple.security.network.client</key><true/><key>com.apple.private.memorystatus</key><true/><key>com.apple.private.cs.debugger</key><true/>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict><key>com.apple.springboard.debugapplications</key><true/><key>com.apple.backboardd.launchapplications</key><true/><key>com.apple.backboardd.debugapplications</key><true/><key>com.apple.frontboard.launchapplications</key><true/><key>com.apple.frontboard.debugapplications</key><true/><key>seatbelt-profiles</key><array><string>debugserver</string></array><key>com.apple.private.logging.diagnostic</key><true/><key>com.apple.security.network.server</key><true/><key>com.apple.security.network.client</key><true/><key>com.apple.private.memorystatus</key><true/><key>com.apple.private.cs.debugger</key><true/>
</dict>
</plist>

ldid对于FAT格式会输出多份entitlement权限信息,需要去除其中重复的一份xml
参考:https://book.crifan.org/books/ios_re_debug_debugserver_lldb/website/usage_note/entitlement/check_entitlement/

例如我这里从iPhone8中导出的debugserver就是包含arm64和arm64e的FAT格式的debugserver,因此entitlement权限信息就有多份,需要去掉一份

2.2.4 修改entitlement权限

然后对entitlement权限进行如下修改

参考:https://book.crifan.org/books/ios_re_debug_debugserver_lldb/website/debugserver_lldb_debug/proper_entitlemets.html

  • 已加上权限:get-task-allow、task_for_pid-allow、run-unsigned-code
    目的:允许debugserver调试其他app
  • 已去掉权限:com.apple.security.network.server、com.apple.security.network.client
    目的:防止后续lldb调试报错Failed to get connection from a remote gdb process
  • 已去掉权限:seatbelt-profiles
    目的:方式后续debugserver加上-l的日志文件时报错:Failed to open log file for writing errno = 1 Operation not permitted

最终修改为如下,保存为debugserver.entitlements:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict><key>com.apple.springboard.debugapplications</key><true/><key>com.apple.backboardd.launchapplications</key><true/><key>com.apple.backboardd.debugapplications</key><true/><key>com.apple.frontboard.launchapplications</key><true/><key>com.apple.frontboard.debugapplications</key><true/><key>com.apple.private.logging.diagnostic</key><true/><key>com.apple.private.memorystatus</key><true/><key>com.apple.private.cs.debugger</key><true/><key>get-task-allow</key><true/><key>task_for_pid-allow</key><true/><key>run-unsigned-code</key><true/>
</dict>
</plist>
2.2.5 对debugserver进行重新签名

如果iOS < 15.0,可以用ldid
ldid -Sdebugserver.entitlements debugserver
注意S是大写,并且与debugserver紧挨着

如果iOS ≥ 15.0 或者 iOS < 15.0,可以用codesign
codesign -f -s - --entitlements debugserver.entitlements debugserver
(未尝试)

2.3 将debugserver拷贝到iPhone并赋执行权限

将已经签好权限的debugserver拷贝到iPhone的/usr/bin目录下

iPhone中的,原始版本的debugserver位置是:/Developer/usr/bin/debugserver
但该位置只读,无法修改
所以才需要拷贝到/usr/bin,因为/usr/bin是用于存放可执行文件工具的路径之一
理论上也可以拷贝到/bin/sbin /usr/sbin等,保证此路径出现在echo $PATH中即可
参考:
https://book.crifan.org/books/ios_re_debug_debugserver_lldb/website/debugserver_lldb_debug/proper_entitlemets.html

在这里插入图片描述

chmod +x debugserver
在这里插入图片描述
赋完权限后,你就可以使用debugserver命令来开启debugserver了
在这里插入图片描述

3. iPhone中运行debugserver

整体参考:
https://book.crifan.org/books/ios_re_debug_debugserver_lldb/website/debugserver_lldb_debug/mac_run_lldb_debug.html

3.1 attach模式

先手动启动app,再用debugserver去attach

3.1.1 找到App进程名

一般也就是App的可执行Mach-O文件名

PC端
frida-ps -H 192.168.31.32:6666 -a

6461  顺丰速运       com.sf-express.waybillcn

手机端查看进程名
ps -ef | grep “6461”

  501  6461     1   0 12:02AM ??         0:25.81 /var/containers/Bundle/Application/81449B8F-7C5D-4A06-8970-A3EEDF922AC2/SFMainland_Store_Pro.app/SFMainland_Store_Pro

后续用debugserver attach到App时:

可以使用Mach-O文件名
debugserver 0.0.0.0:12345 -a “SFMainland_Store_Pro”
在这里插入图片描述

可以使用完整Mach-O文件名
debugserver 0.0.0.0:12345 -a “/var/containers/Bundle/Application/81449B8F-7C5D-4A06-8970-A3EEDF922AC2/SFMainland_Store_Pro.app/SFMainland_Store_Pro”
在这里插入图片描述

可以使用进程号
debugserver 0.0.0.0:12345 -a 6461
在这里插入图片描述
其中12345是端口号,可以设置为任意值,只要不和其他端口号冲突即可;后续Macbook中lldb连接时,要用到此端口号

3.1.2 使用iproxy进行端口映射

参考:
https://blog.csdn.net/u010775335/article/details/127691013

需要将iPhone通过数据线连接至MacBook

MacBook安装usbmuxd
参考:https://cloud.tencent.com/developer/article/1173911

brew install usbmuxd

MacBook使用iproxy 将iPhone的端口映射到PC端口

iproxy 12345 12345
第一个参数是你要映射到的电脑端口
第二个是iPhone的端口
然后保持此窗口不动
在这里插入图片描述

3.1.3 用debugserver attach到App

启动顺丰速运app

iPhone SSH端
debugserver 0.0.0.0:12345 -a “SFMainland_Store_Pro”
在这里插入图片描述

3.2 spawn模式(未尝试)

debugserver -x auto 0.0.0.0:12345 “/var/containers/Bundle/Application/FD516591-AAA8-47B4-AD8B-5DA9EC88856B/UCWEB.app/UCWEB”

4. Mac中启动lldb来调试app

MacBook另起终端:
lldb
process connect connect://127.0.0.1:12345
等待若干分钟:
在这里插入图片描述

xxx@xxx lldb % lldb 
(lldb) process connect connect://127.0.0.1:12345
Process 10038 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOPframe #0: 0x0000000102ee6bc0 SFMainland_Store_Pro
->  0x102ee6bc0: adrp   x1, 30440x102ee6bc4: ldr    x1, [x1, #0x1f0]0x102ee6bc8: adrp   x16, 17050x102ee6bcc: ldr    x16, [x16, #0xf78]
Target 0: (SFMainland_Store_Pro) stopped.
(lldb)

此时iPhone SSH 变成
在这里插入图片描述

MacBook
(lldb) b ptrace
(lldb) c

在这里插入图片描述

完整的双侧截图如下:
在这里插入图片描述
在这里插入图片描述

LLDB指令教程

参考:https://www.jianshu.com/p/fa2f080fb4bb

breakpoint set -n “-[RNCWeakScriptMessageDelegate userContentController:didReceiveScriptMessage:]”

breakpoint set -n “-[* userContentController:didReceiveScriptMessage:]”

breakpoint list

禁用所有断点
breakpoint disable

临时修改显示汇编行数
disassemble --count 16
在这里插入图片描述

永久修改显示汇编行数
settings set stop-disassembly-count 16
在这里插入图片描述

用Frida拿到地址,再用LLDB调试

frida-trace -m "-[* userContentController:didReceiveScriptMessage:]"  -H 192.168.71.114:6666 顺丰速运

确认有-[RNCWeakScriptMessageDelegate userContentController:didReceiveScriptMessage:]

lldb检查符号是否存在

(lldb) image lookup -s “-[RNCWeakScriptMessageDelegate userContentController:didReceiveScriptMessage:]”
在这里插入图片描述
没有输出,说明LLDB找不到这个方法

(lldb) image lookup -rn “RNCWeakScriptMessageDelegate.*didReceiveScriptMessage”

问DeepSeek
在这里插入图片描述

// Frida 脚本
const method = ObjC.classes.RNCWeakScriptMessageDelegate["- userContentController:didReceiveScriptMessage:"];
console.log("Method address:", method.implementation);

frida -H 192.168.71.128:6666 -F -l addr-frida-script.js

[*] Starting Hooking
Method address: 0x102bc86dc

(lldb) breakpoint set --address 0x102bc86dc
在这里插入图片描述
打开webview时真的命中了
在这里插入图片描述

相关文章:

【iOS安全】使用LLDB调试iOS App | LLDB基本架构 | LLDB安装和配置

LLDB基本架构 参考&#xff1a; https://crifan.github.io/ios_re_dynamic_debug/website/debug_code/lldb_debugserver.html https://book.crifan.org/books/ios_re_debug_debugserver_lldb/website/ LLDB安装和配置 1. 让iPhone中出现/Developer/usr/bin/debugserver 最初…...

一、核心概念深入解析

一、核心概念深入解析 1. shared_ptr 的线程安全性澄清 引用计数是原子操作&#xff1a;shared_ptr 的引用计数&#xff08;use_count&#xff09;在多线程中递增 / 递减是安全的&#xff08;原子操作&#xff09;&#xff0c;但对象本身的读写需额外同步&#xff08;如 std:…...

python直方图

在Python中&#xff0c;绘制直方图&#xff08;Histogram&#xff09;是一项非常常见的任务&#xff0c;通常用于数据可视化&#xff0c;以展示数据的分布情况。Python中有多种库可以绘制直方图&#xff0c;其中最常用的两个库是Matplotlib和Seaborn。此外&#xff0c;Pandas库…...

[特殊字符] Unity 性能优化终极指南 — Text / TextMeshPro 组件篇

UGUI Text组件的不当使用及其性能瓶颈与优化 在Unity UGUI系统中&#xff0c;Text 组件&#xff08;或其升级版 TextMeshPro&#xff09;是显示文本信息的核心元素。然而&#xff0c;如果不当使用&#xff0c;它极易成为UI性能瓶颈的罪魁祸首&#xff0c;尤其是在预制体、属性…...

Idea 配置 Maven 环境

下载 Maven 官网&#xff1a;https://maven.apache.org/index.html 点击左侧 Downloads&#xff0c;然后选择 Files 中的 zip 包下载&#xff08;下载慢可以使用迅雷&#xff09; 配置 Maven 将压缩包解压&#xff0c;比如我解压后放到了 D:\developer\environment\apache-…...

git clone报错:SSL certificate problem: unable to get local issuer certificate

上述报错的完整信息是&#xff1a; Cloning into test... fatal: unable to access https://github.com/xxxx/xxxx.git/: SSL certificate problem: unable to get local issuer certificate 该报错表示 Git 在使用 HTTPS 协议克隆仓库时&#xff0c;无法验证 GitHub 的 SSL …...

Kafka 如何保证不重复消费

在消息队列的使用场景中&#xff0c;避免消息重复消费是保障数据准确性和业务逻辑正确性的关键。对于 Kafka 而言&#xff0c;保证不重复消费并非单一机制就能实现&#xff0c;而是需要从生产者、消费者以及业务层等多个维度协同配合。接下来&#xff0c;我们将结合图文详细解析…...

SpringBoot整合MyBatis完整实践指南

在Java企业级应用开发中&#xff0c;SpringBoot和MyBatis的组合已经成为主流的技术选型方案之一。本文将详细介绍如何从零开始搭建一个基于SpringBoot和MyBatis的项目&#xff0c;包括环境配置、数据库设计、实体类创建、Mapper接口编写以及实际应用等完整流程。 一、环境准备…...

RNN结构扩展与改进:从简单循环网络到时间间隔网络的技术演进

本文系统介绍 RNN 结构的常见扩展与改进方案。涵盖 简单循环神经网络&#xff08;SRN&#xff09;、双向循环神经网络&#xff08;BRNN&#xff09;、深度循环神经网络&#xff08;Deep RNN&#xff09; 等多种变体&#xff0c;解析其核心架构、技术特点及应用场景&#xff0c;…...

docker中,容器时间和宿机主机时间不一致问题

win11下的docker中有个mysql。今天发现插入数据的时间不正确。后来发现原来是docker容器中的时间不正确。于是尝试了各种修改&#xff0c;什么run -e TZ"${tzutil /g}"&#xff0c;TZ"Asia/Shanghai"&#xff0c;还有初始化时带--mysqld一类的&#xff0c;…...

Unity Shader编程】之高级纹理

一&#xff0c;立方体纹理 Cubemap 用途 用途说明反射贴图表面镜面高光或金属反射环境光采样模拟环境对物体的影响天空盒背景使用六张图拼接场景背景全景投影做360度相机渲染、投影等 二&#xff0c;创建立方体纹理 在 Unity 中创建和保存一个 立方体纹理&#xff08;Cubema…...

类 Excel 数据填报

类 Excel 填报模式&#xff0c;满足用户 Excel 使用习惯 数据填报&#xff0c;可作为独立的功能模块&#xff0c;用于管理业务流程、汇总采集数据&#xff0c;以及开发各类数据报送系统&#xff0c;因此&#xff0c;对于报表工具而言&#xff0c;其典型场景之一就是利用报表模…...

vscode调试stm32,Cortex Debug的配置文件lanuch.json如何写,日志

https://blog.csdn.net/jiladahe1997/article/details/122046665 https://discuss.em-ide.com/blog/67-cortex-debug 第一版 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: https://go.microsoft.com/fwlink/?li…...

Office文档图片批量导出工具

软件介绍 本文介绍一款专业的Office文档图片批量导出工具。 软件特点 这款软件能够批量导出Word、Excel和PPT中的图片&#xff0c;采用绿色单文件设计&#xff0c;体积小巧仅344KB。 基本操作流程 使用方法十分简单&#xff1a;直接将Word、Excel或PPT文件拖入软件&#xf…...

【iOS】ARC 与 Autorelease

ARC 与 Autorelease 文章目录 ARC 与 Autorelease前言何为ARC内存管理考虑方式自己生成的对象,自己持有非自己生成的对象,自己也可以持有不再需要自己持有的对象时释放非自己持有的对象无法释放 ARC的具体实现编译期和运行期ARC做的事情ARC实现: __autoreleasing 与 Autoreleas…...

人工智能在智能零售中的创新应用与未来趋势

随着电子商务的蓬勃发展和消费者需求的不断变化&#xff0c;零售行业正面临着前所未有的挑战和机遇。智能零售作为零售行业的重要发展方向&#xff0c;通过引入人工智能&#xff08;AI&#xff09;、物联网&#xff08;IoT&#xff09;、大数据和云计算等前沿技术&#xff0c;正…...

业务材料——半导体行业MES系统核心功能工业协议AI赋能

一、前置概念 半导体行业 半导体行业主要生产基于半导体材料&#xff08;如硅、锗、化合物半导体等&#xff09;的电子元器件及相关产品&#xff0c;广泛应用于计算、通信、能源、医疗等领域。 MES系统 MES系统&#xff08;Manufacturing Execution System&#xff0c;制造…...

docker部署命令行 — 启动一个 MySQL 数据库服务 并且把它的数据存储挂载到卷(volume)里

挂载卷的配置写法&#xff1a; version: "3" services:db:image: mysqlvolumes:- mysql_data:/var/lib/mysqlvolumes:mysql_data:这段 docker-compose.yml 配置非常典型&#xff0c;是用来启动一个 MySQL 数据库服务 并且把它的数据存储挂载到卷&#xff08;volume&…...

铁电液晶破局 VR/AR:10000PPI 重构元宇宙显示体验

一、VR/AR 沉浸感困境&#xff1a;传统显示技术的天花板在哪&#xff1f; &#xff08;一&#xff09;纱窗效应与眩晕感&#xff1a;近眼显示的双重枷锁 当用户戴上 VR 头显&#xff0c;眼前像素网格形成的 “纱窗效应” 瞬间打破沉浸感。传统液晶 500-600PPI 的像素密度&…...

2025年微信小程序开发:AR/VR与电商的最新案例

引言 微信小程序自2017年推出以来&#xff0c;已成为中国移动互联网生态的核心组成部分。根据最新数据&#xff0c;截至2025年&#xff0c;微信小程序的日活跃用户超过4.5亿&#xff0c;总数超过430万&#xff0c;覆盖电商、社交、线下服务等多个领域&#xff08;WeChat Mini …...

从零开始,学会上传,更新,维护github仓库

以下是一份从头到尾、覆盖安装、配置、创建仓库、上传项目到 GitHub 的完整教程。全程使用通用示例&#xff0c;不包含任何具体的仓库链接&#xff0c;仅供参考。 一、准备工作 1. 注册 GitHub 账号 打开浏览器&#xff0c;访问 GitHub 官网&#xff08;输入 “GitHub” 即可找…...

#STM32 HAL库实现的STM32F407时钟配置程序以及和STM32F103配置对比

以下是使用STM32 HAL库实现的STM32F407时钟配置完整代码&#xff08;基于8MHz外部晶振&#xff0c;配置为168MHz系统时钟&#xff09;&#xff0c;包含详细注释和关键点说明&#xff1a; 完整HAL库实现&#xff08;system_stm32f4xx.c main.c&#xff09; 1. 首先在stm32f4xx…...

竞争加剧,美团的战略升维:反内卷、科技与全球化

5月26日&#xff0c;美团发布2025年第一季度业绩报告&#xff0c;交出了一份兼具韧性与创新性的成绩单。 报告显示&#xff0c;公司一季度总营收866亿元&#xff0c;同比增长18%&#xff1b;核心本地商业收入643亿元&#xff0c;同比增长18%&#xff1b;季度研发投入58亿元&a…...

(17)课36:窗口函数的例题:例三登录时间与连续三天登录,例四球员的进球时刻连续进球。

&#xff08;89&#xff09;例三登录时间 &#xff1a; 保留代码版本 &#xff1a; CREATE TABLE sql_8( user_id varchar(2), login_date date ); insert into sql_8(user_id,login_date) values(A,2024-09-02),(A,2024-09-03),(A,2024-09-04),(B,2023-11-25),(B,2023-12- 3…...

高性能分布式消息队列系统(二)

上一篇博客将C进行实现消息队列的用到的核心技术以及环境配置进行了详细的说明&#xff0c;这一篇博客进行记录消息队列进行实现的核心模块的设计 五、项目的需求分析 5.1、项目框架的概念性理解 5.1.1、消息队列的设计和生产消费者模型的关系 在现代系统架构中&#xff0c;…...

Spring 官方推荐构造函数注入

1. 依赖关系明确 构造函数注入可以清晰地声明类的依赖关系&#xff0c;所有必需的依赖项都通过构造函数参数传递&#xff0c;使得代码的可读性更高。这种方式让类的使用者能够直观地了解类的依赖&#xff0c;而不需要通过注解或反射来猜测。 2. 增强代码健壮性 构造函数注入…...

华为OD机试真题——天然蓄水库(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《天然蓄水库》: 目录 题目…...

【Harmony OS】数据存储

目录 数据存储概述 首选项数据存储 关系型数据库 数据存储概述 • 数据存储 是为了解决应用数据持久化问题&#xff0c;使得数据能够存储在外存中&#xff0c;达到保存或共享目的。 • 鸿蒙应用数据存储包括 本地数据存储 和 分布式数据存储 。 • 本地数据存储 为应用…...

MybatisPlus--核心功能--service接口

Service接口 基本用法 MyBatisPlus同时也提供了service接口&#xff0c;继承后一些基础的增删改查的service代码&#xff0c;也不需要去书写。 接口名为Iservice&#xff0c;而Iservice也继承了IRepository&#xff0c;这里提供的方法跟BaseMapper相比只多不少&#xff0c;整…...

uniapp调试,设置默认展示的toolbar内容

uniapp调试&#xff0c;设置默认展示的toolbar内容 设置pages.json中 pages数组中 json的顺序就可以只需要调整顺序&#xff0c;不会影响该bar在页面中的显示默认展示第一条page...