使用QEMU搭建嵌入式固件模拟环境:从静态分析到动态调试
1. 项目概述为什么我们需要一个“虚拟的”固件环境如果你和我一样经常需要分析路由器、摄像头、智能家居设备这些嵌入式设备的固件那你肯定遇到过这样的困境手头没有对应的硬件设备或者不敢在真机上直接运行来路不明的固件怕它“变砖”或者引发安全问题。这时候一个能够模拟设备运行环境的“沙盒”就显得至关重要。QEMU这个强大的开源机器模拟器和虚拟器就是我们搭建这个“沙盒”的核心工具。它不仅能模拟常见的x86、ARM架构还能模拟MIPS、PowerPC等嵌入式领域常见的CPU让我们可以在自己的电脑上安全、可控地运行和调试那些为特定硬件编译的固件。简单来说这个项目的目标就是利用QEMU在你的个人电脑宿主机上构建一个能够启动、运行并分析目标设备固件的完整虚拟环境。这不仅仅是“装个虚拟机”那么简单它涉及到架构匹配、网络配置、文件系统提取与挂载、调试接口打通等一系列步骤。对于安全研究员、逆向工程师、嵌入式开发者和固件爱好者而言这是一项基础且核心的技能。通过它你可以静态分析用binwalk等工具拆包结合动态分析在QEMU里实际运行深入理解固件的行为挖掘潜在漏洞或者进行定制化开发。2. 核心思路与工具选型不止于QEMU搭建一个可用的固件模拟环境思路可以概括为“识别-提取-模拟-交互”。整个流程的核心是QEMU但它需要一系列工具的配合才能发挥最大效用。2.1 核心工具链解析QEMUQuick EMUlator项目的基石。它有两种主要模式系统模式模拟整个计算机系统包括CPU、内存、各种外设如网络卡、串口。这是我们运行完整固件镜像如firmware.bin时最常用的模式。例如qemu-system-arm用于模拟ARM架构的机器。用户模式仅模拟CPU指令集用于运行单个跨架构的可执行文件。这在动态分析固件中提取出的单个程序如/bin/busybox时非常有用。例如qemu-arm-static。选择理由开源、免费、支持架构极其广泛社区活跃是业界的标准工具。Binwalk固件分析的“瑞士军刀”。它的核心功能是识别和提取嵌入在固件文件中的各种文件系统、压缩包、可执行文件等。作用绝大多数厂商发布的固件都是一个“大杂烩”镜像里面包含了内核、文件系统、引导程序等。Binwalk能帮你自动识别这些结构通过文件签名、熵分析并将其中的文件系统如SquashFS、JFFS2、UBIFS提取出来。这是我们获取根文件系统rootfs的关键一步。选择理由自动化程度高支持格式多是固件分析入门必学工具。配套工具集file命令初步判断文件类型。strings命令提取文件中的可打印字符串常能发现关键信息如IP、密码、调试命令。hexdump/xxd命令以十六进制查看文件内容。firmware-mod-kit(FMK)一个工具包包含unsquashfs、unmkfs.jffs2等用于解压特定文件系统的工具有时比Binwalk更可靠。网络工具brctl,tunctl用于在宿主机和QEMU虚拟机之间搭建虚拟网络使虚拟机能够上网或与宿主机通信。2.2 环境搭建的两种典型路径根据固件类型和目标我们的搭建路径主要分为两类完整系统模拟针对提供了完整内核vmlinux或zImage和文件系统镜像的固件。我们的目标是让QEMU加载这个内核并挂载提取出的文件系统模拟设备上电启动的全过程。这最接近真实环境。用户态程序模拟有时我们只关心固件中的某个特定程序如一个Web服务后台httpd。我们可以使用QEMU的用户模式配合chroot在提取出的文件系统环境中运行这个单一程序进行行为分析和调试。这种方式更轻量启动更快。本次我们将重点放在第一种也是最复杂、最通用的“完整系统模拟”上。3. 实操准备从获取固件到提取文件系统让我们以一个假设的、基于ARM架构的路由器固件firmware_v1.0.bin为例从头开始操作。3.1 宿主机环境与工具安装首先确保你的宿主机以Ubuntu 22.04为例已安装必要的工具。# 更新软件包列表 sudo apt update # 安装QEMU系统模式和用户模式 sudo apt install qemu-system-arm qemu-system-mips qemu-system-ppc qemu-user-static -y # 安装Binwalk及其依赖 sudo apt install binwalk -y # 安装其他有用的工具 sudo apt install file strings xxd git build-essential libssl-dev -y # 安装网络桥接工具如果需要更复杂的网络 sudo apt install bridge-utils uml-utilities -y # 可选安装firmware-mod-kit git clone https://github.com/rampageX/firmware-mod-kit.git cd firmware-mod-kit sudo ./setup.sh3.2 固件初步分析与文件系统提取拿到固件后不要急于扔给QEMU。第一步永远是静态分析。# 1. 使用file命令进行初步判断 file firmware_v1.0.bin # 可能的输出firmware_v1.0.bin: u-boot legacy uImage, MIPS Linux-2.6.36, Linux/ARM, OS Kernel Image, lzma compressed, 0x80000000 # 2. 使用strings搜索关键信息 strings firmware_v1.0.bin | grep -i root\|pass\|admin\|linux\|kernel # 可能会发现默认密码、内核版本等。 # 3. 使用Binwalk进行深度扫描和提取 binwalk firmware_v1.0.binBinwalk的输出至关重要它可能如下所示DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 0 0x0 uImage header, header size: 64 bytes, header CRC: 0x12345678, created: 2022-01-01 00:00:00, image size: 2097152 bytes, Data Address: 0x80008000, Entry Point: 0x80008000, data CRC: 0x9ABCDEF0, OS: Linux, CPU: ARM, image type: OS Kernel Image, compression type: lzma, image name: Linux-3.10.14 64 0x40 LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 5242880 bytes 2097216 0x200040 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 15204312 bytes, 3530 inodes, blocksize: 131072 bytes, created: 2022-01-01 00:00:00从输出中我们可以解读出0x0位置是一个U-Boot镜像头后面跟着LZMA压缩的内核vmlinux或zImage。0x200040位置开始是一个Squashfs文件系统这很可能就是设备的根文件系统rootfs。现在我们让Binwalk自动提取所有识别出的内容binwalk -e firmware_v1.0.bin执行后会生成一个_firmware_v1.0.bin.extracted目录。进入该目录你可能会发现类似40内核和200040.squashfs文件系统的子目录。200040.squashfs目录里应该就是解压后的根文件系统。注意Binwalk的自动提取有时会失败尤其是面对非标准或加密的固件。如果squashfs目录为空或提取失败我们需要手动处理。# 手动提取Squashfs文件系统 dd iffirmware_v1.0.bin ofrootfs.squashfs bs1 skip$((0x200040)) count15204312 # 使用unsquashfs解压 sudo unsquashfs -d rootfs rootfs.squashfs如果遇到加密固件网络热词中提到的“固件加密”Binwalk可能无法识别。这时需要先研究加密方式或寻找解密工具这超出了基础环境搭建的范围属于逆向工程的高级课题。4. 构建可启动的QEMU镜像现在我们有了内核可能还需要从固件中进一步分离和根文件系统。接下来需要为QEMU准备一个它可以引导的虚拟磁盘镜像并把根文件系统放进去。4.1 创建虚拟磁盘并放入根文件系统我们创建一个格式为ext2的虚拟磁盘镜像大小根据rootfs调整例如256MB。# 1. 创建一个256MB的空白磁盘镜像 qemu-img create -f raw disk.img 256M # 2. 将其格式化为ext4文件系统需要先挂载到一个回环设备 sudo mkfs.ext4 -F disk.img # 3. 创建一个临时挂载点并将镜像挂载上去 mkdir -p /tmp/mnt sudo mount -o loop disk.img /tmp/mnt # 4. 将我们提取出的rootfs全部复制到镜像中 sudo cp -rf rootfs/* /tmp/mnt/ # 5. 重要确保/dev目录下有必要的设备节点。QEMU需要它们。 sudo mkdir -p /tmp/mnt/dev sudo mknod /tmp/mnt/dev/console c 5 1 sudo mknod /tmp/mnt/dev/null c 1 3 sudo mknod /tmp/mnt/dev/zero c 1 5 sudo mknod /tmp/mnt/dev/tty c 5 0 sudo mknod /tmp/mnt/dev/tty0 c 4 0 # 6. 卸载镜像 sudo umount /tmp/mnt现在disk.img就是一个包含了完整根文件系统的虚拟硬盘。4.2 分离内核并确定启动参数我们需要从固件中把内核镜像分离出来。根据Binwalk的结果内核从0x40开始大小是2097152 - 64 2097088字节即0x200040 - 0x40。dd iffirmware_v1.0.bin ofvmlinuz bs1 skip64 count2097088 file vmlinuz # 确认输出是Linux kernel ARM boot executable zImage (little-endian)接下来是最关键的一步确定QEMU的启动命令。这需要知道机器类型固件是为哪款开发板或SoC编译的常见的有vexpress-a9(ARM),virt(通用ARM),malta(MIPS)等。如果strings固件时发现了类似“MACH_TYPE_”的字符串可以据此搜索。对于未知固件vexpress-a9或virt是一个不错的通用起点。内核启动参数最重要的是告诉内核根文件系统在哪里。我们使用上一步创建的disk.img作为root设备。一个典型的ARMvexpress-a9板子的启动命令如下qemu-system-arm \ -M vexpress-a9 \ # 指定机器类型 -m 256M \ # 分配256MB内存 -kernel vmlinuz \ # 指定内核镜像 -dtb vexpress-v2p-ca9.dtb \ # 设备树文件某些板子需要可从QEMU安装目录找或编译 -append root/dev/mmcblk0 rw consolettyAMA0 \ # 内核参数根设备读写模式控制台 -drive filedisk.img,ifsd,formatraw \ # 将disk.img作为SD卡挂载 -nographic \ # 不使用图形界面直接输出到当前终端 -net nic -net user \ # 简单的用户模式网络NAT -serial mon:stdio # 将串口和监视器重定向到标准输入输出-append参数root/dev/mmcblk0指定根文件系统在第一个SD卡对应-drive ifsd。如果使用-drive ifvirtio这里可能要改成root/dev/vda。-nographic和-serial mon:stdio对于服务器环境或没有GUI的SSH连接这是最常用的组合将所有输出内核日志、系统控制台打印到当前终端。5. 网络配置与调试技巧让虚拟机具备网络能力对于分析网络服务固件至关重要。5.1 用户模式网络NAT最简单的网络上述命令中的-net nic -net user就是。虚拟机可以访问外网宿主机可以通过端口转发访问虚拟机的服务。-net user,hostfwdtcp::2222-:22这个参数将宿主机的2222端口转发到虚拟机的22端口SSH这样你就可以从宿主机ssh -p 2222 rootlocalhost登录到虚拟机。5.2 桥接网络TAP这需要更多设置但能让虚拟机和宿主机处于同一局域网段像一台真实设备。# 宿主机上创建TAP设备并配置需要root权限 sudo ip tuntap add tap0 mode tap sudo ip addr add 192.168.123.1/24 dev tap0 sudo ip link set tap0 up # 启动QEMU时使用TAP设备 qemu-system-arm \ -M vexpress-a9 \ -m 256M \ -kernel vmlinuz \ -append root/dev/mmcblk0 rw consolettyAMA0 ip192.168.123.100::192.168.123.1:255.255.255.0 \ -drive filedisk.img,ifsd,formatraw \ -nographic \ -net nic,modellan9118 \ -net tap,ifnametap0,scriptno,downscriptno在虚拟机内你需要手动或用脚本配置IP为192.168.123.100。桥接网络更复杂但适合需要多虚拟机交互或模拟特定网络拓扑的场景。5.3 内核恐慌与调试第一次启动失败遇到“Kernel panic”非常正常。这是最考验耐心的环节。检查控制台输出仔细阅读-nographic模式下的内核启动日志。错误信息会明确指出问题例如VFS: Cannot open root device “/dev/mmcblk0”根设备指定错误。尝试/dev/vda,/dev/sda或者检查disk.img是否成功挂载。Please append a correct “root” boot option同上。Failed to execute /init根文件系统里的/init或/sbin/init程序有问题。可能是架构不匹配比如用ARM QEMU运行了MIPS的程序或者文件系统损坏。使用-initrd临时绕过如果挂载根文件系统总是失败可以先用一个极简的initramfs启动再手动挂载disk.img进行调试。# 创建一个简单的init脚本 echo -e #!/bin/sh\nmount -t proc proc /proc\nmount -t sysfs sysfs /sys\n/bin/sh init chmod x init find . | cpio -H newc -o | gzip initrd.gz qemu-system-arm -M vexpress-a9 -m 256M -kernel vmlinuz -initrd initrd.gz -append consolettyAMA0 -nographic启动后你就在一个最小Shell里了可以尝试手动mount你的disk.img检查里面的内容。调整机器类型和内存尝试不同的-M参数如virt和-m大小如512M。6. 常见问题排查与经验实录这里记录了几个我踩过多次的坑和对应的解决方案。6.1 固件提取与文件系统问题问题现象可能原因排查与解决思路Binwalk扫描无结果或提取失败1. 固件加密或压缩。2. 非标准文件头。3. Binwalk签名数据库过时。1. 用hexdump -C查看文件头尾搜索已知魔术字如squashfs,jffs2。2. 尝试binwalk -Me递归提取或binwalk --dd.*暴力提取。3. 使用firmware-mod-kit中的extract-firmware.sh脚本尝试。4. 更新Binwalksudo binwalk -u。提取出的文件系统不完整或乱码1. 文件系统本身损坏。2. 提取偏移量或大小计算错误。3. 使用了错误的解压工具。1. 用dd命令根据Binwalk给出的精确偏移和大小手动提取。2. 尝试不同的文件系统解压工具如unsquashfs,jefferson(for JFFS2),ubireader(for UBI)。3. 在QEMU中挂载时使用-drive formatraw,filexxx并尝试不同的接口(ifide,ifsd,ifvirtio)。内核无法识别根文件系统格式内核编译时未包含对应文件系统驱动。1. 在QEMU启动参数中尝试rootfstypeext4或squashfs等明确指定类型。2. 如果文件系统是只读的如squashfs确保-append中有ro参数。6.2 QEMU启动与运行问题问题现象可能原因排查与解决思路启动后立即Kernel panic提示找不到根设备1.root参数指定的设备名错误。2. 虚拟磁盘未正确附加或格式不被支持。1. 根据-drive的if类型确定设备名ifsd-/dev/mmcblk0;ifide-/dev/sda;ifvirtio-/dev/vda。2. 使用-drive filedisk.img,formatraw,ifvirtio和root/dev/vda组合成功率较高。3. 在内核启动早期按任意键进入U-Boot或内核命令行用lsblk或cat /proc/partitions查看识别到的块设备。启动后卡住无响应或反复重启1. 内核与机器类型不匹配。2. 内存不足。3. 缺少必要的设备树DTB。1. 更换-M参数对于ARMvirt通用性最好但可能缺少某些外设驱动vexpress-a9很稳定。2. 增加-m参数到512M或1G。3. 对于需要DTB的板子确保-dtb参数指向正确的.dtb文件。可以尝试从编译该内核的源码中获取或使用QEMU自带的通常在/usr/share/qemu/。4. 尝试在-append中加入init/bin/sh跳过初始化脚本直接进入shell。网络无法连接1. 用户模式网络配置问题。2. 虚拟机内未配置网络或服务未启动。3. 桥接网络配置错误。1. 在QEMU内运行ifconfig -a查看网卡和IP。用户模式下通常是10.0.2.15。2. 检查宿主机防火墙是否阻止了转发。3. 对于桥接确保宿主机tap0接口是UP状态且虚拟机内配置了同网段IP。4.一个关键技巧在-append中直接传递IP参数如ip10.0.2.15::10.0.2.2:255.255.255.0可以避免依赖虚拟机内的DHCP或初始化脚本。串口无输出或输入无响应控制台设备指定错误。1. 确保-append中的console参数与-serial指向的设备匹配。对于vexpress-a9通常是ttyAMA0对于virt可能是tty0或ttyAMA0。尝试consoletty0 consolettyAMA0。2. 尝试去掉-nographic使用-serial vc和-serial stdio组合来分离图形和控制台。6.3 性能与使用技巧加速对于x86_64固件可以使用-enable-kvm来启用硬件虚拟化加速性能飞跃。对于ARM/MIPS可以尝试-cpu host如果宿主机CPU支持或指定更快的CPU模型如-cpu cortex-a57。调试神器GDBQEMU内置了GDB服务器是动态调试固件中内核或程序的利器。qemu-system-arm -M virt -kernel vmlinuz ... -S -s-S表示启动时暂停CPU-s是-gdb tcp::1234的简写。然后在另一个终端用gdb-multiarch vmlinuz再target remote localhost:1234连接就可以进行源码级调试了。文件共享使用virtio-9p文件系统共享宿主机目录到虚拟机方便传递文件和分析日志。# 启动QEMU时添加 -fsdev local,idfs1,path/path/on/host,security_modelmapped \ -device virtio-9p-pci,fsdevfs1,mount_taghostshare # 在虚拟机内挂载 mount -t 9p -o transvirtio hostshare /mnt镜像管理使用qcow2格式的镜像可以节省空间并支持快照。qemu-img convert -f raw -O qcow2 disk.img disk.qcow2 qemu-img snapshot -c snapshot1 disk.qcow2 # 创建快照搭建QEMU固件模拟环境是一个迭代和试错的过程。没有一套参数能通吃所有固件。核心在于耐心阅读内核输出信息并灵活调整启动参数。每次成功启动一个“黑盒”固件都像解开一个谜题这种成就感正是驱动我们不断探索的动力。当你熟悉了这套流程后甚至可以编写自动化脚本来批量尝试不同的机器类型、内核参数和驱动组合从而快速定位能让特定固件跑起来的正确配置。

