vc++实现Ring3全局HOOK

深入解析DLL注入与Hook技术:以微信客户端自动化监控为例 DLL注入是Windows平台下一种经典的进程间通信与代码执行技术,其核心原理在于将自定义的动态链接库加载到目标进程的内存空间,从而获得在该进程上下文中的代码执行能力。这项技术常与函数挂钩(Hook)结合使用,通过拦截或修改目标进程的API调用或内部函数执行流程,实现对程序行为的监控、分析与扩展。从技术价值看,DLL注入为软件调试、安全研究、自动化测试及遗留系统功能扩展提供了底层实现手段。在应用场景上,它常见于桌面软件自动化、游戏辅助工具开发、安全软件行为监控以及逆向工程分析等领域。本文以PC端微信客户端的 阅读详情

  vc++实现Ring3全局HOOK 收藏
/***********************************************************************/
/*
实现全局hook模块基本完工,测试通过,没有发现异常。
         计划1:在hook前首先检验该程序是否已被hook
   计划2:添加枚举进程并hook功能
   计划3:在备份api时,只备份目标api函数,避免备份整个dll浪费空间
   计划4:给my_EventProcess_Thread加上垃圾回收机制

*/
/***********************************************************************/

#include
#include
#include
#include
#include
#include
#include
#pragma comment(lib,"psapi")
#include
#include
#include
#define WRITEBASE (12)

typedef struct
{
HMODULE  hModule;//句柄
LPVOID  lpNewBaseOfDll;//备份dll句柄
MODULEINFO modinfo;//MODULEINFO结构
}DLLINFO, *PDLLINFO;

typedef struct
{
HANDLE EventFar;
HANDLE ObjectProcessHandle;
DWORD WriteAddress;
}EventInfo,*PEventInfo;

void UpToDebug();//调整令牌提升至debug权限
BOOL InitDll(char *pszDll, PDLLINFO pDllInfo,HANDLE prochandle);
int HookNamedApi(PDLLINFO pDllInfo, char *ApiName, DWORD HookProc,HANDLE ObjectProcessHandle);
int HookProcess(HANDLE ObjectProcessHandle);
void FarStartUp(int Num);
void EditHookProc();
void __stdcall my_EventProcess_Thread(HANDLE EventFar);
DWORD __stdcall Hook_NtResumeThread(HANDLE ThreadHandle,PULONG PreviousSuspendCount OPTIONAL);

BYTE HookCode[]={0xb8,0x0,0x0,0x0,0x0,0xFF,0xE0};

void UpToDebug()//调整令牌提升至debug权限
{
HANDLE token;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&token);
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount =1;
LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid);
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(token,0,&tp,sizeof(tp),0,0);
}

void main(int argc, char **argv)
{
UpToDebug();//提升至debug权限
HANDLE ObjectProcessHandle=OpenProcess(PROCESS_ALL_ACCESS,1,atoi(argv[1]));//打开目标进程
HookProcess(ObjectProcessHandle);

int wait=0;
scanf("%d",wait);
    return;
}

int HookProcess(HANDLE ObjectProcessHandle)
{
DLLINFO Object_dll;

if(!InitDll("ntdll.dll",&Object_dll,ObjectProcessHandle)) return 0;//备份目标dll
HookNamedApi(&Object_dll, "NtResumeThread", (DWORD)Hook_NtResumeThread,ObjectProcessHandle);//hook函数

//hook_api(&user32_dll, "NtQuerySystemInformation", (DWORD)hook_NtQuerySystemInformation, &new_temp,ObjectProcessHandle);//hook函数
//hook_api(&user32_dll, "NtQueryDirectoryFile", (DWORD)hook_NtQueryDirectoryFile, &new_temp,ObjectProcessHandle);//hook函数
//hook_api(&user32_dll, "FindFirstFileA", (DWORD)hook_FindFirstFileA, &new_FindFirstFileA,ObjectProcessHandle);//hook函数
//hook_api(&user32_dll, "FindNextFileA", (DWORD)hook_FindNextFileA, &new_FindFirstFileA,ObjectProcessHandle);
    return 0;
}

