逆向工程师必备:用MDL绕过游戏保护读取内存数据的完整流程(附POC代码)
内核级内存访问的艺术绕过游戏保护与反作弊系统的深度实践在游戏安全与逆向工程领域内核态的内存访问技术一直是一把双刃剑。对于安全研究人员和逆向爱好者而言理解并掌握如何在受保护的环境下稳定、隐蔽地读取进程内存不仅是技术能力的体现更是深入理解现代操作系统内存管理与安全机制的关键。传统的用户态调试器在日益强大的反作弊系统面前常常显得力不从心它们通过内核驱动、虚拟化技术、内存完整性校验等手段构建了层层壁垒。此时将视角提升至内核层利用操作系统提供的底层机制往往能开辟出新的路径。本文旨在为具备一定内核驱动开发基础的研究者系统性地剖析几种内核态读取目标进程内存的核心方法。我们将超越简单的API调用深入探讨其背后的原理、稳定性考量、隐蔽性设计以及在实际对抗环境中的应用技巧。重点将围绕MDLMemory Descriptor List映射这一核心机制展开同时对比分析MmCopyVirtualMemory的适用场景与局限并简要探讨CR3寄存器切换这一底层原理。我们的目标不仅仅是实现功能更是构建一套在对抗环境下更稳定、更难以被检测的访问范式。文中将以一个具体的、无害的进程如Notepad.exe作为示例目标提供可编译、可测试的概念验证代码帮助你将理论转化为实战能力。1. 内核内存访问基础概念与对抗环境分析在深入代码之前我们必须先厘清几个核心概念并理解我们所处的“战场”环境。现代游戏反作弊系统如BattlEye、Easy Anti-Cheat、Vanguard等的防护已远不止于用户态。它们通常包含一个或多个运行在内核模式Ring 0的驱动程序拥有与操作系统同等的权限。这些驱动可以挂钩关键系统调用监控NtReadVirtualMemory、NtWriteVirtualMemory等函数拦截可疑的跨进程内存操作。扫描内存中的代码完整性检测是否被注入或修改。枚举已加载的模块和线程寻找非法的驱动或DLL。利用虚拟化或Hypervisor技术在更底层监控系统行为使得传统的内核钩子Hook也可能失效。在这种背景下一个“鲁莽”的内核模块如果直接调用明显的可疑函数或留下痕迹会迅速被检测并导致游戏进程终止甚至封禁。因此我们的技术选型需要兼顾功能性、稳定性与隐蔽性。从内存访问的本质来看每个进程都有其独立的虚拟地址空间。在x64体系结构下通过CR3寄存器控制着当前CPU核心所使用的页表基址从而决定了虚拟地址到物理地址的翻译流程。不同的进程拥有不同的CR3值。内核驱动运行在系统地址空间其CR3指向系统页表。要访问另一个进程的用户态内存核心挑战就是如何“看到”目标进程页表所描述的物理内存。提示本文讨论的所有技术均需在内核驱动中实现这要求开发者具备Windows驱动开发环境WDK、代码签名测试签名或正式签名以及内核调试的基本知识。请务必在虚拟机或专用的测试机器上进行实验避免对生产系统造成影响。下表概括了我们将要探讨的三种内核态内存访问方式的核心特点与适用场景方法核心原理稳定性隐蔽性主要风险与注意事项直接附加后memcpy通过KeStackAttachProcess附加到目标进程上下文然后直接使用memcpy。低。附加过程可能引发APC异步过程调用问题且在多线程环境下极不稳定易导致系统蓝屏BSOD。中。操作本身较底层但附加行为可能被监控。极易引发系统崩溃不推荐在生产或对抗环境中使用仅用于原理理解。MmCopyVirtualMemory调用微软未公开但广泛使用的内核函数由系统处理地址转换和内存拷贝。高。这是系统内部例程处理了异常和边界检查相对最稳定。低。该函数是反作弊系统重点监控的对象调用极易被检测。功能稳定但指纹明显在对抗激烈的环境中可能第一个被拦截。MDL映射构建内存描述符列表将目标进程的物理页映射到系统地址空间。高。正确使用时非常稳定能处理分页内存。高。通过合法的内存管理API操作行为模式与许多硬件驱动相似较难被区分。需要仔细管理MDL生命周期分配、锁定、映射、解除映射、释放否则会导致内存泄漏或系统不稳定。CR3切换直接修改CPU的CR3寄存器临时将CPU的页表切换到目标进程。中。直接操作CPU关键寄存器风险极高需要妥善处理中断和上下文。极高。是最底层、最直接的方法几乎没有软件层面的调用痕迹。极端危险需要关闭中断、处理APC实现不当100%导致系统崩溃。通常作为研究用途。从表中可以看出MDL方式在稳定性与隐蔽性之间取得了较好的平衡是我们本次深入探讨的重点。2. 核心武器MDL机制的原理与实战实现MDL是Windows内存管理中的一个关键数据结构用于描述一片虚拟内存缓冲区对应的物理页面。驱动程序常用MDL来进行DMA直接内存访问操作或者像我们一样将用户进程的物理页映射到内核地址空间进行访问。2.1 MDL工作流程拆解使用MDL映射访问另一进程内存的完整流程可以概括为以下几步定位目标进程与地址通过进程PID获取PEPROCESS并计算出要读取的用户态虚拟地址例如Notepad.exe模块的基址。创建MDL使用IoAllocateMdl函数传入目标进程的虚拟地址和长度创建一个MDL来描述这片内存区域。探测并锁定物理页调用MmProbeAndLockPages。这个函数至关重要探测确保目标地址是有效的、可访问的用户态地址否则会引发异常。锁定将对应的物理页面锁定在内存中防止被换出到磁盘。在锁定期间这些页面常驻物理内存。映射到系统空间使用MmMapLockedPagesSpecifyCache将MDL描述的物理页面映射到内核地址空间得到一个内核态的虚拟地址。此时通过这个内核地址访问的就是目标进程内存的物理内容。执行内存操作现在你可以像操作普通内核内存一样使用memcpy、RtlCopyMemory或直接指针解引用来读取或写入映射后的内核地址。清理与解除映射操作完成后必须按顺序执行MmUnmapLockedPages: 解除内核空间的映射。MmUnlockPages: 解除物理页的锁定。IoFreeMdl: 释放MDL对象。整个过程的关键在于我们没有改变目标进程的CR3也没有直接附加到其地址空间而是通过操作系统提供的内存管理例程将目标进程的物理页“借用”到了内核空间进行访问。2.2 实战代码MDL映射读写函数下面是一对精心封装的MDL映射与解除映射函数它们包含了必要的异常处理增强了稳定性。#include ntifs.h // 映射模式枚举 typedef enum _MAPPING_MODE { MapToUserMode, MapToKernelMode } MAPPING_MODE; /** * brief 将目标进程的虚拟地址空间通过MDL映射到当前内核地址空间 * param TargetProcess 目标进程的PEPROCESS * param TargetAddress 目标进程内的虚拟地址 * param Size 要映射的大小字节 * param MapMode 映射模式通常使用KernelMode以获得内核访问权限 * param[out] Mdl 返回分配的MDL指针用于后续清理 * return 成功则返回映射后的内核虚拟地址失败返回NULL */ PVOID MapProcessMemory( PEPROCESS TargetProcess, PVOID TargetAddress, SIZE_T Size, KPROCESSOR_MODE MapMode, PMDL* Mdl ) { PMDL pMdl NULL; PVOID MappedAddress NULL; KAPC_STATE ApcState; // 1. 附加到目标进程上下文为了安全地探测用户态地址 KeStackAttachProcess(TargetProcess, ApcState); __try { // 2. 分配MDL pMdl IoAllocateMdl(TargetAddress, Size, FALSE, FALSE, NULL); if (!pMdl) { DbgPrint([-] IoAllocateMdl failed.\n); __leave; } // 3. 探测并锁定页面 MmProbeAndLockPages(pMdl, MapMode, IoReadAccess); // 根据需求改为IoWriteAccess或IoModifyAccess // 4. 映射到系统空间 MappedAddress MmMapLockedPagesSpecifyCache( pMdl, KernelMode, // 映射到内核空间 MmCached, // 缓存策略 NULL, // 无首选地址 FALSE, // 不进行错误检查 NormalPagePriority ); if (!MappedAddress) { DbgPrint([-] MmMapLockedPagesSpecifyCache failed.\n); MmUnlockPages(pMdl); IoFreeMdl(pMdl); __leave; } *Mdl pMdl; // 返回MDL给调用者 DbgPrint([] MDL mapping successful. Mapped address: 0x%p\n, MappedAddress); } __except (EXCEPTION_EXECUTE_HANDLER) { DbgPrint([-] Exception occurred during MDL mapping.\n); if (pMdl) { if (MappedAddress) { MmUnmapLockedPages(MappedAddress, pMdl); } MmUnlockPages(pMdl); IoFreeMdl(pMdl); } MappedAddress NULL; } // 5. 脱离目标进程 KeUnstackDetachProcess(ApcState); return MappedAddress; } /** * brief 清理MDL映射 * param MappedAddress MapProcessMemory返回的映射地址 * param Mdl MapProcessMemory返回的MDL指针 */ VOID UnmapProcessMemory(PVOID MappedAddress, PMDL Mdl) { if (MappedAddress Mdl) { MmUnmapLockedPages(MappedAddress, Mdl); MmUnlockPages(Mdl); IoFreeMdl(Mdl); DbgPrint([] MDL resources cleaned up.\n); } }如何使用这些函数假设我们已经通过PsLookupProcessByProcessId获取了Notepad.exe进程的PEPROCESSg_TargetProcess并且找到了其主模块的基地址moduleBase。读取该模块前4字节例如可能是MZ头的代码如下PMDL readMdl NULL; SIZE_T bytesRead 0; CHAR readBuffer[4] { 0 }; // 映射目标地址 PVOID mappedKernelAddr MapProcessMemory(g_TargetProcess, moduleBase, 4, UserMode, // 原地址位于用户模式 readMdl); if (mappedKernelAddr) { // 安全地拷贝数据 __try { RtlCopyMemory(readBuffer, mappedKernelAddr, 4); bytesRead 4; DbgPrint([] Read value: 0x%02X%02X%02X%02X\n, readBuffer[0] 0xFF, readBuffer[1] 0xFF, readBuffer[2] 0xFF, readBuffer[3] 0xFF); } __except (EXCEPTION_EXECUTE_HANDLER) { DbgPrint([-] Failed to read from mapped address.\n); } // 务必清理 UnmapProcessMemory(mappedKernelAddr, readMdl); }注意MmProbeAndLockPages的第三个参数是访问模式IoReadAccess,IoWriteAccess,IoModifyAccess。如果你需要写入目标内存必须使用IoWriteAccess或IoModifyAccess并且目标内存必须是可写的。错误的访问模式会导致异常。3. 对比与抉择MmCopyVirtualMemory的利与弊MmCopyVirtualMemory是一个微软未文档化的内核函数但其地址可以通过MmGetSystemRoutineAddress动态获取在多个Windows版本中保持相对稳定。它的函数原型通常如下NTSTATUS MmCopyVirtualMemory( PEPROCESS SourceProcess, PVOID SourceAddress, PEPROCESS TargetProcess, PVOID TargetAddress, SIZE_T BufferSize, KPROCESSOR_MODE PreviousMode, PSIZE_T ReturnSize );使用起来非常简单直观SIZE_T bytesCopied 0; NTSTATUS status MmCopyVirtualMemory( sourceProcess, // 源进程 sourceAddress, // 源地址 PsGetCurrentProcess(), // 目标进程当前驱动所在进程即系统进程 destinationBuffer, // 目标地址内核缓冲区 sizeToRead, // 大小 KernelMode, // 模式 bytesCopied // 实际拷贝大小 );它的优势非常明显接口简洁一行调用完成所有工作。稳定可靠作为系统内部函数它处理了所有复杂的边界情况、异常和跨进程地址转换。无需管理资源没有MDL的分配和释放不易造成资源泄漏。然而其劣势在对抗环境中是致命的高调且易被钩住反作弊驱动几乎肯定会挂钩或监控此函数。任何调用都会立即暴露你的驱动。缺乏灵活性它是一个“黑盒”你无法控制其内部实现例如无法实现“只读一次映射多次读取”这种优化模式。可能被移除或更改虽然历史悠久但毕竟是未文档化API未来系统更新存在变更风险。因此在真正的对抗环境下MmCopyVirtualMemory更适合用于快速原型验证或在对检测要求不高的场景。而MDL方式因其利用的是合法的、广泛使用的内存管理原语行为模式与显卡驱动、存储驱动等硬件驱动相似因此在隐蔽性上更胜一筹。4. 进阶话题稳定性优化与反检测策略仅仅实现功能是远远不够的。在实战中我们需要让代码更健壮更难被反作弊系统识别。4.1 处理分页内存与异常用户态内存可能是分页的Pageable即部分数据可能暂时存储在磁盘的页面文件中。MmProbeAndLockPages会触发页面错误Page Fault将所需页面加载回物理内存。这正是MDL机制强大的地方。我们的代码必须被异常处理块__try/__except包裹以优雅地处理无效地址、访问冲突等情况避免蓝屏。4.2 伪装与混淆反作弊系统会监控可疑的内核活动模式。以下是一些增加隐蔽性的思路避免频繁的KeStackAttachProcess调用附加/脱离进程操作本身有一定开销和痕迹。可以考虑在必要时如解析PEB获取模块列表一次性附加完成多项操作后再脱离而不是为每次读写都附加。随机化操作时机不要以固定频率进行内存扫描或读写。加入随机延迟模拟人类操作或硬件中断的不确定性。利用合法的驱动回调如果你的驱动有合法的理由存在例如作为硬件监控工具的一部分可以将内存访问代码嵌入到正常的驱动回调函数如电源管理回调、图像加载回调中执行使其看起来像是正常业务逻辑的一部分。动态API解析不要硬编码内核函数地址。使用MmGetSystemRoutineAddress动态获取IoAllocateMdl、MmProbeAndLockPages等函数的地址。虽然这些是导出函数但动态解析是一种良好的编程习惯。4.3 关于CR3切换的警示性探讨切换CR3是理论上最直接的方法保存当前CR3写入目标进程的CR3直接读写内存然后恢复原CR3。在x64系统中进程的CR3值通常位于PEPROCESS结构的0x28偏移处此偏移随Windows版本变化需动态获取。// 警告此代码极其危险仅供理解原理切勿在生产环境使用 ULONG_PTR oldCr3 __readcr3(); ULONG_PTR targetCr3 *(ULONG_PTR*)((PUCHAR)targetProcess CR3_OFFSET); // 必须关闭中断和APC防止上下文切换导致灾难 KIRQL oldIrql KeRaiseIrqlToDpcLevel(); KeEnterCriticalRegion(); // 禁用APC __writecr3(targetCr3); // 现在可以直接访问目标进程的用户态地址 if (MmIsAddressValid(targetUserAddress)) { RtlCopyMemory(buffer, targetUserAddress, size); } // 恢复环境 __writecr3(oldCr3); KeLeaveCriticalRegion(); KeLowerIrql(oldIrql);为什么强烈不推荐极端不稳定任何在CR3切换期间发生的中断或异常如果处理不当都会导致不可预测的系统崩溃。影响全局性能切换CR3会影响当前CPU核心的整个地址翻译可能干扰系统调度和其他进程。现代CPU的PCID现代CPU引入了进程上下文标识符PCID来优化TLB刷新手动切换CR3需要更复杂的TLB管理。容易被虚拟化层检测基于Hypervisor的反作弊可以轻易捕获CR3寄存器的修改这比检测API调用更容易。因此CR3切换更适合作为操作系统内存管理机制的学习案例而非实战工具。MDL映射提供了几乎相同的底层访问能力但安全性高出几个数量级。5. 构建完整的测试案例从驱动通信到读取Notepad内存为了将以上知识串联起来我们构建一个最小化的、可测试的驱动模型。这个模型包含三部分一个用户态测试程序、一个内核驱动、以及驱动内部的MDL读取例程。第一步定义驱动通信接口在驱动头文件中定义控制码和设备名称。// BufferIO.h #define DEVICE_NAME L\\Device\\MemReaderDevice #define SYMLINK_NAME L\\DosDevices\\MemReader #define IOCTL_READ_PROCESS_MEMORY \ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) typedef struct _MEMORY_READ_REQUEST { ULONG_PTR ProcessId; ULONG_PTR Address; SIZE_T Size; } MEMORY_READ_REQUEST, *PMEMORY_READ_REQUEST;第二步驱动入口与设备创建在DriverEntry中创建设备对象和符号链接。第三步派遣例程处理IO请求在IRP_MJ_DEVICE_CONTROL的派遣函数中解析控制码IOCTL_READ_PROCESS_MEMORY。case IOCTL_READ_PROCESS_MEMORY: { PMEMORY_READ_REQUEST request (PMEMORY_READ_REQUEST)Irp-AssociatedIrp.SystemBuffer; SIZE_T returnSize 0; if (inputLength sizeof(MEMORY_READ_REQUEST)) { PEPROCESS targetProcess; NTSTATUS status PsLookupProcessByProcessId((HANDLE)request-ProcessId, targetProcess); if (NT_SUCCESS(status)) { PMDL pMdl NULL; PVOID mappedAddr MapProcessMemory(targetProcess, (PVOID)request-Address, request-Size, UserMode, pMdl); if (mappedAddr) { // 将读取的数据拷贝回Irp的输出缓冲区 RtlCopyMemory(Irp-AssociatedIrp.SystemBuffer, mappedAddr, request-Size); returnSize request-Size; UnmapProcessMemory(mappedAddr, pMdl); Irp-IoStatus.Status STATUS_SUCCESS; } else { Irp-IoStatus.Status STATUS_UNSUCCESSFUL; } ObDereferenceObject(targetProcess); } else { Irp-IoStatus.Status STATUS_INVALID_PARAMETER; } } else { Irp-IoStatus.Status STATUS_INFO_LENGTH_MISMATCH; } Irp-IoStatus.Information returnSize; break; }第四步用户态测试程序创建一个简单的控制台程序打开驱动设备发送一个请求读取Notepad.exe进程特定地址的数据例如通过EnumProcessModules获取Notepad的基址然后读取PE头。// 用户态测试代码片段 HANDLE hDevice CreateFile(SYMLINK_NAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hDevice ! INVALID_HANDLE_VALUE) { MEMORY_READ_REQUEST req { 0 }; req.ProcessId notepadPid; req.Address notepadBaseAddress; // 例如读取MZ头 req.Size 2; CHAR outputBuffer[2] { 0 }; DWORD bytesReturned 0; BOOL success DeviceIoControl(hDevice, IOCTL_READ_PROCESS_MEMORY, req, sizeof(req), outputBuffer, sizeof(outputBuffer), bytesReturned, NULL); if (success bytesReturned 2) { printf(Read from Notepad: 0x%02X 0x%02X\n, outputBuffer[0], outputBuffer[1]); // 应输出 M, Z } CloseHandle(hDevice); }通过这个完整的流程你不仅实现了一个内核级的内存读取器更关键的是你理解了在MDL这套机制下如何安全、稳定地与用户态交互并访问受保护进程的内存空间。这为后续更复杂的逆向工程任务如代码注入分析、游戏数据结构解析或安全漏洞研究打下了坚实的技术基础。记住能力越大责任越大请务必在法律允许和道德规范的范围内使用这些技术。