相关新闻

Python数据处理实战:从原始数据到结构化输出的完整流程

Python数据处理实战:从原始数据到结构化输出的完整流程

在技术领域,我们经常需要处理来自不同来源的数据,例如网络爬虫抓取的信息、用户输入的内容或第三方API返回的JSON。这些数据往往包含不完整的字段、杂乱的格式或需要进一步处理的结构。虽然输入材料提到了动漫新番的信息,但作为技术博客&…

2026/10/5 14:12:21 阅读更多 →
现代C++核心特性解析:从C++11到C++20的高效编程指南

现代C++核心特性解析:从C++11到C++20的高效编程指南

1. 从“C with Classes”到现代C:为什么你需要重新认识这门语言 如果你和我一样,是从C98/03那个时代摸爬滚打过来的“老程序员”,看到“现代C”这个词,心里可能会五味杂陈。我们习惯了手动管理内存,用 new 和 delet…

2026/10/3 6:22:52 阅读更多 →
Arduino开发工具链解析:从图形化编程到专业IDE的进阶指南

Arduino开发工具链解析:从图形化编程到专业IDE的进阶指南

1. 项目概述:Arduino软件生态的双轨制 如果你刚接触Arduino,面对琳琅满目的开发板和各种传感器,可能会感到一丝迷茫:我该用什么软件来写代码、控制硬件呢?这正是我们今天要聊的核心——Arduino的软件工具链。简单来说&…