BOOL InitDll(char *pszDll, PDLLINFO pDllInfo,HANDLE prochandle)
{
pDllInfo->hModule = GetModuleHandle(pszDll);//得到目标dll句柄,因为是本地信息,所以要保证本程序加载此dll
if(!pDllInfo->hModule)
{
  printf("pDllInfo->hModule is null! in InitDll");
  return 0;
}
if(!GetModuleInformation(GetCurrentProcess(), pDllInfo->hModule, &pDllInfo->modinfo, sizeof(MODULEINFO)))//得到目标dll信息
{
  printf("Error:GetModuleInformation in InitDll");
  return 0;
}
pDllInfo->lpNewBaseOfDll = VirtualAllocEx(prochandle,0,pDllInfo->modinfo.SizeOfImage,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);//申请空间并赋予相应权限(执行,读写)
if(!pDllInfo->lpNewBaseOfDll)
{
  printf("Error:VirtualAllocEx in InitDll");//错误处理
  return 0;
}
BYTE * buffer=(BYTE *)malloc(pDllInfo->modinfo.SizeOfImage);//分配缓冲,容纳目标dll
ReadProcessMemory(prochandle,pDllInfo->modinfo.lpBaseOfDll,buffer,pDllInfo->modinfo.SizeOfImage,0);//读出,远程dll内容
WriteProcessMemory(prochandle,pDllInfo->lpNewBaseOfDll,buffer,pDllInfo->modinfo.SizeOfImage,0);//写入备份dll
return 1;
}

