易语言EIP注入实战:永久劫持与稳定性优化
1. 从零理解EIP注入到底在做什么1.1 为什么有人会盯上EIP这个寄存器聊EIP注入之前得先把EIP是什么说清楚。EIP全称是Extended Instruction Pointer在32位x86架构里它永远指向CPU下一条要执行的指令地址。你可以把它想象成一条流水线上的工头工头走到哪工人就干到哪。谁控制了EIP谁就控制了整个程序的执行流向。这也是为什么EIP注入在逆向工程、安全研究、软件调试领域一直是个绕不开的话题。正常程序运行时EIP按照代码段里预设的逻辑一步步走但如果我们能在某个时机把EIP改成我们想要的地址程序就会跳转到我们指定的地方去执行。这个指定的地方可以是一段我们自己写的代码也可以是系统API的入口。那永久注入又是什么意思普通的EIP劫持往往是一次性的比如你改了一次EIP程序执行完你的代码后还得想办法回到原来的流程否则程序就崩了。而永久注入的思路是让这种劫持持续生效每次程序执行到某个关键节点时都能自动跳到我们的代码里形成一个稳定的、可反复触发的注入通道。1.2 易语言在这个场景里的角色定位易语言作为一门中文编程语言它的优势在于上手门槛低、语法直观很多做辅助工具、自动化脚本的开发者喜欢用它。但易语言编译出来的程序有个特点它的运行时环境比较重很多底层操作需要依赖易语言自己的支持库。这就导致在做EIP注入这类底层操作时不能像C/C那样直接内联汇编或者用指针随便操作内存。不过易语言提供了几个关键能力来弥补这个短板。一是它可以通过API声明调用Windows的底层函数比如VirtualProtect、WriteProcessMemory、ReadProcessMemory这些二是它支持调用汇编代码片段虽然不如C那么灵活但足够完成基本的寄存器操作三是它的内存操作函数可以配合指针类型使用实现对目标进程内存的读写。我见过不少人觉得易语言做不了底层的东西其实这是个误解。关键在于你愿不愿意花时间去理解Windows的内存管理机制和进程间通信原理。一旦理解了易语言照样能写出稳定的注入工具。1.3 永久注入和一次性注入的本质区别这里有必要把两种注入方式掰开来讲清楚因为很多人一开始就搞混了。一次性注入的逻辑很简单找到目标进程分配一块内存写入你的代码然后修改某个函数的入口地址或者某个跳转指令让程序执行一次你的代码。执行完之后你的代码负责把原始指令恢复回去程序继续正常跑。这种方式的好处是简单直接坏处是只能触发一次而且如果恢复过程出了问题程序直接就崩了。永久注入则不同。它的核心思路是在目标进程里建立一个持久的跳转机制。常见做法是修改某个会被频繁调用的函数入口把前几个字节改成跳转指令跳到我们的代码区域。我们的代码执行完自己的逻辑后再跳回原函数继续执行。这样每次这个函数被调用我们的代码都会被执行一次形成永久的效果。注意永久注入的关键不在于永久这个词有多玄乎而在于你的跳转逻辑必须保证原始函数的完整性。一旦原始指令被破坏且没有正确恢复目标程序就会在下次调用时崩溃。1.4 适合哪些人参考这套思路这套东西不是给完全零基础的人看的。如果你连进程、线程、内存地址这些概念都还没搞清楚建议先去补一下Windows操作系统的基础知识。但如果你已经写过一些易语言程序了解基本的API调用方式并且对逆向工程或者软件调试有兴趣那这套思路是可以直接参考的。另外要说明的是这里讨论的所有内容都仅限于技术研究和学习目的。在实际工作中任何对他人软件进行未授权修改的行为都是不合规的这一点必须明确。2. 核心原理拆解EIP是怎么被控制的2.1 函数调用过程中EIP的变化规律要理解EIP注入首先得知道在正常的函数调用过程中EIP是怎么变化的。当你调用一个函数时CPU会执行一条CALL指令这条指令做了两件事把当前EIP的下一条指令地址压入栈中作为返回地址然后把EIP设置为目标函数的入口地址。函数执行完毕后会执行RET指令这条指令从栈顶弹出之前保存的返回地址赋值给EIP于是程序就回到了调用点继续执行。整个过程EIP的跳转是有规律的、可预测的。那注入的思路就来了如果我们能在函数入口处修改EIP的指向让它先跳到我们的代码我们的代码执行完后再手动模拟RET的行为回到原始流程就实现了劫持。关键在于这个修改必须是稳定的不能因为多次调用就出错。2.2 修改函数入口的几种常见方式实际操作中修改函数入口主要有这么几种方式第一种是Inline Hook也叫内联钩子。直接在目标函数的前几个字节写入一条JMP指令跳到我们的代码区域。这种方式最直接但需要处理指令长度对齐的问题。x86架构里一条JMP指令占5个字节1字节操作码4字节地址所以你得确保覆盖的原始指令总长度至少是5字节多出来的部分要用NOP填充。第二种是IAT Hook通过修改导入地址表来实现。每个PE文件都有一个导入表记录了它调用了哪些外部函数以及这些函数的地址。如果你把导入表里某个函数的地址改成你自己的函数地址那程序调用这个函数时就会走到你这里来。这种方式不需要修改代码段相对安全但只能钩住通过导入表调用的函数。第三种是EAT Hook修改导出地址表。这种方式通常用于钩住DLL导出的函数原理和IAT Hook类似只是作用的对象不同。第四种是异常处理Hook通过修改异常处理链或者设置硬件断点来触发。这种方式比较隐蔽但实现复杂度也最高。在易语言环境下Inline Hook是最常用的因为易语言对内存的读写操作比较直接不需要太多额外的依赖。2.3 为什么永久需要额外的保护机制前面说了永久注入的核心是让跳转持续生效。但这里有个问题如果我们的代码执行过程中出现了异常或者跳转逻辑被其他因素干扰整个注入就会失效甚至导致目标程序崩溃。所以永久注入需要额外的保护机制。常见的做法包括校验机制每次执行前检查目标地址的字节是否还是我们写入的跳转指令如果不是就重新写入。这可以防止其他程序或者系统机制把我们的修改覆盖掉。异常捕获在我们的代码区域加上异常处理一旦出现访问违规或者其他异常能够安全地跳回原始流程。多重点备份在多个位置建立跳转点即使某一个被破坏了其他的还能继续工作。这些机制在易语言里实现起来需要一些技巧后面会详细讲。2.4 内存权限与写入可行性分析在Windows系统里每个进程的内存页都有权限属性。代码段通常是可执行但不可写的数据段是可读写但不可执行的。你要往代码段里写跳转指令首先得把那个内存页的权限改成可读写可执行。这就用到了VirtualProtect这个API。它的作用是修改指定内存区域的保护属性。典型用法是先把目标地址所在页的权限改成PAGE_EXECUTE_READWRITE写入我们的指令然后再改回原来的权限。如果不改回去虽然功能上没问题但会增加被检测到的风险。这里有个细节需要注意VirtualProtect修改的是整个内存页的权限一页通常是4096字节。如果你要修改的地址跨越了两个页就需要分别处理。另外修改权限后记得检查返回值确保操作成功。3. 易语言环境下的实操准备3.1 必要的API声明与类型定义在易语言里做EIP注入第一步是把需要的Windows API声明好。这些API包括OpenProcess打开目标进程获取进程句柄VirtualProtectEx修改目标进程内存页的权限WriteProcessMemory向目标进程写入数据ReadProcessMemory从目标进程读取数据VirtualAllocEx在目标进程里分配内存CreateRemoteThread在目标进程里创建远程线程用于执行初始化代码在易语言里声明这些API需要用DLL命令的方式指定库文件名称为kernel32.dll然后按照Windows API的标准参数类型来定义。比如OpenProcess的声明大概是这样的.版本 2 .DLL命令 OpenProcess, 整数型, kernel32.dll, OpenProcess .参数 dwDesiredAccess, 整数型 .参数 bInheritHandle, 逻辑型 .参数 dwProcessId, 整数型这里dwDesiredAccess通常填PROCESS_ALL_ACCESS0x1F0FFF表示请求所有权限。不过在实际操作中为了降低被拦截的概率可以只请求必要的权限比如PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_VM_READ。3.2 目标进程的定位与句柄获取获取目标进程句柄有两种常见方式一种是通过进程ID一种是通过进程名遍历。在易语言里遍历进程通常用CreateToolhelp32Snapshot配合Process32First和Process32Next来实现。具体流程是先调用CreateToolhelp32Snapshot创建一个进程快照然后循环调用Process32Next遍历快照里的每一个进程对比进程名是否匹配。匹配到了就取出进程ID再用OpenProcess打开。这里有个坑有些进程需要管理员权限才能打开如果你的易语言程序不是以管理员身份运行的OpenProcess会返回0。解决办法是在程序清单里声明需要管理员权限或者手动右键以管理员身份运行。提示在调试阶段建议先用任务管理器确认目标进程的PID然后直接用PID打开避免遍历过程带来的干扰。等逻辑稳定后再改成自动遍历。3.3 内存分配与代码写入的完整流程在目标进程里分配内存用VirtualAllocEx它的参数包括进程句柄、期望的起始地址通常填0让系统自动选择、分配大小、分配类型MEM_COMMIT | MEM_RESERVE和内存保护属性PAGE_EXECUTE_READWRITE。分配成功后会返回分配到的内存地址。这个地址就是我们在目标进程里的根据地后面写入的跳转指令和我们的代码都放在这里。写入代码用WriteProcessMemory参数是进程句柄、目标地址、要写入的数据缓冲区、数据长度和一个输出参数返回实际写入的字节数。写入前记得先用VirtualProtectEx把目标地址的权限改成可写写入后再改回去。整个流程串起来就是打开进程 → 分配内存 → 修改权限 → 写入代码 → 恢复权限 → 修改目标函数入口 → 完成注入。3.4 汇编代码片段的编写与转换易语言本身不直接支持内联汇编但可以通过几种方式来实现汇编级别的操作。一种是把汇编代码编译成机器码然后作为字节数组写入目标进程。另一种是调用外部汇编器生成的二进制代码。对于简单的跳转和寄存器操作手动构造机器码是可行的。比如一条JMP指令的机器码是E9加上4字节的相对偏移。相对偏移的计算方式是目标地址减去当前指令的下一条指令地址。举个例子假设我们要在地址0x00401000处写入跳转到0x00402000的指令。JMP指令占5字节所以下一条指令地址是0x00401005。相对偏移 0x00402000 - 0x00401005 0xFFB。所以写入的字节序列是E9 0B 0F 00 00。对于更复杂的逻辑比如需要保存和恢复寄存器、调用API等手动构造机器码就太麻烦了。这时候可以用汇编器先生成二进制代码然后在易语言里作为常量数据写入。4. 永久注入的完整实现步骤4.1 第一步建立安全的跳转通道跳转通道的建立是整个过程的基础。我的做法是在目标进程里分配两块内存一块用来存放跳转指令称为跳板一块用来存放我们的处理代码称为处理区。跳板的作用是接收来自目标函数的跳转然后二次跳转到处理区。为什么要多这一层因为目标函数入口的跳转指令覆盖的字节数有限通常只有5字节放不下太多逻辑。通过跳板中转处理区可以放在任意位置不受距离限制。跳板的机器码很简单E9 4字节偏移指向处理区。处理区的代码则根据你的需求来写可以是一段调用API的代码也可以是一段修改内存的代码。4.2 第二步处理区的代码结构与返回逻辑处理区的代码需要完成三件事执行自定义逻辑、恢复被覆盖的原始指令、跳回原始流程。恢复原始指令这一步很关键。因为我们在目标函数入口覆盖了5字节的指令这5字节可能是半条指令或者几条指令的一部分。如果不恢复就跳回去程序执行的就是被破坏的指令必然崩溃。所以处理区的标准结构是保存所有寄存器的值PUSHAD执行自定义逻辑恢复所有寄存器的值POPAD执行被覆盖的原始指令跳回目标函数被覆盖指令之后的位置第4步的原始指令需要你在注入前先读取目标函数入口的字节分析出被覆盖的完整指令是什么然后在处理区里用等效的指令替代。4.3 第三步写入跳转指令并验证一切准备就绪后就可以写入跳转指令了。用VirtualProtectEx把目标函数入口的权限改成可写然后用WriteProcessMemory写入E9加偏移的5字节最后恢复权限。写入完成后建议先读取回来验证一下确保字节确实写进去了。验证的方式是用ReadProcessMemory读取那5字节和你写入的对比。如果一致说明写入成功。这时候如果目标函数被调用EIP就会跳到我们的处理区。处理区执行完后再跳回去。整个过程对目标程序来说是透明的它不会察觉到自己的执行流程被劫持了。4.4 第四步持久化与异常恢复机制永久注入的永久体现在两个方面一是跳转指令不会被轻易覆盖二是即使被覆盖了也能自动恢复。实现持久化的常见做法是开一个监控线程定期检查目标函数入口的字节是否还是我们的跳转指令。如果不是就重新写入。这个监控线程可以用易语言的线程功能来实现间隔设置成几百毫秒就够了太频繁会浪费CPU太慢又可能导致注入失效的时间窗口过长。异常恢复则需要在处理区里加上异常处理逻辑。在Windows里可以通过SetUnhandledExceptionFilter或者向量化异常处理VEH来捕获异常。一旦处理区里的代码出现异常异常处理函数负责把EIP设置回原始流程保证目标程序不会崩溃。5. 常见问题与排查技巧实录5.1 注入后目标程序立即崩溃的排查思路这是最常见的问题原因通常有这么几个指令对齐问题。你覆盖的5字节可能刚好把一条指令切成了两半。比如原始指令是一条6字节的指令你覆盖了前5字节剩下的1字节就成了无效指令。解决办法是先用反汇编器分析目标函数入口的指令长度确保覆盖的字节数正好是完整指令的边界。偏移计算错误。JMP指令的偏移是相对于下一条指令的地址不是相对于当前指令的地址。很多人在这里算错导致跳转到了错误的位置。建议写个小工具自动计算偏移避免手工计算出错。权限问题。如果VirtualProtectEx失败了写入操作就会失败但你可能没有检查返回值以为写入成功了。结果目标函数入口还是原始指令但你的处理区代码已经生效了两边对不上就崩了。寄存器未保存。如果你的处理区代码修改了寄存器但没有保存和恢复目标函数后续执行时就会用到被污染的值导致不可预期的行为。5.2 跳转后无法返回原始流程的解决方案有时候跳转过去了但回不来。原因可能是返回地址计算错误。跳回时应该跳到被覆盖指令的下一条指令地址而不是目标函数入口。栈不平衡。如果你的处理区代码有PUSH操作但没有对应的POP栈指针就会偏移RET指令弹出的返回地址就是错的。原始指令恢复不完整。如果被覆盖的指令不止一条你只恢复了第一条后面的指令就丢了。排查的时候可以用调试器附加到目标进程在处理区入口和出口分别下断点观察EIP和ESP的变化。如果ESP在进入和离开处理区时不一致那就是栈不平衡的问题。5.3 多线程环境下的竞态问题如果目标程序是多线程的而你的跳转点又恰好是多个线程都会调用的函数就会出现竞态问题。比如线程A正在执行处理区代码线程B也跳进来了两个线程同时操作同一块内存数据就乱了。解决办法是在处理区入口加锁。可以用InterlockedExchange或者临界区来实现。不过加锁会带来性能开销如果目标函数调用非常频繁可能会影响程序性能。这时候可以考虑用线程局部存储TLS来隔离不同线程的数据。5.4 常见问题速查表问题现象可能原因排查方法解决方案注入后程序立即崩溃指令对齐错误用反汇编器检查指令边界调整覆盖字节数确保完整指令跳转后无法返回返回地址计算错误调试器观察EIP变化重新计算返回地址注入一段时间后失效跳转指令被覆盖定期读取目标地址字节加监控线程自动恢复多线程下数据混乱竞态条件观察多线程调用时序加锁或使用TLS写入失败但无报错权限未修改检查VirtualProtectEx返回值确保权限修改成功后再写入目标进程打不开权限不足检查OpenProcess返回值以管理员身份运行提示排查问题时建议先用一个自己写的测试程序作为目标确认整个流程没问题后再应用到实际目标上。这样可以把问题范围缩小避免同时排查多个变量。6. 稳定性优化与长期维护经验6.1 如何降低被检测的风险从技术研究的角度来说了解检测机制有助于更好地理解系统原理。常见的检测手段包括内存扫描定期扫描代码段检查是否有异常的跳转指令。应对方式是让跳转指令看起来更自然比如把跳转指令放在不容易被扫描到的位置或者用条件跳转替代无条件跳转。校验和检查计算代码段的校验和和原始值对比。应对方式是在校验发生前恢复原始指令校验完后再重新写入。不过这需要精确掌握校验的时机。执行流监控通过硬件断点或者性能计数器监控EIP的异常跳转。这种检测比较难绕过因为它是硬件级别的。需要强调的是这些知识的用途应该仅限于安全研究和系统学习。在实际工作中任何绕过安全机制的行为都是不合规的。6.2 性能开销的控制与优化永久注入会带来一定的性能开销主要体现在两个方面一是跳转指令本身的执行开销二是处理区代码的执行开销。跳转指令的开销很小一条JMP指令的执行时间可以忽略不计。真正影响性能的是处理区代码。如果你的处理区里做了大量计算或者频繁调用API那目标函数的每次调用都会变慢。优化的思路是处理区里只做最必要的操作把复杂的逻辑放到异步线程里去执行。比如你需要在目标函数被调用时记录一些信息处理区里只负责把信息写入一个缓冲区实际的写文件或者网络发送操作交给另一个线程去做。另外监控线程的检查间隔也要合理设置。间隔太短会浪费CPU太长又可能导致注入失效的时间窗口过长。根据我的经验500毫秒到1秒的间隔在大多数场景下是比较合适的。6.3 版本更新后的适配策略目标程序更新后函数地址和指令内容都可能发生变化你的注入代码就需要重新适配。适配的流程是用调试器或者反汇编器重新分析目标函数找到新的入口地址和指令内容。更新你的偏移量和原始指令备份。重新测试注入流程确保跳转和返回都正常。为了减少适配工作量建议把目标函数的定位逻辑做成基于特征码的而不是基于固定地址的。特征码是一段唯一的字节序列通过搜索特征码来定位函数即使版本更新导致地址变化只要特征码还在就能找到。6.4 我个人在实际操作中的几点体会做了这么多次注入相关的实验有几个体会比较深第一测试环境一定要隔离。不要在你日常工作的机器上做这类实验万一出了问题可能影响其他工作。建议用虚拟机或者独立的测试机。第二备份原始数据。在修改任何内存之前先把原始字节读出来保存好。这样即使出了问题也能快速恢复。第三小步验证。不要一次性把所有逻辑都写完再测试而是每完成一个步骤就验证一下。比如先验证进程能打开再验证内存能分配再验证代码能写入最后才验证跳转能生效。这样出问题时能快速定位到是哪一步出了问题。第四日志要详细。每个关键操作都记录日志包括操作的地址、写入的字节、返回值等。出问题时这些日志就是最好的排查依据。第五不要贪多。一次只做一个跳转点确认稳定后再考虑增加更多的跳转点。多个跳转点之间的相互影响会让问题变得非常复杂。这套东西说到底就是对一个核心问题的不断深入如何在不破坏原有流程的前提下插入自己的逻辑。理解了这一点剩下的都是工程上的细节问题。而工程上的细节往往才是真正决定成败的地方。

