UE4逆向实战:快速定位UWorld与GObjectArray的核心技巧
1. 项目概述为什么我们需要快速定位UWorld和GObjectArray在UE4游戏安全、外挂对抗、Mod开发甚至是引擎深度定制这些领域里逆向分析是绕不开的基本功。你可能会为了分析一个游戏的内存结构或者想给某个游戏功能打上自己的补丁又或者想搞清楚某个崩溃的深层原因而一头扎进IDA或者x64dbg。这时候两个最核心、最底层的引擎数据结构——UWorld和GObjectArray——就成了你必须找到的“地图坐标原点”。UWorld是什么你可以把它理解成整个游戏世界的“总导演”。它管理着当前关卡的所有Actor演员、摄像机、物理世界、光照系统等等。找到了UWorld你就等于拿到了当前游戏场景的完整花名册和调度表可以遍历所有游戏对象分析它们的属性和行为。GObjectArray又是什么它是虚幻引擎全局对象管理器的核心一个存储了所有UObject虚幻对象基类实例的全局数组。游戏里你看到的角色、武器、UI控件甚至是一个配置数据只要继承自UObject最终都会在这里被记录。定位到GObjectArray意味着你获得了整个游戏所有对象的“户籍管理系统”可以按图索骥找到任何你感兴趣的对象实例。那么问题来了每次游戏更新引擎版本一变这些关键数据结构的地址几乎肯定会偏移。难道我们每次都要从零开始漫无目的地搜索内存、分析成千上万个函数吗当然不。这就是“快速定位技巧”的价值所在它是一套方法论教你如何利用引擎自身的稳定特征、版本间的共性以及运行时动态信息像侦探一样用最少的步骤、最高的成功率在茫茫内存中精准地“锚定”这两个关键点。掌握这套技巧能让你在逆向UE4项目时效率提升几个数量级把时间花在真正的逻辑分析上而不是枯燥的地址搜寻上。2. 核心思路拆解从静态特征到动态追踪快速定位的核心思路可以概括为“由静到动层层递进”。我们不会依赖某个固定地址而是寻找那些在版本迭代中相对稳定、或在运行时具有明显特征的模式。2.1 定位策略的总体框架我们的目标是在游戏进程的内存空间中找到指向UWorld实例的指针以及GObjectArray这个全局数据结构本身。通常有两种主流途径字符串引用追溯法引擎在初始化、日志输出、错误检查时会使用大量固定的字符串。这些字符串在二进制文件中是明文存储的地址相对固定。通过定位这些字符串再回溯引用它们的代码我们就能找到访问关键数据结构的函数进而顺藤摸瓜。虚函数表VTable与RTTI分析法C的运行时类型信息RTTI和虚函数表包含了丰富的类层次和类型信息。UWorld、UEngine等核心类有自己独特的虚表通过特征匹配可以定位到这些类的实例。代码模式签名扫描法引擎访问GNames全局名称表或GObjectArray的代码会生成特定的汇编指令模式例如通过一个固定的偏移访问一个全局变量。我们可以为这些模式制作特征码Signature在内存中扫描匹配。运行时堆栈与上下文分析法在游戏运行时下断点观察调用堆栈和寄存器/内存上下文。哪些函数频繁操作全局对象哪些指针的值看起来像是一个管理大量对象的数组通过动态调试来验证静态分析的猜想。一个高效的定位流程往往是这几种方法的组合。例如先用字符串快速找到一个切入点函数再分析该函数的汇编代码提取出访问全局数据的特征码最后在另一个版本中用这个特征码直接定位。2.2 为什么这些方法能跨越版本你可能会担心游戏一更新什么都变了。实际上引擎的核心架构和编程模式是相对稳定的。字符串是硬编码像“World”、“UObjectArray”、“Failed to find ‘%s’ property in ‘%s’ class”这样的日志或错误信息字符串只要引擎的某个功能逻辑不变它们就很可能还在。代码逻辑模式稳定虽然指令地址和寄存器分配会变但“从一个固定的全局地址加载指针”这个逻辑模式其对应的汇编指令结构如mov rax, [rip某个偏移]是相似的。特征码扫描的就是这种相对稳定的模式而不是绝对地址。类的继承关系和虚表结构稳定UWorld继承自UObject它有一系列特定的虚函数如Tick,GetWorld等。即使虚函数地址变了但它在虚表中的顺序、以及整个类的内存布局如UObject的VfTable指针在对象起始位置通常变化不大。我们的技巧就是基于这些“不变”的部分去应对“变化”的地址。3. 实战定位UWorld多种路径与验证理论说再多不如动手一试。我们以定位UWorld为例走通几条常见的路径。3.1 路径一通过“GEngine”全局指针切入这是最经典、也往往最快捷的方法之一。GEngine是一个指向全局UEngine实例的指针。而UEngine中通常持有当前UWorld的指针。步骤拆解定位GEngine字符串在IDA或二进制编辑器中搜索字符串“GEngine”。你可能会找到类似“GEngine used without core initialized”的错误提示字符串。回溯引用查看有哪些代码引用了这个字符串。通常会找到一个函数它负责在引擎初始化失败时抛出这个错误。在这个函数内部你会看到它尝试访问一个名为GEngine的全局变量。// 伪代码示意 if (!GEngine) { logError(GEngine used without core initialized); }分析汇编提取特征码在反汇编窗口找到访问GEngine的指令。在x64下它通常长这样; 一种常见形式通过RIP相对寻址加载GEngine mov rax, cs:qword_7FF6A3B8C540 ; 这是IDA解析出的地址实际字节码是48 8B 05 XX XX XX XX ; 即操作码 48 8B 05 后面跟一个4字节的相对偏移我们可以提取特征码为字节数组48 8B 05 ?? ?? ?? ??。这里的??是通配符代表偏移量因为每次编译偏移都不同。扫描内存找到GEngine指针在游戏进程内存中使用调试器如x64dbg的插件或自己写代码扫描这个特征码。找到匹配位置后解析该指令计算出的实际地址这个地址就是GEngine全局指针所在的内存地址。读取这个地址的值就得到了UEngine*。从GEngine到UWorld在IDA中分析UEngine类的结构。你需要找到存储当前World的成员变量。它可能叫GameViewport-World也可能是CurrentWorld、WorldList的第一个元素等。这需要你查看引擎源码如果有SDK或通过逆向UEngine的虚函数如GetWorld()来推断。小技巧在调试器中对找到的UEngine实例指针解引用查看其内存。寻找那些看起来像是有效指针指向其他一大块内存的值并结合字符串搜索如当前关卡名来辅助判断哪个是UWorld。3.2 路径二通过游戏视口GameViewport查找很多游戏逻辑需要通过UGameViewportClient来获取UWorld。这提供了另一条路径。定位GameViewportClient字符串或虚表搜索字符串“GameViewport”或寻找UGameViewportClient类的虚函数表。一个常见的线索是“GetViewportSize”这样的函数名。找到全局的GameViewportClient实例通常有一个全局变量如GEngine-GameViewport或GGameViewport。可以尝试用特征码扫描访问UGameViewportClient虚函数的代码来定位这个实例。追踪到World在UGameViewportClient类结构中寻找World成员。一旦找到实例即可读出UWorld指针。3.3 路径三直接扫描UWorld虚表与RTTI这是一种更“暴力”但直接的方法适用于你有信心识别出UWorld对象实例的情况。获取UWorld的RTTI类型名称如果你有相同版本引擎的PDB文件或开发版DLL可以很容易得到UWorld的完整类型名如.?AVUWorld修饰名。即使没有你也可以通过分析其他游戏Mod或旧版本SDK来猜测。在内存中扫描类型信息使用调试器搜索这个类型名字符串。找到后附近通常就是该类的RTTI Complete Object Locator和虚函数表。扫描虚表引用有了虚表地址你可以在内存中扫描所有引用这个虚表地址的指针。这些指针很可能就是各个UWorld实例的vfptr虚表指针位于对象起始处。你需要结合其他信息例如检查该指针8偏移处是否有一个指向ULevel数组的指针来验证哪个是当前有效的、主要的UWorld。实操心得在实际操作中我很少只依赖单一方法。我的习惯是先用路径一GEngine快速尝试因为它通常最直接。如果失败比如字符串被混淆或剥离则转向路径三RTTI/虚表扫描并结合动态调试在游戏加载关卡时下断点观察哪些指针的值在变化从而辅助判断。多条路径相互印证能极大提高成功率。4. 攻克核心难点定位GObjectArray定位GObjectArray是UE4逆向中更具挑战性的一环因为它通常没有像GEngine那样明显的全局符号访问模式也更隐蔽。4.1 理解GObjectArray的结构首先要知道我们找的是什么。在常见的UE4版本中如4.18-4.27FUObjectArrayGObjectArray是其全局实例通常包含两个核心成员TUObjectArray* ObjObjects: 一个指向实际对象数组结构的指针。FUObjectArray::FUObjectArrayItem* PreAllocatedObjects: 预分配的对象池。我们最终的目标是找到ObjObjects它内部有一个TArrayUObject*存储着所有对象的指针。4.2 定位技巧从对象迭代代码入手引擎在很多地方需要遍历所有UObject例如垃圾回收GC、按名称查找对象、导出属性等。这些函数的代码里就藏着GObjectArray的访问方式。核心操作步骤寻找遍历循环的代码在IDA中搜索一些特征字符串的引用例如“ExecuteUbergraph”(蓝图相关)“StaticFindObject”(根据名称查找对象)或者直接搜索for循环中带有GUObjectArray或GetUObjectArray等文本如果字符串未被剥离。 如果没有字符串就搜索大循环的汇编模式特别是循环次数可能很大的那种。分析并提取特征码以StaticFindObject函数为例。它内部一定会调用GetUObjectArray()或直接访问GUObjectArray来获取数组然后遍历。查看其反汇编; 假设在某个版本中获取数组基址的代码是这样的 lea rcx, GUObjectArray ; 将GUObjectArray的地址加载到rcx mov rcx, [rcx] ; 解引用得到FUObjectArray结构体地址 mov rdx, [rcx10h] ; 假设ObjObjects在结构体偏移0x10处 mov r8, [rdx] ; 得到TUObjectArray内部数组的指针 mov r9d, [rdx8] ; 得到数组元素数量 ; 然后开始循环...我们需要提取的是lea rcx, GUObjectArray这条指令的特征。这条指令的字节码可能是48 8D 0D ?? ?? ?? ??。这就是我们的关键特征码。扫描与计算在游戏内存中扫描这个特征码。找到后该指令的后4个字节小端序就是GUObjectArray全局变量相对于下一条指令的偏移量。记下找到特征码的地址为A。该指令长度为7字节所以下一条指令地址是A 7。读取A 3处的4字节有符号整数记为offset。那么GUObjectArray的地址就是A 7 offset。 计算出的这个地址就是FUObjectArray全局实例在内存中的位置。验证与解析在调试器中跳转到计算出的地址。你应该能看到一个结构体。解引用这个地址读取其值可能得到另一个地址ObjObjects。尝试读取[地址0x10]处的值这是一个常见的偏移但并非绝对需要验证。验证方法读取这个疑似ObjObjects指针然后进一步解引用看看它是否指向一个看起来像数组指针第二个8字节是元素数量的结构。再尝试用这个数组访问几个低索引如012看看读出的指针是否指向有效的UObject对象起始的8字节是一个虚表指针并且附近可能有有意义的字符串如对象名。4.3 备用方案通过UObject基址反推如果你已经通过其他方式例如通过一个已知的AActor对象找到了一个有效的UObject实例并且知道它的IndexInArray对象在全局数组中的索引理论上可以反推数组基址。但这需要你知道引擎内部计算索引的算法难度较高通常作为验证手段而非首选定位方法。注意事项GObjectArray在不同UE4版本中结构可能有差异。上述的0x10偏移只是常见情况。在4.25的某些版本中结构可能更复杂。最可靠的方法是在找到疑似地址后通过遍历少量对象并调用引擎的GetName()或GetFullName()函数如果可能来验证对象的有效性确保你找到的不是错误的数据。5. 工具辅助与自动化脚本手动操作虽然能加深理解但效率低下。在实际工作中我们依赖工具和脚本。5.1 常用工具链静态分析IDA Pro 或 Ghidra。IDA的Hex-Rays反编译器对理解C伪代码帮助巨大。Ghidra免费且功能强大其脚本功能非常灵活。动态调试x64dbg 或 WinDbg。x64dbg更轻量插件生态好如ScyllaHide用于反反调试x64dbgpy用于Python脚本。WinDbg在分析复杂内存损坏时更强大。内存扫描Cheat Engine (CE)。它的“指针扫描”和“查找访问该地址的代码”功能极其有用可以快速定位哪些指令在读写某个特定地址是验证特征码和寻找访问路径的神器。自定义脚本使用Python配合frida、pykdWinDbg Python扩展或自己写的内存读写库可以自动化扫描、验证和提取数据。5.2 编写一个简单的特征码扫描脚本以Python使用pymem一个简单的Windows进程内存操作库为例演示如何自动化扫描GObjectArray的特征码import pymem import pymem.process import re def pattern_scan_all(handle, pattern, *, return_multipleFalse): 在进程的整个可执行模块内存中扫描特征码。 pattern: 字节串如 b\x48\x8D\x0D\x00\x00\x00\x00用\x00表示通配符。 next_region 0 found [] while next_region 0x7FFFFFFF0000: # 用户空间上限 mbi pymem.memory.virtual_query(handle, next_region) if mbi.State ! 0x1000: # MEM_COMMIT next_region mbi.RegionSize continue if not (mbi.Protect 0x20): # PAGE_EXECUTE_READ next_region mbi.RegionSize continue try: region_bytes pymem.memory.read_bytes(handle, next_region, mbi.RegionSize) except: next_region mbi.RegionSize continue # 将特征码转换为正则表达式 regex_pattern re.escape(pattern) regex_pattern regex_pattern.replace(r\x00, r.) regex re.compile(regex_pattern, re.DOTALL) for match in regex.finditer(region_bytes): addr next_region match.start() found.append(addr) if not return_multiple: break if found and not return_multiple: break next_region mbi.RegionSize return found def find_gobject_array(process_name): pm pymem.Pymem(process_name) # 假设的特征码lea rcx, [GUObjectArray] 对应的常见字节码 # 48 8D 0D ?? ?? ?? ?? pattern b\x48\x8D\x0D\x00\x00\x00\x00 addresses pattern_scan_all(pm.process_handle, pattern, return_multipleTrue) for addr in addresses: print(f[*] 找到特征码在: {hex(addr)}) # 读取偏移并计算GUObjectArray地址 offset_bytes pymem.memory.read_bytes(pm.process_handle, addr 3, 4) offset int.from_bytes(offset_bytes, byteorderlittle, signedTrue) guobject_array_addr addr 7 offset # 7是lea指令长度 print(f - 计算出的 GUObjectArray 地址: {hex(guobject_array_addr)}) # 尝试读取并解引用进行初步验证 try: guobject_array_value pymem.memory.read_longlong(pm.process_handle, guobject_array_addr) print(f - GUObjectArray 处的值: {hex(guobject_array_value)}) # 可以继续读取偏移0x10等位置进行更深验证... except Exception as e: print(f - 读取失败: {e}) print(- * 50) pm.close() if __name__ __main__: find_gobject_array(YourGame.exe)实操心得这个脚本只是一个起点。真实环境中你需要准备多个版本的特征码并加入更严格的验证逻辑。例如读取疑似ObjObjects后尝试遍历前10个条目检查它们是否是有效的可读内存地址并且地址附近是否有合理的虚表指针。自动化脚本的价值在于一旦写好对于同一引擎的不同游戏只需微调特征码即可快速适配。6. 版本适配与疑难问题排查游戏更新了你的定位方法失效了。别慌这是常态。以下是系统的排查思路。6.1 特征码失效后的排查流程确认失效点是字符串搜不到了还是特征码扫描不到结果或者是找到的地址解引用后数据看起来不合理回归基础分析字符串尝试搜索更泛的字符串如“Object”、“World”或者游戏特有的字符串如游戏名称、主菜单关卡名先找到任何可能的代码切入点。函数交叉引用如果你之前保存了旧版本中关键函数如StaticFindObject的地址尝试在新版本二进制文件的相同相对位置如入口点偏移固定RVA附近查看函数逻辑可能相似。重新分析访问模式用Cheat Engine附加游戏手动添加一个已知的UObject地址到地址列表然后“找出是什么访问了该地址”。CE会列出所有读写该地址的指令这直接给你展示了新版本中访问对象数组的代码位置这是动态分析中最强大的方法之一。更新特征码根据CE找到的新指令生成新的特征码。注意编译器优化可能导致指令顺序变化特征码可能需要更长或更灵活使用更多通配符。6.2 常见问题速查表问题现象可能原因排查思路与解决方案字符串搜索无结果游戏发行版剥离了字符串1. 尝试搜索部分字符串或宽字符形式。2. 转向RTTI类型名搜索如.?AVUWorld。3. 使用动态调试在游戏运行时字符串可能已在内存中解密此时再搜索。特征码扫描到多个结果特征码不够独特匹配了无关代码1. 加长特征码包含更多上下文指令。2. 对每个结果进行上下文验证查看该指令所在的函数是否像在操作对象数组如有循环、调用GetName等。3. 使用动态验证在调试器中在该指令下断点观察寄存器/内存值是否与对象操作相关。计算出的地址不可读/访问违规偏移计算错误或找到的是错误指令1. 复核偏移计算指令长度是否正确偏移是4字节还是8字节2. 检查特征码匹配的指令是否真的是lea或mov到全局变量。可能是其他类似操作码。3. 尝试读取该地址附近的内存看是否有其他有意义的数据结构。找到GObjectArray但遍历对象失败结构偏移已改变1. 在调试器中手动探索FUObjectArray结构从基址开始以8字节为单位查看内存寻找看起来像是指针数组的指针其指向的内存区域每隔8字节就是一个指针。2. 参考相近版本UE4开源代码或社区逆向成果推测新偏移。3. 使用“硬编码”偏移遍历但加入对象有效性检查如检查虚表指针是否在可执行模块内。游戏有反调试/反作弊调试器被检测进程崩溃1. 使用更强的隐藏工具如ScyllaHide插件配合x64dbg。2. 尝试在游戏启动完成后再附加调试器。3. 考虑使用无调试器方案通过DLL注入在游戏进程内部直接读取内存并输出到文件或网络。6.3 对抗代码混淆与保护一些强保护的游戏会进行代码虚拟化或混淆使得静态分析特征码几乎不可能。此时动态分析是唯一出路。硬件断点Hardware Breakpoint这是对付简单混淆的利器。在运行时对一个已知的UObject的虚函数表指针对象起始8字节设置硬件读断点。当游戏遍历对象数组访问到这个对象时必然会读取其虚表指针从而触发断点。断点触发时的调用堆栈会直接把你带到对象遍历的核心代码处。内存访问追踪类似CE的“找出访问”功能但可以更系统化。编写一个简单的pin工具或使用Intel PT处理器跟踪技术记录一段时间内所有访问特定内存范围的指令然后离线分析这些指令的模式。行为模式分析如果直接定位数据结构困难可以转而分析功能。比如你想找所有PlayerController。你可以先通过游戏内明显的行为如开枪、移动触发相关函数下断点回溯找到处理这些行为的PlayerController对象再顺藤摸瓜看这个对象是从哪个全局容器或管理器中获取的。定位UWorld和GObjectArray只是UE4逆向的起点但却是最坚实的一步。这套快速定位技巧的核心不在于死记硬背某个地址或偏移而在于建立一种系统性的分析思维理解引擎架构识别稳定模式善用动静态工具结合并准备好应对变化。当你能够熟练地在不同版本、不同保护程度的UE4游戏中快速找到这些“基石”时你就已经打开了深入分析游戏逻辑、实现高级功能的大门。剩下的就是沿着这些基石去构建你自己的理解了。

