如果你已经会用 CreateRemoteThread 往别人进程里塞一个 DLL,但一到 APC 就卡住——知道它挂在哪个队列、什么时候真正执行、为什么有的进程怎么都不触发——那这门课就是冲这个缺口来的。它不讲注入的 ABC,而是专门拆 APC 这一种:把代码送进目标进程、让目标自己心甘情愿地执行,全程不留模块痕迹。

先搞清楚你缺的是哪一块

多数人卡在 APC 注入,不是不会写代码,而是脑子里缺一张执行流程图。APC(异步过程调用)本质是挂在线程上的回调,分用户态和内核态两套队列,触发时机跟线程的告警状态、是否在等待、等的是不是可告警对象死死绑在一起。这门课要补的正是这条链路:APC 对象挂到哪个线程、线程在什么状态下才会去取、取的时候拿的是哪个函数地址。

顺着这条线,你会遇到几个绕不开的点。比如为什么 QueueUserAPC 调用返回成功,目标却毫无动静;为什么单线程进程好使、多线程进程反而要挑线程;为什么有的目标进程必须靠其它操作把它「叫醒」。这些不是边角料,是决定注入成不成的主干。

课程实际拆解的链条

课里没有停在原理层面,而是把它落到一条可复现的流程上。整体思路是把要执行的代码先变成一段不依赖磁盘文件的数据,再把它放进目标进程的地址空间,最后借 APC 让目标线程去执行这段数据。中间绕不开的一步是内存申请:你得先在目标进程里要一块可执行的内存,把数据写进去,然后想办法让 APC 回调地址指向这块内存,而不是指向某个已经加载的模块。

替换申请内存地址这一步是整条链里的关节。正常写法会去调目标进程里的 API,落点就在己方模块上;要躲开检测,就得把这步换成直接操作内存的方式,让痕迹落在匿名内存里。课里演示的目标选了一个实际进程,目的不是让你记住哪个游戏,而是让你看到换一个目标、线程状态不同时,同一条链会在哪一步失效。

和线程注入、劫持注入放一起看

课程把注入归成三类一起讲:创建线程、APC、劫持线程。这么排不是凑数,而是让你看清各自的代价。创建线程最直接,但会在目标进程里多出一个线程,异常明显;劫持线程能借用已有线程,但时机和寄存器状态需要处理;APC 介于两者之间,不新增线程,靠现有线程的执行间隙完成回调。三者对照着看,你才能判断手上这个目标该用哪一种,而不是背下一种写法到处套。

配套练习建议怎么用

  • 先自己写一版最朴素的 APC 调用,观察目标毫无反应,再回头对照课程看触发器差在哪。
  • 把 DLL 换成一段只做弹窗或写文件的最小代码,先验证执行链通不通,再换成真正的载荷。
  • 换不同线程状态的目标试:主线程在忙的、在等消息的、单线程的,记录哪次成功哪次失败。
  • 用调试器或内存查看工具确认模块列表里确实没有多余项,别只看功能有没有生效。

看完应该能回答的问题

APC 挂在用户态队列还是内核态队列,区别在哪;QueueUserAPC 之后目标不执行,可能的触发条件缺哪几个;替换内存申请地址那一步,为什么要绕开常规 API;不新增线程这件事,对规避检测到底有多少实际意义。这几个问题答不上来,说明你只是跟着敲了一遍;能答上来,才算把 APC 注入这条链真正接进自己的知识里。

Windows内核-注入技术(APC)

课程详情

课程标题

Windows内核-注入技术(APC)

适合人群

对游戏安全感兴趣人群

学习收获

- 实现以APC的方式实现无模块注入的原理及实现

课程简介

- 此课程不提供任何资料下载

注入技术

- 包括三种方式:
  • 创建线程注入
  • APC注入
  • 劫持线程注入

整体流程

- 1. 整合APC代码 - 2. DLL转换成二进制 - 3. 整合申请内存代码 - 4. 整合内存执行DLL代码 (malloc) - 5. 替换申请内存地址 - 6. 测试往DNF注入DLL

课程目录

01 01.拆分下大概流程.mp4
02 02.整合APC代码.mp4
03 03.DLL转换成二进制.mp4
04 04.整合申请内存代码.mp4
05 05.整合内存执行DLL代码.mp4
06 06.替换申请内存地址.mp4
07 07.测试往DNF,CF注入DLL.mp4