int HookNamedApi(PDLLINFO pDllInfo, char *ApiName, DWORD HookProc,HANDLE ObjectProcessHandle)
{
DWORD      dw, NamedApiAddress,NewFunc;
MEMORY_BASIC_INFORMATION mbi;
static EventInfo myEventInfo;
static Num=0x676e696b;

NamedApiAddress = (DWORD)GetProcAddress(pDllInfo->hModule, ApiName);//目标api地址,每个进程的api地址都是一样的,只要找本进程的就可以了。
if(NamedApiAddress == NULL)
{
  printf("Error:GetProcAddress in hook_api");//错误处理
  return 0;
}

if(!VirtualQueryEx(ObjectProcessHandle,(void *)NamedApiAddress,&mbi,sizeof(MEMORY_BASIC_INFORMATION)))//获取api所在内存信息
{
  printf("Error:VirtualQueryEx in hook_api");
  return 0;
}

if(!VirtualProtectEx(ObjectProcessHandle,mbi.BaseAddress,mbi.RegionSize,PAGE_EXECUTE_READWRITE,&dw))//分配写和执行权限
{
  printf("Error:VirtualProtectEx in hook_api");
  return 0;
}
LPVOID WriteAddress=VirtualAllocEx(ObjectProcessHandle,0,1000,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);//分配内存,写入hook函数

//计算原函数COPY的位置
NewFunc = NamedApiAddress - (DWORD)pDllInfo->modinfo.lpBaseOfDll + (DWORD)pDllInfo->lpNewBaseOfDll;
//修改原函数入口处内容

if(strcmp(ApiName,"NtResumeThread")==0)
{
  DWORD my_CreateEventA=(DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"),"CreateEventA");
  HANDLE EventFar;
  __asm
  {
   pushad
   push 00000000h
      push Num
   push 0x676e696b
   push esp
   push 0
   push 0
   push 0
   call my_CreateEventA
   mov EventFar,eax
   pop eax
   pop eax
   pop eax
   popad
  }
  *(PDWORD)((DWORD)FarStartUp+9)=(DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"),"OpenEventA");
     LPVOID StartUpAddr=VirtualAllocEx(ObjectProcessHandle,0,500,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);//分配内存,写入StartUp函数
  WriteProcessMemory(ObjectProcessHandle,StartUpAddr,(LPVOID)FarStartUp,500,0);
  printf("%x/n",(DWORD)StartUpAddr);
  HANDLE FarThread=CreateRemoteThread(ObjectProcessHandle,0,0, (LPTHREAD_START_ROUTINE)StartUpAddr,(PVOID)Num,0,0);
  WaitForSingleObject(FarThread,-1);
  CloseHandle(FarThread);
  DWORD ReadBuf;
  ReadProcessMemory(ObjectProcessHandle,(LPVOID)((DWORD)StartUpAddr+21),&ReadBuf,4,0);
  VirtualFreeEx(ObjectProcessHandle,StartUpAddr,500,MEM_RELEASE);
  *(PDWORD)(HookProc+WRITEBASE+7)=ReadBuf;
  myEventInfo.EventFar=EventFar;
  myEventInfo.ObjectProcessHandle=ObjectProcessHandle;
  myEventInfo.WriteAddress=(DWORD)WriteAddress;
  CreateThread(0,0,(unsigned long (__stdcall *)(void *))my_EventProcess_Thread,&myEventInfo,0,0);
  Num++;
}
*(PDWORD)(HookProc+WRITEBASE)=NewFunc;
*(PDWORD)(HookProc+WRITEBASE+14)=(DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"),"GetCurrentProcessId");
*(PDWORD)(HookProc+WRITEBASE+21)=(DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"),"SetEvent");
*(PDWORD)(HookProc+WRITEBASE+28)=(DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"),"WaitForSingleObject");
*(PDWORD)(HookProc+WRITEBASE+35)=(DWORD)GetProcAddress(GetModuleHandle("ntdll.dll"),"NtQueryInformationThread");
*(PDWORD)(HookProc+WRITEBASE+42)=(DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"),"ResetEvent");

WriteProcessMemory(ObjectProcessHandle,WriteAddress,(void *)HookProc,1000,0);
*(PDWORD)(&HookCode[0]+1)=(DWORD)WriteAddress;
WriteProcessMemory(ObjectProcessHandle,(LPVOID)NamedApiAddress,&HookCode,7,0);

printf("func:%x/n",WriteAddress);//调试信息

return 1;
}

void  FarStartUp(int Num){
int myOpenEvent=0x10020000;
__asm call GetMyAddr;
DWORD myEventHandle=0x00220000;
DWORD FuncAddr;
__asm
{
  jmp run
GetMyAddr:
  pop eax
  mov FuncAddr,eax
  push eax
  ret
run:
  push 00000000
  push Num
  push 0x676e696b
  push esp
  push 0
  push EVENT_ALL_ACCESS
  call myOpenEvent
  mov myEventHandle,eax
}
*(PDWORD)(FuncAddr+3)=myEventHandle;
    return;
}

void __stdcall my_EventProcess_Thread(PVOID InEventInfo)
{
EventInfo myEventInfo;
PEventInfo Info=(PEventInfo)InEventInfo;
myEventInfo.EventFar=Info->EventFar;
myEventInfo.ObjectProcessHandle=Info->ObjectProcessHandle;
myEventInfo.WriteAddress=Info->WriteAddress;
while(true)
{
  WaitForSingleObject(myEventInfo.EventFar,-1);
  DWORD ReadBuf=0;
  ReadProcessMemory(myEventInfo.ObjectProcessHandle,(LPVOID)(myEventInfo.WriteAddress+67),&ReadBuf,4,0);
  HANDLE ObjectProcessHandle=OpenProcess(PROCESS_ALL_ACCESS,1,ReadBuf);
  HookProcess(ObjectProcessHandle);
  SetEvent(myEventInfo.EventFar);
  ResetEvent(myEventInfo.EventFar);
}
return;
}

DWORD __stdcall Hook_NtResumeThread(
        HANDLE ThreadHandle,
        PULONG PreviousSuspendCount OPTIONAL)
{
/*int OldNtResumeThread=0x11223344;//原NtQueryDirectoryFile函数
int EventHandle=0x11002200;
int my_GetCurrentProcessId=0x00224466;
int my_SetEnent=0x22447688;
int my_WaitForSingleObject=0x22556577;
int my_NtQueryInformationThread=0x99884756;*/
//int FarRead=0x00220044;

int OldNtResumeThread;//原NtQueryDirectoryFile函数
int EventHandle;
int my_GetCurrentProcessId;
int my_SetEnent;
int my_WaitForSingleObject;
int my_NtQueryInformationThread;
int my_ResetEvent;
__asm
{
  mov OldNtResumeThread,00112244h
  mov EventHandle,00225588h
  mov my_GetCurrentProcessId,22447799h
  mov my_SetEnent,55662244h
  mov my_WaitForSingleObject,55889966h
  mov my_NtQueryInformationThread,77554411h
  mov my_ResetEvent,55661188h
  pushad
}
__asm call GetAddr;
int FarRead;
__asm mov FarRead,22550011h;

DWORD myAddr;

__asm
{
  jmp start
GetAddr:
     pop eax
  mov myAddr,eax
  push eax
  ret
start:
}

DWORD myStatus;//存储返回变量

BYTE SystemInfo[60];
int infoaddr=(DWORD)&SystemInfo;
int CurrentProcess;

__asm
{
  push 0
     push 28
  push infoaddr
  push 0
  push ThreadHandle
     call my_NtQueryInformationThread
  mov myStatus,eax
}
DWORD id=*(DWORD *)(SystemInfo+8);

__asm
{
  call my_GetCurrentProcessId
  mov CurrentProcess,eax
}
if(id==(DWORD)CurrentProcess)
{
     __asm
  {
      push PreviousSuspendCount
      push ThreadHandle
      call OldNtResumeThread
      mov myStatus,eax
   popad
  }
     return myStatus;
}

if(myStatus==0)
{
  *(PDWORD)(myAddr+3)=id;
  __asm
  {
   push EventHandle
   call my_SetEnent
   push -1
   push EventHandle
   call my_WaitForSingleObject
   push EventHandle
   call my_ResetEvent
  }
}

__asm
{
  push PreviousSuspendCount
  push ThreadHandle
  call OldNtResumeThread
  mov myStatus,eax
  popad
}
return myStatus;
}

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/yincheng01/archive/2009/08/17/4455293.aspx

vc++调用hook API钩子截获CreateFile和CloseHandle来加密WORD文件+实现文件防拷贝_chorus和hook区别 利用API Hook截获CreateFile和CloseHandle达到加解密DOC文件和防拷贝的目的 visual c++调用hook API钩子截获CreateFile和CloseHandle来加密WORD文件+实现文件防拷贝 立即下载

相关推荐

51单片机也能玩转信号发生器?手把手教你用DAC0832和LM358输出四种标准波形

本文详细介绍了如何使用51单片机和DAC0832芯片搭配LM358运放,自制低成本信号发生器,实现正弦波、矩形波、三角波和锯齿波四种标准波形的输出。从硬件选型、电路设计到编程实现,手把手教你完成这一实用电子项目,总成本不到50元,适合电子爱好者和学生实践。

weixin_30530939的博客 551

进程保护原理Hook函数Openprocess

Win32子系统:                                                                                                                                                                Win32是Windows的一个子系统,还有另外的子系统

Fly20141201. 的专栏 8162

1.47寸ST7789V3彩色TFT LCD嵌入式驱动详解

TFT LCD是嵌入式人机交互(HMI)的核心显示技术,其工作原理依赖于行列驱动、RGB像素寻址与伽马校正等模拟/数字协同机制。ST7789V3作为主流低功耗TFT控制器,支持SPI接口与16位RGB565数据格式,具备高兼容性与轻量级驱动优势。在资源受限的MCU平台(如ARM Cortex-M系列)上,结合RT-Thread设备驱动模型与QSPI硬件加速,可实现高效显存管理、Bresenham图形算法及GB2312中文字模渲染。典型应用场景涵盖便携设备状态屏、工业HMI面板与教育开发套件——本文以1.47

weixin_42599908的博客 123

实现hook OpenProcess实现ring3保护进程、代码

/*********************************实现hook OpenProcess实现ring3保护进程、、C++完整代码、、************************************************/#include <windows.h>PIMAGE_IMPORT_BY_NAME pImportByName = N...

weixin_34315485的博客 3119

pytorch实现手语识别

连续手语识别项目,中文数据集CSL

masteryi-0018的博客 1万+

TestFlight分发测试app,提示无法安装 所请求的App不可用或者不存在

TestFlight分发测试app,提示无法安装 所请求的App不可用或者不存在

天穹云原生 9169

实现简单的ring3进程保护、hook OpenProcess函数、简单分析

简单的HOOK OpenProcess函数、达到不让任务管理器使用OpenProcess来获取我们要保护的进程的句柄、从而达到使任务管理器使用TerminateProcess无法结束该进程的目的、、、当我们HOOK到OpenProcess的时候、我们要在自己的MyOpenProcess中、判断一下、所打开的进程是否为我们要保护的进程、如果是简单的返回错误码0、如果不是就在我们...

weixin_34277853的博客 1267

Containerd容器运行时的私有仓库镜像推送push和镜像拉取问题解决

向/etc/containerd/config.toml配置添加如下配置,然后重启containerd。向/etc/containerd/config.toml配置添加如下配置,然后重启containerd。通过crictl为k8s拉取镜像如下所示。可以通过ctr命令进行镜像推送。往私有仓库推送镜像如下。

Bulut0907 1万+

windows ring3 注入及hook

需求背景 动态修改程序的函数oldsub()执行我们的newsub() 此时则需要注入并hook 注入 简单的远程线程注入分三步 //获取进程句柄 //提升权限 //注入dll #include <windows.h> //获取进程句柄 HANDLE GetThePidOfTargetProcess(HWND hwnd) { DWORD pid; GetWindowT...

Tesi1a的充电桩 599

Calibre电子书阅读器个性化样式定制指南

本文详细介绍了如何通过Calibre电子书阅读器的用户样式表功能进行深度个性化样式定制。从修改全局字体、行距、背景配色(包括深色/浅色模式)到美化代码块、引用等特殊元素,本指南提供了完整的CSS代码示例与实战技巧,帮助用户打造专属的舒适阅读环境,显著提升电子书阅读体验。

vv45678的博客 920

基于Halium 9为小米平板4移植Ubuntu Touch:内核适配与驱动调试实战

在移动设备生态中,Linux内核作为核心,通过硬件抽象层(HAL)管理底层硬件驱动,为上层系统提供统一接口。其模块化设计允许深度定制,是实现跨平台移植的技术基础。Halium项目正是利用这一原理,构建了一个中间层,将安卓内核的硬件支持能力“翻译”成标准Linux发行版能识别的格式,从而在手机、平板等移动设备上运行Ubuntu Touch、postmarketOS等移动Linux系统,极大地拓展了老旧设备的再利用价值。这一技术为开发者提供了在常见安卓硬件上进行Linux系统开发与定制的可能,尤其在嵌入式与物联

weixin_42639246的博客 371

【140816】VC HOOK编程技巧(教程) pdf

HOOK 编程 pdf,涉及的内容有:    VC++实现Ring3全局HOOK    VC获取鼠标HOOK的做法    VC利用Globalhook进行后台监控的视频运用    通过HOOK获取QQ游戏登录密码    钩子概述、消息功能的使用初步    VC实现MSN Message钩子程序    Windows下的函数HOOK钩子    API HOOK基本原理和实现    

资源小站 1748

18|AI 辅助精准测试:让平台会解释、会总结、会推荐

本文介绍 AI 在精准测试平台中的落地方式,包括变更摘要、风险解释、补测建议和报告总结。测试开发工程师。Java 后端开发工程师。质量平台 / DevOps 平台建设者。想了解精准测试落地方法的技术负责人。从报告中提取变更文件、未覆盖行、推荐用例。拼成结构化 JSON。让 AI 生成 200 字质量摘要。把摘要展示在报告顶部。读完本文后,可以复制下面的 Prompt,让 AI 生成一个报告总结练习。你是一名 AI 应用开发专家和测试架构师。

专注 AI 精准测试平台实战落地,分享从代码 Diff 到回归决策的完整工程闭环。主张“先建数据链路,再上 AI 智能”,让测试从“靠经验”走向“基于风险”。 55

Ring3下Inline Hook MessageBox

 这是学习Ring3 下Inline Hook 的代码,写的很菜,部分代码参考了邪8中“我非我”的代码,在此表示感谢。原文中有二处错误,后面好多人都说运行不成功,不知道原作者是怎样编译成功的,原代码参见ring3 inline hook demo由于在邪8中等级太低,不能发贴,借用宝地说明下提前声明下,我调试的VC++为6.0的,在VC++编译器生成EXE中,函数也像API一样进行了中间跳转如

1120

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ring3实现进程保护

Ring3下Hook进程有多种方法,其中有消钩子(Msg Hook)、线程注入(Insert Thread)和ShellCode等,前两种最为常见。以前用VB只能用shellcode,原因是VB不支持标准DLL,而VC则完全不成问题,下面说一下方法。消息注入是通过SetWindowsHookEx安装一个钩子(比如WH_GETMESSAGE)然后将DLL注入系统所有GUI进程,这样,大部分进...

zzmzzff的博客 1852

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

VC++ Interceptor 拦截器 (支持成员函数、全局函数)Ring3 - x86

Linux 在RING3环境下面几乎难以实现一个高效可靠可穿插在任何代码位置的拦截器(C/C++),RING3可用的办法都非常麻烦同时也很消耗性能,例如通过调试器写进程函数机器代码。 拦截器本质原理是通过在函数头插入 JMP 汇编实现的重定向(inline-HOOK),类似像通过C/C++ Linker(连接器)特性覆盖第三方函数的办法其局限性是很大,它不适用于也很难...

liulilittle的博客 640

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

unity怎么设置键盘长按事件_小伙利用VC++打造“键盘钩子”,实现系统键盘监控显示...

键盘记录功能一直是木马等恶意软件窥探用户隐私的标配,那么这个功能是怎么实现的呢?在Ring3级下,微软就为我们内置了一个Hook窗口消息的API,也就是SetWindowsHookEx函数,这个函数能够实现优先拦截提交给特定窗口的信息,并进行拦截者需要的处理,然后再提交给窗口函数或是下一个钩子函数,函数第一个参数为idHook,需要设置钩子的类型,在以下代码样例中我们选择安装的钩子类型为WH_GE...

weixin_39924179的博客 265

进程隐藏与进程保护(SSDT Hook 实现)(三)

Zachary.XiaoZhen - 梦想的天空 进程隐藏与进程保护(SSDT Hook 实现)(三) 文章目录:                   1. 引子: 2. 获取当前系统下所有进程: 3. 服务管理(安装,启动,停止,卸载): 4. 应用程序和内核程序通信: 5. 小结:                  1. 引子:

cmd1115的专栏 1149

[ring3反作弊篇] 基于EBP遍历调用栈及模块名

[ring3反作弊篇] VC++基于EBP遍历调用栈及模块名 入门级反作弊代码仅供参考~~

Koma的主页 2792

OpenSpeedy实战指南:高效解决游戏加速问题的完整方案

OpenSpeedy是一款开源免费的游戏加速工具,通过Hook Windows系统时间函数实现游戏变速功能,帮助玩家突破帧率限制,获得更流畅的游戏体验。这款工具支持x86和x64进程,采用Ring3层Hook技术,无内核侵入性,对系统安全有保障。 ## 🔧 技术原理深度解析 OpenSpeedy的核心技术基于时间函数Hook机制,通过拦截游戏对系统时间函数的调用,修改时间参数来实现变速效果。

gitblog_00306的博客 223
上一篇: C/C++底层实现指定磁盘只读
下一篇: vc++实现内核级进程保护
wind0513
博客等级 码龄24年 3粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值