相关新闻

虚拟电厂微网调度:蒙特卡洛与随机优化实战解析

虚拟电厂微网调度:蒙特卡洛与随机优化实战解析

1. 项目背景与核心挑战虚拟电厂作为分布式能源聚合调度的新型模式,正在重塑电力系统的运行逻辑。这个项目直指虚拟电厂微网调度中最棘手的双重不确定性难题——既要应对电源侧(风电、光伏等)的出力波动,又要处理负荷侧的需求随机性…

2026/9/29 11:35:51 阅读更多 →
萍乡家电清洗值得做吗

萍乡家电清洗值得做吗

1. 家电清洗,真的只是“擦擦灰”吗?很多萍乡家庭觉得家电清洗就是表面擦一擦,花几十块买个清洗剂自己就能搞定。但真相是,空调、洗衣机、油烟机内部积累的细菌、霉菌和油垢,普通擦拭根本清不掉。一台使用三年的洗衣机&…

2026/10/5 13:36:01 阅读更多 →
深度学习中的数据结构优化与存储调度研究7

深度学习中的数据结构优化与存储调度研究7

引言深度学习模型规模与计算需求的快速增长数据结构优化与存储调度对模型性能的影响研究背景与意义数据结构优化在深度学习中的重要性常见数据结构(张量、稀疏矩阵、图结构)的存储需求数据结构对计算效率的影响(内存访问、计算并行性&#xf…

2026/10/10 12:48:54 阅读更多 →

最新新闻

Kanidm OAuth2 Refresh Token 设计解析:NIB 机制、重放检测与复制一致性

Kanidm OAuth2 Refresh Token 设计解析:NIB 机制、重放检测与复制一致性

后端认证鉴权安全 【免费下载链接】kanidm Kanidm: A simple, secure, and fast identity management platform 项目地址: https://gitcode.com/gh_mirrors/ka/kanidm 点击查看 免费下载 本文围绕 Kanidm 身份管理平台中 OAuth2 刷新令牌(refresh token…

2026/10/12 20:08:22 阅读更多 →
Cats Free Monad 实战指南:用嵌入式 DSL 构建可组合、可重定向的纯函数式程序

Cats Free Monad 实战指南:用嵌入式 DSL 构建可组合、可重定向的纯函数式程序

后端 【免费下载链接】cats Lightweight, modular, and extensible library for functional programming. 项目地址: https://gitcode.com/gh_mirrors/ca/cats 点击查看 免费下载 本文是 Cats 函数式编程库中 cats-free 模块的完整技术指南。自由单子(F…

2026/10/12 20:08:21 阅读更多 →
可靠性数据统计方法与R语言实战:从配套数据集到Weibull建模

可靠性数据统计方法与R语言实战:从配套数据集到Weibull建模

简介:《Statistical Methods for Reliability Data》配套数据集面向可靠性建模学习者和从业者,是这本经典著作的实操补充。包内围绕寿命分布、生存分析、故障率函数、可靠性增长、多组件系统可靠性、寿命试验设计与统计推断等核心知识点,提供…

2026/10/12 20:07:21 阅读更多 →
AI编程agent失控?用最小规格驱动工作流守住代码边界

AI编程agent失控?用最小规格驱动工作流守住代码边界

我本来是想抄作业的。Spec Kit、OpenSpec、Superpowers 这三个名字,我在搜索框里来回扫了不止一遍。原因很简单:最近一段时间的 AI 编程 agent 越来越难控制,改一个登录模块,它能顺手把我另一个文件的变量名也改了;说好…

2026/10/12 20:07:21 阅读更多 →
自建技术博客的完整实践:从静态站点生成到命令行发布

自建技术博客的完整实践:从静态站点生成到命令行发布

1. 起点:为什么要自建博客,而不是继续躺在平台里我相信每个写过一段时间技术博客的人,都会在某一天产生一个念头:我写的内容到底属于谁?这个念头在我身上盘旋了很久。平台给流量、给推荐、给了现成的排版和读者&#x…

2026/10/12 20:07:21 阅读更多 →
开放代码评审实践:从零搭建轻量级评审工具与流程

开放代码评审实践:从零搭建轻量级评审工具与流程

1. 为什么“代码评审”这件事值得单独拿出来做一套工具代码评审(Code Review)是研发流程里最容易被口号化、也最容易被敷衍的一环。几乎每个团队都声称自己在做评审,但真正落到日常,往往是三种状态:要么是“橡皮图章式…

2026/10/12 20:07:21 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战: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/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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 阅读更多 →