2026/10/11 7:11:52 阅读更多 →

最新新闻

基于LSTM的五类动作识别源码包:从视频特征提取到可视化全流程

基于LSTM的五类动作识别源码包:从视频特征提取到可视化全流程

简介:这份资源面向深度学习入门者、课程设计与毕业设计学生,以及需要快速验证行为识别方案的技术人员,提供一套可直接运行的五类动作识别项目源码。项目覆盖jump、walk、pickup、salute、wave五种日常动作,并实现LSTM、TA-LSTM、S…

2026/10/13 1:59:18 阅读更多 →
Ventoy 多合一启动盘实战:一次部署,镜像即拷即用

Ventoy 多合一启动盘实战:一次部署,镜像即拷即用

简介:Ventoy 是一款开源的可启动 U 盘制作工具,面向系统运维、装机测试与多系统启动盘需求的技术人员。它解决的核心痛点是无需反复格式化磁盘,只需将 ISO/WIM/IMG/VHD(x)/EFI 等镜像文件复制到 U 盘即可启动,并支持一次放入多个镜…

2026/10/13 1:59:18 阅读更多 →
Win10下用VS2017与CMake编译OpenCV 4.5.1并集成contrib模块的完整指南

Win10下用VS2017与CMake编译OpenCV 4.5.1并集成contrib模块的完整指南

