进程空洞化与无进程C2:Outis框架的隐蔽渗透测试实战解析

news2026/4/30 15:47:47
1. 项目概述一个被低估的渗透测试利器如果你在渗透测试或者红队评估领域摸爬滚打了一段时间肯定对“命令与控制”C2框架不陌生。从大名鼎鼎的Cobalt Strike、Metasploit到后起之秀Sliver、Havoc这些工具是红队工程师的“瑞士军刀”。但今天要聊的是一个相对小众但设计理念非常独特的项目——SySS-Research/outis。我第一次接触它是在一次需要高度隐蔽、对抗行为检测的模拟攻击任务中传统C2的流量特征和内存行为很容易被现代EDR端点检测与响应系统捕捉而Outis的“无进程”理念让我眼前一亮。简单来说Outis不是一个传统的、会创建独立进程的C2植入物。它的核心思想是“寄生”与“隐身”通过一种称为“进程空洞化”Process Hollowing或“傀儡进程”的技术将恶意代码注入到一个合法的、正在运行的系统进程如svchost.exe,explorer.exe的内存空间中执行。从操作系统的进程管理器来看你只能看到一个完全正常的系统进程而恶意代码就像幽灵一样寄生在其中没有独立的进程映像因此规避了许多基于进程创建、父子关系、命令行参数等行为的检测。对于需要长时间驻留、进行深度侦察或横向移动的红队行动来说这种“低调”的特性极具价值。这个项目适合有一定基础的渗透测试人员、红队成员以及安全研究人员。如果你刚入门可能更需要先掌握基础的C2使用和免杀概念但如果你已经对常规工具得心应手开始头疼于如何绕过更先进的防御那么深入研究Outis的设计哲学和实现细节会为你打开一扇新的大门。它不仅是一个工具更是一种绕过检测的思路体现。2. 核心设计理念与技术架构拆解2.1 “无进程”植入物的核心优势与挑战为什么“无进程”如此吸引人这得从现代终端安全的检测逻辑说起。传统的AV/EDR会监控一系列可疑行为一个未知的、从临时目录启动的PE文件进程创建链异常例如由Office文档发起的powershell.exe再启动cmd.exe进程内存空间中出现明显的恶意代码特征如Meterpreter的反射DLL加载特征。Outis的设计目标就是尽可能减少这些“告警点”。它的核心优势在于进程隐身恶意负载不创建新进程而是运行在受信任的系统进程内。这直接规避了基于新进程创建、进程树分析和可疑映像路径的检测。内存隐蔽通过将代码注入到合法进程的某个内存区域并修改内存保护属性为可执行恶意代码与合法代码混合。除非进行精细的内存内容扫描或行为监控否则难以发现。上下文伪装恶意代码继承了宿主进程的安全令牌、网络连接上下文和文件句柄。这使得它的网络活动看起来像是系统进程发起的更容易通过防火墙策略也降低了网络流量分析的威胁评分。然而实现这种“幽灵”式植入面临巨大挑战稳定性注入的代码不能干扰宿主进程的正常功能否则会导致进程崩溃暴露自身。持久性宿主进程可能被用户或系统重启。需要一种机制在宿主进程终止后能自动寻找并注入到新的实例中。通信隐蔽C2通信通道必须足够隐蔽不能因为频繁的、特征明显的网络连接而暴露。对抗内存扫描高级EDR具备定期扫描进程内存的能力。注入的代码需要对抗静态特征扫描和动态行为钩子Hook。Outis的架构正是围绕解决这些挑战而构建的。2.2 Outis的组件交互与工作流程Outis通常包含几个关键组件理解它们的交互是掌握其用法的前提。请注意不同版本或分支的实现可能略有差异但核心思想一致。植入物生成器Payload Generator这是操作者的起点。你提供一个要注入的合法进程列表例如explorer.exe, svchost.exe, msiexec.exe和C2服务器的配置IP、端口、通信协议。生成器会编译或组装出一个高度定制化的Shellcode或DLL。这个负载不包含完整的PE头而是专注于实现注入逻辑、通信模块和任务分发功能。投放器Dropper/Loader这是将植入物送入目标系统的“快递员”。它可能是一个经过混淆和签名的可执行文件也可能被嵌入到文档宏、脚本或利用链中。投放器的唯一职责是以某种方式例如利用一个漏洞或通过社会工程学诱导用户执行将核心的植入物代码写入内存并启动注入流程。注入引擎Injection Engine这是Outis的“魔法核心”。它通常实现以下步骤进程枚举与选择枚举当前运行进程从预设列表中选取一个合适的、活跃的宿主进程。选择策略可能包括进程的CPU/内存使用率选择繁忙进程以隐藏自身活动、进程权限级别、是否在用户会话中等。内存操作在目标进程中分配一块具有“读、写、执行”RWX权限的内存区域。这是一个敏感操作可能触发监控。高级实现会使用更隐蔽的方法例如利用合法的内存API如VirtualAllocEx然后分步修改权限或者利用进程内已有的可写可执行内存区域如.NET JIT编译产生的区域。代码写入与执行将植入物Shellcode写入分配的内存然后通过CreateRemoteThread、QueueUserAPC或更隐蔽的线程劫持技术在目标进程中创建一个远程线程来执行这段Shellcode。C2通信模块一旦植入物在目标进程内“活”过来它会建立与C2服务器的通信。Outis可能支持多种协议如HTTP/S、DNS、SMB甚至自定义的加密协议。通信内容通常被高度混淆和加密并模仿正常软件更新的流量模式。任务执行环境植入物内部包含一个轻量级的任务解释器。它接收来自C2的指令如执行命令、上传文件、下载模块并在宿主进程的上下文中执行。执行结果通过通信模块回传。整个工作流程就像一个精密的特工行动投放器特工潜入目标区域系统将关键设备植入物安置在一个公共建筑系统进程的隐蔽角落然后特工撤离。设备自动启动伪装成建筑内的正常设备与总部C2通信并执行总部下达的隐秘任务。3. 实战部署与关键配置解析纸上谈兵终觉浅我们来具体看看如何将一个Outis类的“无进程”C2部署起来。这里我会基于这类工具的一般使用模式进行阐述并穿插关键配置的考量。3.1 环境准备与工具链选择首先你需要一个可控的测试环境。强烈建议在隔离的虚拟机或专用的红队实验室中进行例如使用VMware或VirtualBox搭建的Windows靶机。靶机最好安装有基础的防病毒软件或开启Windows Defender以测试绕过效果。对于工具链Outis项目本身可能提供编译好的生成器也可能需要你从源码构建。通常需要以下环境攻击机Linux推荐Kali Linux或任何你熟悉的Linux发行版安装有GCC/MinGW用于交叉编译Windows负载、Python用于辅助脚本和Git。构建依赖你需要安装必要的编译工具链。对于Windows负载通常使用x86_64-w64-mingw32-gcc进行交叉编译。在Kali上可以通过apt install mingw-w64来安装。C2服务器你需要一台拥有公网IP或内网可达的服务器来运行C2服务端。这台服务器需要配置好对应的监听端口。Outis的服务端可能是一个Go、Python或C编写的程序。一个常见的误区是认为“无进程”植入物就不需要免杀。实际上投放器Dropper和生成的Shellcode本身仍然可能被静态扫描检测。因此在构建前考虑对Shellcode进行编码如XOR、AES、混淆或分块是必要的步骤。3.2 植入物生成与定制化策略生成植入物是核心步骤。假设你克隆了Outis的代码库通常会找到一个用于生成的脚本或配置文件。关键配置参数解析宿主进程列表-p explorer.exe,svchost.exe:netsvcs选择原则优先选择用户会话中持久存在的进程如explorer.exe或者系统服务进程如svchost.exe。避免选择会频繁结束的进程如浏览器。svchost.exe的特殊性svchost通常以分组形式运行多个服务。指定svchost.exe:netsvcs可以尝试注入到承载网络服务的那个实例中其网络活动更不显眼。备用列表提供一个按优先级排序的列表。植入物会按顺序尝试注入直到成功。C2通信配置-h c2.mydomain.com -p 443 -s https协议选择HTTPS (443端口) 是最佳选择之一因为其流量与正常网页浏览混杂且TLS加密可以掩盖通信内容。确保你的C2服务器配置了有效的TLS证书可以是自签名但最好使用Let‘s Encrypt等免费证书减少异常告警。域名与IP使用域名而非直接IP便于未来更换服务器IP。域名最好前置在CDN如Cloudflare后面可以隐藏真实服务器IP并提供一定的抗DDoS能力。通信间隔与抖动Jitter设置心跳间隔如60秒并添加随机抖动如±20%。固定的心跳间隔是C2流量的明显特征。抖动使其更像人类或正常客户端的活动。注入技术选择-t apcCreateRemoteThread最经典但也最容易被检测。许多EDR会钩住Hook这个API。QueueUserAPC异步过程调用可以将代码注入到目标进程的某个线程的APC队列中当线程进入可报警状态时执行。相对更隐蔽。线程劫持Thread Hijacking挂起目标进程的一个现有线程修改其上下文如EIP/RIP寄存器指向我们的Shellcode然后恢复线程。这是最高级也最复杂的方法痕迹最小。早期鸟Early BirdAPC在进程创建早期主线程开始执行前通过APC注入。这需要与进程创建操作结合。在生成命令中可能看起来像这样示例./outis-generator -p explorer.exe,svchost.exe -h secure-cdn.com -p 443 -s https -t apc -o payload.bin这条命令会生成一个名为payload.bin的Shellcode文件它被设计为注入explorer.exe或svchost.exe通过HTTPS与secure-cdn.com:443通信并使用APC注入技术。注意生成的payload.bin是纯二进制Shellcode不能直接双击运行。你需要一个加载器Loader来将它送入内存并执行注入逻辑。Outis项目有时会提供一个示例加载器或者你需要自己编写一个简单的加载器例如用C语言编写一个读取文件并调用注入函数的小程序。3.3 投放器Loader的编写与免杀处理加载器是你需要投放到目标系统的可执行文件。它的代码非常直接从资源区、网络或自身解密出payload.binShellcode。执行上述选择的注入技术如APC注入将Shellcode写入目标进程并执行。免杀处理是关键代码混淆对加载器代码进行混淆避免简单的字符串和API特征扫描。加壳/保护使用商业或开源的加壳工具如VMProtect, Themida的商业版本或开源的UPX对加载器进行加壳。但要注意UPX等简单加壳已被广泛识别需要配合其他手段。签名如果能获取到有效的代码签名证书代价高昂给加载器签名能极大提高通过率。在测试中可以尝试窃取或滥用已泄露的证书仅限授权测试环境。分离式加载不将Shellcode直接嵌入二进制文件。让加载器从一个看似正常的配置文件、图片隐写术或网络地址下载第二阶段Shellcode。这避免了静态文件中包含完整的恶意代码特征。一个经过简单混淆和UPX加壳的加载器可能就能绕过不少传统AV的静态扫描。但对于EDR动态行为更为重要。3.4 C2服务器配置与通信隐蔽在服务器端你需要运行Outis的C2服务。配置通常包括监听端口、加密密钥、回调域名白名单等。通信隐蔽技巧模仿合法流量将C2通信伪装成与常见云服务如AWS S3, Google APIs或软件更新服务器如update.microsoft.com的交互。使用对应的HTTP头User-Agent, Host和URL路径。使用域前置Domain Fronting利用CDN服务如Cloudflare的特性使流量在网络上看起来是发送到CDN的一个合法前端域名如fronting.mydomain.com但实际被CDN转发到你的真实C2后端域名如c2.mydomain.com。这可以绕过基于目的IP/域名的简单封锁。数据加密与编码即使使用HTTPS也应将实际指令和数据再进行一层应用层加密。同时将传输的数据进行Base64、Hex等编码使其在日志中看起来像乱码而非可读的命令。低频率与慢速通信除了心跳只在有任务时通信。传输大量数据时分片并加入延迟模拟正常文件传输行为。4. 操作流程与现场执行记录假设我们已经生成了负载payload.bin并准备了一个基础的加载器loader.exe。以下是模拟的一次红队行动步骤4.1 第一阶段初始访问与投放目标是通过钓鱼邮件获取初始立足点。我们制作了一个带有“重要文档”的邮件附件是一个包含恶意宏的Word文档。文档准备Word宏被设计为当用户启用宏后从文档内的一个隐藏字符串或远程URL解密出loader.exe将其写入临时目录%TEMP%并执行。执行与注入用户打开文档并启用宏。loader.exe在内存中解密出payload.bin。加载器开始工作枚举进程发现explorer.exePID: 1234正在运行。使用OpenProcess以PROCESS_ALL_ACCESS权限打开该进程。使用VirtualAllocEx在explorer.exe进程内分配一块RWX内存。使用WriteProcessMemory将payload.bin写入该内存区域。使用QueueUserAPC将这块内存地址作为APC例程排入explorer.exe主线程的APC队列。explorer.exe的主线程在某个时间点进入可报警状态于是开始执行我们的Shellcode。清理痕迹loader.exe在执行完注入后立即自我删除使用cmd /c del [自身路径] exit。Word文档可以保持不动或者也触发自删。此时在目标系统上你看不到新的可疑进程。explorer.exe看起来一切正常但它的内存里已经住进了一个“幽灵”。4.2 第二阶段建立通信与初步侦察Shellcode初始化在explorer.exe内执行的Shellcode首先初始化解析硬编码的C2服务器地址和端口secure-cdn.com:443。建立TLS连接模仿浏览器User-Agent。发送上线信标Beacon。信标信息通常包括主机名、用户名、进程PID、权限级别等并经过加密。C2服务器接收你的C2服务器日志显示一个新会话上线来自explorer.exe (PID 1234)用户是CORP\jdoe权限为User。执行初始命令你从C2控制台发出第一个指令whoami /groups和systeminfo以确认权限并收集基础系统信息。指令被加密后通过HTTPS POST请求发送到C2的一个特定URI如/api/collect。数据回传植入物接收到加密指令解密后在explorer.exe的上下文中创建一个临时线程来执行whoami和systeminfo命令捕获输出加密后通过HTTPS PUT或POST回传到C2的另一个URI如/api/report。整个过程网络流量看起来像是explorer.exe在向一个HTTPS网站发送一些表单数据没有异常进程命令行参数也是干净的。4.3 第三阶段权限提升与横向移动发现当前是用户权限需要提权。本地漏洞探测从C2发送一个本地提权漏洞检测脚本例如一个编译好的、能检测系统补丁情况的二进制文件。植入物将其写入磁盘可能是一个随机名的临时文件执行然后删除文件。执行结果显示系统缺少某个关键补丁。提权利用将对应的提权利用程序例如一个DLL或exe上传并执行。由于注入在explorer.exe中而explorer.exe通常以当前用户权限运行所以执行提权利用后如果成功我们可能会获得一个具有更高权限如SYSTEM的新进程。此时Outis的植入物可以尝试将这个新进程例如一个新的svchost.exe实例作为新的宿主进行进程迁移。进程迁移这是一个关键操作。向当前植入物发送迁移指令指定目标进程新获得的SYSTEM权限进程。植入物会在目标进程中重复注入操作将核心的通信和任务循环代码“搬家”过去然后清理原explorer.exe中的代码。这样我们的C2会话就实现了权限升级并且转移到了一个新的、权限更高的宿主进程中。横向移动以SYSTEM权限可以转储LSASS进程内存获取哈希或者使用其他凭据攻击技术。获取到其他主机的凭据后可以通过SMB或WMI等方式将加载器loader.exe和payload.bin投放到网络中的其他主机重复初始注入过程建立新的会话。在整个过程中操作的核心始终是向寄生在合法进程内的植入物发送指令由它来执行“脏活”。操作者不与目标系统直接交互所有痕迹都隐藏在系统进程的活动之下。5. 对抗检测、问题排查与防御思考5.1 常见问题与排查实录即使设计精巧在实际使用中也会遇到各种问题。以下是一些常见坑点问题一注入失败宿主进程崩溃。排查首先检查选择的宿主进程是否稳定。某些svchost.exe实例承载关键服务注入可能导致不稳定。尝试换用explorer.exe或dllhost.exe。其次检查Shellcode的兼容性x86 vs x64。在64位系统上向32位进程注入64位Shellcode会失败。确保Shellcode与目标进程架构匹配。最后检查内存分配和权限设置是否被安全软件拦截。可以尝试使用更“温和”的API调用序列。问题二植入物成功上线但很快失联。排查这很可能是被EDR的行为检测干掉了。检查C2通信模式。是否心跳太快、太规律是否在非工作时间有大量网络活动优化通信间隔和抖动。检查网络流量特征。是否使用了不常见的TLS指纹如不完整的密码套件列表尝试让植入物模仿Chrome或Edge浏览器的TLS握手行为。使用Wireshark在测试环境抓包分析流量是否异常。问题三无法执行某些命令或上传文件。排查检查宿主进程的权限和完整性级别Integrity Level。explorer.exe运行在用户权限和中完整性级别可能无法访问某些受保护路径或执行需要高权限的操作。这就是为什么需要进程迁移到SYSTEM进程。另外检查目标进程是否被沙盒或限制策略如AppLocker约束。如果命令提示符cmd.exe被阻止可以尝试使用PowerShell或直接调用Windows API。问题四C2服务器被溯源或封锁。排查与应对使用域名前置和CDN可以增加溯源难度。定期更换C2域名和IP使用域名动态解析。在植入物中预置多个备用的C2服务器地址域名或IP形成一个简单的C2重定向链。一旦主服务器失联尝试连接备用服务器。5.2 防御视角如何发现“无进程”C2作为蓝队或防御方了解攻击技术才能有效防御。针对Outis这类技术可以关注以下检测点内存检测RWX内存区域在合法进程中发现具有“读、写、执行”权限的内存区域是一个强信号。虽然合法程序如JIT编译器也会使用但需要结合其他上下文分析。非映像内存执行执行来自非映像文件即不是从磁盘上的DLL/EXE加载的内存代码。Windows ETWEvent Tracing for Windows可以提供此类事件。内存内容扫描定期对进程内存进行YARA规则扫描查找已知的Shellcode特征或C2通信模式。行为检测进程空洞化Process Hollowing模式监控CreateProcess挂起创建-VirtualAllocEx/WriteProcessMemory写入新代码-SetThreadContext/ResumeThread恢复执行这一系列API调用的顺序和参数。APC注入监控监控QueueUserAPC调用特别是当APC例程指向一个近期动态分配的内存区域时。跨进程内存写入监控WriteProcessMemory操作尤其是源进程和目标进程不同且目标进程是explorer.exe、svchost.exe等高价值进程时。网络检测异常进程网络连接虽然连接来自explorer.exe但如果explorer.exe频繁地与某个非常见IP的443端口建立长时间连接并传输数据仍然可疑。TLS指纹异常分析TLS握手阶段的JA3/JA3S指纹与正常浏览器或系统更新的指纹进行比对。通信规律性检测固定间隔的心跳流量即使有抖动其统计模式也可能与正常流量不同。终端日志分析Sysmon日志配置完善的Sysmon可以记录详细的进程创建、网络连接、文件创建和跨进程内存操作事件。通过关联分析例如一个Word文档进程创建了loader.exeloader.exe又对explorer.exe进行了内存写入可以发现攻击链。PowerShell/CMD日志虽然植入物可能不直接调用cmd.exe但如果执行了命令可能会在Windows事件日志4688或PowerShell日志中留下痕迹尽管父进程是explorer.exe。5.3 红队使用心得与进阶技巧经过多次实战测试我有几点深刻的体会“无进程”不是银弹它极大地提高了检测门槛但并非不可检测。高级EDR通过内存和行为监控依然能发现蛛丝马迹。因此它应作为整个攻击链中的一环配合其他规避技术如用户态钩子绕过、直接系统调用使用。稳定性优先在测试阶段务必在多种系统环境Win10, Win11, Server 2019/2022和补丁级别下测试注入的稳定性。不稳定的植入物会导致进程崩溃等于自我暴露。优先选择最稳定、兼容性最好的注入技术初期可以用CreateRemoteThread测试功能成熟后再换用APC。通信是生命线C2通信的隐蔽性决定了植入物的寿命。投入时间设计模仿流量的通信协议。可以考虑使用公共的、受信任的网站作为中继例如利用GitHub Gist、Twitter或Discord的API来传递加密指令这比直接连接到一个VPS服务器更难被封锁和溯源。保持简单植入物的功能越复杂体积越大特征越多。保持核心功能通信、任务执行其他功能如键盘记录、屏幕截图以插件形式按需从C2下载到内存中执行执行后立即释放内存。这符合“最小权限、最小暴露”原则。对抗内存扫描可以通过定期移动内存中的代码位置内存“搬家”或者将代码加密存放在内存中仅在执行前解密执行后立即重新加密来对抗定期的内存扫描。最后工具是思想的延伸。Outis这类工具的价值在于它展示了绕过传统进程监控的思路。真正的对抗是动态的、持续的。作为红队要不断研究新的注入技术、通信隐蔽方法和对抗检测的策略作为蓝队则需要构建纵深防御不依赖单一检测点通过内存、行为、网络和日志的关联分析来捕捉这些“幽灵”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2556387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…