相关新闻

GLM-Image创意编程:用Processing可视化生成过程

GLM-Image创意编程:用Processing可视化生成过程

GLM-Image创意编程:用Processing可视化生成过程 你有没有想过,AI图像生成的过程,除了等待那个最终结果,还能不能变得更有趣、更直观一些? 想象一下,你输入一段文字描述,然后看着画面从模糊的色…

2026/7/6 19:31:36 阅读更多 →
如何用Poppins字体打造专业级设计作品:从安装到精通的全方位指南

如何用Poppins字体打造专业级设计作品:从安装到精通的全方位指南

如何用Poppins字体打造专业级设计作品:从安装到精通的全方位指南 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins 认识Poppins:重新定义现代排版的几何无…

2026/5/17 10:39:39 阅读更多 →
基于SmolVLA的自动化软件测试用例生成实践

基于SmolVLA的自动化软件测试用例生成实践

基于SmolVLA的自动化软件测试用例生成实践 最近跟几个做测试的朋友聊天,大家普遍有个头疼的问题:需求文档一更新,测试用例就得跟着改,手动一条条写,费时费力不说,还容易遗漏边界情况。尤其是敏捷开发模式下…

2026/7/7 12:18:30 阅读更多 →

最新新闻

Kimi与OpenClaw协同原理:能力注册、协议适配与工程落地