简介:一份专为Windows平台计算机视觉开发者准备的OpenCV 4.5.1contrib重新编译成果,基于win10、VS2017与CMake构建,解决在官方发行版中无法直接使用SIFT、SURF等contrib模块功能的痛点。包体为RAR压缩包,共992个文件、约47.65MB&a…

2026/10/13 1:59:18 阅读更多 →
STM32CubeIDE集成RT-Thread实战:从裸机到多任务调度

STM32CubeIDE集成RT-Thread实战:从裸机到多任务调度

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 1:59:18 阅读更多 →
Visual Studio 2010 Shell(Isolate):轻量级遗产系统调试环境搭建指南

Visual Studio 2010 Shell(Isolate):轻量级遗产系统调试环境搭建指南

简介:Microsoft Visual Studio 2010 Shell (Isolate) 是面向Windows平台C、C#、VB.NET等开发者的一套轻量级、可定制IDE运行环境,专为无需完整VS安装但需调试器、编辑器及扩展框架的场景设计,适用于旧系统维护、第三方工具集成或精简开发环境…

2026/10/13 1:59:18 阅读更多 →
JavaScript公式编辑器实战:从LaTeX渲染到存储回显全解析

JavaScript公式编辑器实战:从LaTeX渲染到存储回显全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 1:58:18 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →