APC注入和KernelCallbackTable注入的可能

Windows下关于进程的注入方法有很多
有几种通用性较强像APC注入和KernelCallbackTable注入。这里结合了实际参考了github代码和一些优化的项目来将其实现,然后更好的理解学习一下这两种注入的方式和它们的可操作性。

APC Code Injection

首先来介绍一下APC APC注入 和实现的过程中一些细节的地方,比如枚举线程,用户态内核态APC的区别等这样方便更好的理解APC 注入的实现原理和后续改进等。
Windows内核态使用APC来完成异步启动的I/O操作,线程挂起等行为
APC是(Asynchronous Procedure Call)指异步过程调用
APC是允许用户程序和系统组件在特定线程的上下文中执行代码,因此会在特定进程的地址空间内执行代码,与APC注入有关的DLL主要有两个:Kernel32.dll和Ntdll.dll
有关的函数主要有如下这几个

`

CreateToolhelp32Snapshot,Process32First,Process32Next,Thread32First,Thread32Next,OpenProcess,OpenThread,DuplicateHandle,GetCurrentProcess,WriteProcessMemory,VirtualProtectEx,QueueUserAPC,ResumeThread,NtAllocateVirtualMemory


以上的函数,在APC注入过程中都会使用到其中有几个在其他注入方法中可能不常见的函数,需要了解一下函数的作用。比如QueueUserAPC --将用户模式 异步过程调用 (APC) 对象添加到指定线程的 APC 队列,ResumeThread --递减线程的挂起计数。 当暂停计数递减为零时,将恢复线程的执行

每个线程都有一个存储所有APC的队列,线程可以在进程内执行代码,线程可以利用APC队列异步执行代码

插播

APC 分为两种类型用户模式APC 和 内核模式APC
用户模式APC在目标线程的进程上下文中的用户空间执行,它要求目标线程处于可更改的等待状态,内核模式APC在内核空间执行 此时又可以分为常规APC和特殊APC。
内核/用户 APC都具有三个功能:
● KernelRoutine:该函数将在内核空间中执行(如果是普通内核APC和用户APC,则IRQL= PASSIVE_LEVEL 如果是特殊内核APC 则IRQL=APC_LEVEL,这样创建具有编号的线程来挂起系统上的所有其他 CPU,并且每个线程将 IRQL 提升到DISPATCH_LEVEL,然后将当前处理器上的 IRQL 提升到DISPATCH_LEVEL,这样不会被 Windows 内核或任何其他驱动程序打断,并且由于 APC 是在APC_LEVEL或PASSIVE_LEVEL分派的,APC 在 APC 枚举期间不会更改。)
● RundownRoutine:如果线程在到达APC之前中止,就会在内核空间中调用此函数
● NormalRoutine:如果是内核态APC 这个函数会在内核空间调用,如果是用户态APC则会在用户空间调用。
每个线程都在_KTHREAD数据结构中有两个_KAPC_STATE类型的成员,名为ApcState和SavedApcState
● ApcState: 无论线程是附加到自己的进程还是其他进程都在使用
● SavedApcState:用于存储不是当前上下文且必须等待的进程上下文的APC(列如:当线程附加到另一个进程时候,APC正在排队等待自己的进程)
_KAPC_STATE 结构有一个名为 ApcListHead 的成员,它是两个 LIST_ENTRY 结构,被视为内核 APC 和用户 APC 的列表头,并将用于为线程排队 APC
Windbg内核调试即可获取到_KAPC_STATE

0: kd> dt nt!_KTHREAD
   +0x000 Header           : _DISPATCHER_HEADER
   +0x018 SListFaultAddress : Ptr64 Void
.......................................................
   +0x098 ApcState         : _KAPC_STATE   
   +0x098 ApcStateFill     : [43] UChar
   +0x0c3 Priority         : Char
   +0x0c4 UserIdealProcessor : Uint4B
   +0x0c8 WaitStatus       : Int8B
   +0x0d0 WaitBlockList    : Ptr64 _KWAIT_BLOCK
   +0x0d8 WaitListEntry    : _LIST_ENTRY
..........................................
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值