Kimi与OpenClaw协同原理:能力注册、协议适配与工程落地

1. 项目概述:Kimi与OpenClaw的协同不是“接入”,而是能力重组最近在多个技术社区和AI工具讨论组里,频繁看到“Kimi正式接入OpenClaw”这类标题。说实话,第一次看到时我下意识点进去,结果发现多数文章连OpenClaw是什么都…

2026/7/8 19:24:11 阅读更多 →
STM32驱动压电蜂鸣器:硬件设计与环境适应性方案

STM32驱动压电蜂鸣器:硬件设计与环境适应性方案

1. 项目背景与核心需求 警报系统在现代工业、家居和公共安全领域扮演着关键角色。一个优秀的警报装置需要满足三个核心要求:可靠性(在各种环境下稳定工作)、清晰度(声音信号易于辨识)和灵活性(可适应不同场…

2026/7/8 19:20:09 阅读更多 →
国内优质展厅设计公司怎么选?推荐5家,汉诺会展深耕展厅设计16年值得信赖!

国内优质展厅设计公司怎么选?推荐5家,汉诺会展深耕展厅设计16年值得信赖!

随着企业数字化升级、品牌竞争加剧以及产业展示需求不断提升,展厅已经成为企业展示综合实力的重要窗口。从传统的产品陈列空间,到如今融合品牌传播、数字互动、文化表达、招商推介于一体的综合展示平台,展厅设计行业正在进入新的发展阶段。20…

2026/7/8 19:20:09 阅读更多 →
终极指南:如何用fanqienovel-downloader打造个人离线图书馆,彻底解决网络阅读限制

终极指南:如何用fanqienovel-downloader打造个人离线图书馆,彻底解决网络阅读限制

终极指南:如何用fanqienovel-downloader打造个人离线图书馆,彻底解决网络阅读限制 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 在数字阅读时代,网络不…

2026/7/8 19:16:05 阅读更多 →
AWS VPC安全组原理与实战:连接级访问控制详解

AWS VPC安全组原理与实战:连接级访问控制详解

1. 这不是“配个防火墙”那么简单:VPC安全组到底在管什么你刚在AWS控制台点开一个EC2实例的详情页,往下拉到“安全”标签页,看到那个叫“安全组”的列表,心里可能嘀咕:“不就是个白名单吗?加几条入站规则&a…

2026/7/8 19:16:05 阅读更多 →
BBDown终极指南:免费高效的哔哩哔哩视频下载解决方案

BBDown终极指南:免费高效的哔哩哔哩视频下载解决方案

BBDown终极指南:免费高效的哔哩哔哩视频下载解决方案 【免费下载链接】BBDown Bilibili Downloader. 一个命令行式哔哩哔哩下载器. 项目地址: https://gitcode.com/gh_mirrors/bb/BBDown 还在寻找一款真正免费、功能强大的哔哩哔哩视频下载器吗?B…

2026/7/8 19:16:05 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/8 16:59:55 阅读更多 →

月新闻