首页
社区
课程
招聘
[原创]x86与x64下内核APC注入(有码)
发表于: 2017-10-31 15:48 25440

[原创]x86与x64下内核APC注入(有码)

2017-10-31 15:48
25440

APC,即异步过程调用,是针对具体线程、要求由具体线程在某一时刻加以执行的函数信息集合。

所以每一个线程都有自己的APC队列,APC队列相关信息保存在KTHREAD

dt _kthread

nt!_KTHREAD

   +0x000 Header           : _DISPATCHER_HEADER

        ……

   +0x040 ApcState         : _KAPC_STATE

   +0x040 ApcStateFill     : [23] UChar

   +0x057 Priority         : Char

   +0x058 NextProcessor    : Uint4B

   +0x05c DeferredProcessor : Uint4B

   +0x060 ApcQueueLock     : Uint4B

         ……

+0x130 CallbackDepth    : Uint4B

   +0x134 ApcStateIndex    : UChar

       ……

   +0x168 ApcStatePointer  : [2] Ptr32 _KAPC_STATE

   +0x170 SavedApcState    : _KAPC_STATE

   +0x170 SavedApcStateFill : [23] UChar

   +0x187 WaitReason       : UChar

         ……

   +0x194 SuspendApc       : _KAPC

         ……

APC队列存放于结构体_KAPC_STATE

kd> dt _KAPC_STATE

nt!_KAPC_STATE

   +0x000 ApcListHead      : [2] _LIST_ENTRY

   +0x010 Process          : Ptr32 _KPROCESS

   +0x014 KernelApcInProgress : UChar

   +0x015 KernelApcPending : UChar

   +0x016 UserApcPending   : UChar

ApcListHead就是APC的队列头,由此结构可以看出,该队列有两条,分别为内核APC队列和用户层APC队列,两个队列中的函数分别只在内核或用户空间执行。在KTHREAD中还有ApcStatePointer , SavedApcState, ApcStateIndex 这些结构,当一个进程挂靠到另一个进程时这些结构用于保存当前的APC信息ApcStateIndex代表当前前程是出于挂靠状态还是原始状态。不管是插入内核apc还是用户apc,系统都需要将一个KAPC结构挂入相应队列中

kd> dt _kapc

nt!_KAPC

   +0x000 Type             : UChar

   +0x001 SpareByte0       : UChar

   +0x002 Size             : UChar

   +0x003 SpareByte1       : UChar

   +0x004 SpareLong0       : Uint4B

   +0x008 Thread           : Ptr32 _KTHREAD

   +0x00c ApcListEntry     : _LIST_ENTRY

   +0x014 KernelRoutine    : Ptr32     void

   +0x018 RundownRoutine   : Ptr32     void

   +0x01c NormalRoutine    : Ptr32     void

   +0x020 NormalContext    : Ptr32 Void

   +0x024 SystemArgument1  : Ptr32 Void

   +0x028 SystemArgument2  : Ptr32 Void

   +0x02c ApcStateIndex    : Char

   +0x02d ApcMode          : Char

   +0x02e Inserted         : UChar

这里的NormalRoutine就是需要执行的APC函数,KernelRoutine需要用来释放apc结构,而且KernelRoutine总是会得到执行的,而且无论是内核apc还是用户apcKernelRoutine的执行时机总是在NormalRoutine之前。

内核APC总是在用户APC之前执行,而且内核apc是在线程降低运行级别,或者进程切换时执行的,而用户APC是在线程由内核返回到用户层时得到执行的。

内核apc kernelRoutine -> 内核apc normalRoutine -> 用户apc kernelRoutine -> 用户apc normalRoutine

内核apc是一次执行队列中所有的内核apc函数(一个while循环依次执行),而用户apc则一次只执行第一项apc请求。而且用户APC的执行流程相对来说比较复杂,毛老师的书里面说的很详细。


APC注入流程:



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 2
支持
分享
最新回复 (17)
雪    币: 1319
活跃值: (1945)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
WOW64  进程执行shellcode你需要了解下,((LONG_PTR)pMappedAddress  *  (-4))。还有需要是警醒线程,这个你可以看看reactos,KeDelayExecutionThread和(KeSetEvent与KeWaitForSingleObject设置成警醒线程),加上这个大概就稳了
2017-10-31 20:23
0
雪    币: 12
活跃值: (767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
收藏,学习
2017-10-31 23:05
0
雪    币: 300
活跃值: (2452)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
mark
2017-11-1 08:14
0
雪    币: 635
活跃值: (1011)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
库尔 WOW64 进程执行shellcode你需要了解下,((LONG_PTR)pMappedAddress * (-4))。还有需要是警醒线程,这个你可以看看reactos,KeDelayExecutio ...
好的,设置成警醒线程我看别人代码里有用到,我插入apc成功一段时间后explorer也崩溃过几次,不晓得是不是这个原因,我回去试一下,WOW64    进程执行shellcode正好有帖子
2017-11-1 10:36
0
雪    币: 346
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
感谢分享。
2017-11-1 12:31
0
雪    币: 190
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
bosd你就死定了
2017-11-29 15:23
0
雪    币: 441
活跃值: (1040)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
8
以上,在x86上注入和在x64上注入64位都没有问题。但是!在64位上注入32位的时候,还是出了点问题,以注入目标进程就崩了(可以用来杀进程了=  =),一试一个准。 

看到这个笑了。
2018-1-17 15:51
0
雪    币: 965
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢分享。
2018-1-23 11:41
0
雪    币: 7
活跃值: (240)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
10
双子座重症患者...突然想起来这个头像在某乎看到过...
2018-4-9 23:17
0
雪    币: 253
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
感谢分享
2018-4-11 10:40
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习下
2018-5-28 23:18
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
win10 蓝屏
2019-3-12 15:09
0
雪    币: 908
活跃值: (169)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
mark
2019-3-12 23:08
0
雪    币: 46
活跃值: (1740)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
编程小白 以上,在x86上注入和在x64上注入64位都没有问题。但是!在64位上注入32位的时候,还是出了点问题,以注入目标进程就崩了(可以用来杀进程了= =),一试一个准。 看到这个笑了。[em_1]
我在win7x64上注入到x64的进程,不行,为什么
2019-5-23 18:15
0
雪    币: 300
活跃值: (2452)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
mark
2019-5-23 20:15
0
雪    币: 31
活跃值: (245)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
库尔 WOW64 进程执行shellcode你需要了解下,((LONG_PTR)pMappedAddress * (-4))。还有需要是警醒线程,这个你可以看看reactos,KeDelayExecutio ...
这是什么意思?怎么设置成警醒线程,不想代入一堆的偏移。
2019-8-11 16:53
0
雪    币: 14
活跃值: (948)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
((LONG_PTR)pMappedAddress * (-4))
地址补正了怎么也不行呢,测试插入x64进程可以的
2021-6-18 23:36
0
游客
登录 | 注册 方可回帖
返回
//