相关新闻

CTF密码学从入门到实战:编码识别、古典密码与现代密码攻击全解析

CTF密码学从入门到实战:编码识别、古典密码与现代密码攻击全解析

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

2026/10/14 1:35:09 阅读更多 →
易语言大漠多线程启动模板:架构设计与踩坑实战

易语言大漠多线程启动模板:架构设计与踩坑实战

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

2026/10/14 1:35:09 阅读更多 →
C66x多核DSP硬件设计实战:架构、电源与调试

C66x多核DSP硬件设计实战:架构、电源与调试

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

2026/10/14 1:35:09 阅读更多 →

最新新闻

风电水电联合调度优化算法与工程实践

风电水电联合调度优化算法与工程实践

1. 项目背景与核心价值去年参与某省级电网清洁能源消纳项目时,我第一次接触到风-水联合调度这个课题。当时面对风电出力的强随机性和水电调节的滞后性,团队在制定优化运行方案时遇到了不少挑战。这个经历让我深刻认识到:在双碳目标下&#xf…

2026/10/14 2:21:24 阅读更多 →
从PowerDesigner迁移到PDMan:开源数据库建模与Git版本管理实践

从PowerDesigner迁移到PDMan:开源数据库建模与Git版本管理实践

1. 为什么我最终把数据库建模从商业软件迁到了PDMan做后端开发时间长了,数据库建模这件事几乎绕不开。早些年团队里清一色用PowerDesigner,画物理模型、生成DDL、导出字段文档,一套流程走下来确实顺手。但问题也很明显:正版授权费…

2026/10/14 2:21:24 阅读更多 →
微信小程序仿智行火车票开发实战:云开发+数据离线化方案

微信小程序仿智行火车票开发实战:云开发+数据离线化方案

简介:本资源是一套完整的微信小程序仿智行火车票12306系统实战项目,面向Java后端与小程序前端初学者及全栈学习者,聚焦铁路订票核心业务场景,涵盖用户查询、车次管理、订单生成等全流程功能实现。项目采用SSM(SpringSp…

2026/10/14 2:21:23 阅读更多 →
RTMP Flash播放插件替代方案:flv.js迁移实战与参数调优

RTMP Flash播放插件替代方案:flv.js迁移实战与参数调优

简介:这份资源是面向需要在网页中播放RTMP流媒体的开发者与运维人员的一套Flash播放插件实现方案,核心解决旧系统或特定场景下通过Flash技术播放RTMP直播、点播流的问题。压缩包共5个文件,约1.15MB,包含2个swf播放器与安装检测组件…

2026/10/14 2:21:23 阅读更多 →
AI编程助手代码质量救星:TypeScript静态类型约束实战

AI编程助手代码质量救星:TypeScript静态类型约束实战

AI 编程助手越帮越乱,这个话题我最近真的是感同身受。我们团队接入 AI 编程助手之后,合并请求里的代码量倒是上去了,可编译期错误非但没减少,反而冒出来一批"语法完全合法、类型对不上、一跑就崩"的代码。后来大家坐下来…

2026/10/14 2:21:23 阅读更多 →
LaTeX 2025环境配置:texlive + TeXstudio

LaTeX 2025环境配置:texlive + TeXstudio

文章目录Latex2025环境配置一、LaTeX 简介1.1 什么是 LaTeX?1.2 为什么使用 LaTeX?1.3 如何开始使用 LaTeX?二、texlive下载安装2.1 texlive下载2.2 texlive安装2.3 常见问题2.3.1 用管理员权限打开install-tl-windows.bat 报错2.3.2 Latex安…

2026/10/14 2:20:23 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/13 16:22:04 阅读更多 →
影刀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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →