首页
社区
课程
招聘
[原创]再谈内核层apc注入
发表于: 2017-1-23 10:04 9799

[原创]再谈内核层apc注入

2017-1-23 10:04
9799

由于某进程的一些地址存放在teb结构中TlsSlots处,所以就想到了apc注入(如果有其它好的方法请大神告知),我就在ring3层插入了apc,但是发现apc插入成功了但是apc队列的函数并没有得到执行。所以只能在ring0层搞事了,网上找了一些内核层apc注入的代码主要的就是将下面的代码映射到指定的线程中去。
                mov rax, 1111111122222222h                                       
                mov rcx, 2222222211111111h       

                sub rsp, 28h                                                                                                                                                                       
                call rax                                                                                                                                                                                       
                add rsp, 28h                                                                                                                                                                       
               
                jmp END1                                                                                                                                                                               
                       
                nop                                                ;nop占的内存必须要能存放dll的全路径                       
                nop
                nop
                nop
                nop
                nop
                nop
                nop

看了一些代码全部都是用的mdl的方式映射内存到应用层去,然后我也尝试着做了。发现apc插入成功了,内存也映射成功了,_KTHREAD中Alertable也改成TRUE了。但tmd  APC队列的函数还是没得到执行,这TM就尴尬了。在看雪发帖问了下,一大佬回了个UserApcPending,然后百度搜了下,发现在win7中必须将该变量也要改写成TRUE。 然后APC队列的函数就正常开始执行了,但是执行我自己的插入的函数时候居然产生异常,windbg查看了一下地址发现映射的内存页没有EXCUTE权限,然后我用NtProtectVirtualMemory尝试改变页属性,但是返回 非法访问。问了下群里的大佬,大佬说 mdl映射的内存没有执行权限,NtProtectVirtualMemory不能修改MDL映射的内存,这个我也没验证过。最后只能用ZwAllocateVirtualMemory在指定的进程直接分配一片内存了。到此内核apc注入在win7上就能正常注入了。 说了这么多废话大致就下面几点:
1.APC插入成功后要改变_ETHREAD结构体中Alertable和UserApcPending
2. MDL映射的没有执行权限(不知道网上用mdl映射方式为什么能执行?)
3.需要映射函数的内存构造

最后如果大佬们有什么方法能用非注入的方式读取指定线程的teb结构中的值望告知。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (12)
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
1.这个是常识了。。
2.MDL在NT5上还是可执行的,但是到了NT6上就不可执行了~用MDL映射内存的坑一般都是抄老代码抄出来的
2017-1-23 10:22
0
雪    币: 70
活跃值: (1367)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
就是不知道所以掉坑里了
2017-1-23 10:25
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
4
3.这个方法多此一举啊

还是ZwCreateThreadEx大法好啊
2017-1-23 10:44
0
雪    币: 70
活跃值: (1367)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
因为要插入到指定线程中去所以只想到了apc,ZwCreateThreadEx创建新线程后还是获取不到其它线程teb结构中的东西
2017-1-23 10:52
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
线程TEB结构 不可以直接读?      看不懂
2017-1-23 13:50
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
7
获取TEB直接ZwQueryInformationThread +  ThreadBasicInformation,THREAD_BASIC_INFORMATION结构里面直接就有TebBaseAddress
2017-1-23 15:25
0
雪    币: 70
活跃值: (1367)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
soga  谢了  我试看看
2017-1-23 17:23
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
根本不需要修改什么UserApcPending域
你可以强制delivery APC
方法就是在APC回调函数调用 KeTestAlertThread(UserMode);(win7或以上)
xp就用

KeInitializeEvent(&Event,NotificationEvent,FALSE);
                Timeout.QuadPart = 0LL - 3LL * (10LL * 1000LL* 1000LL);
                KeWaitForSingleObject(&Event,WrYieldExecution,UserMode, TRUE, &Timeout);
                KeDelayExecutionThread(KernelMode, FALSE, &Timeout);
                KeStallExecutionProcessor(1);
2017-1-23 18:41
0
雪    币: 70
活跃值: (1367)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
KeTestAlertThread  这个函数里面应该也是改变这两个成员变量吧
2017-1-24 10:13
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
没错

BOOLEAN
KeTestAlertThread (
    __in KPROCESSOR_MODE AlertMode
    )

/*++

Routine Description:

    This function tests to determine if the alerted variable for the
    specified processor mode has a value of TRUE or whether a user mode
    APC should be delivered to the current thread.

Arguments:

    AlertMode - Supplies the processor mode which is to be tested
        for an alerted condition.

Return Value:

    The previous state of the alerted variable for the specified processor
    mode.

--*/

{

    BOOLEAN Alerted;
    KLOCK_QUEUE_HANDLE LockHandle;
    PKTHREAD Thread;

    ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);

    //
    // Raise IRQL to SYNCH_LEVEL and acquire the thread APC queue lock.
    //

    Thread = KeGetCurrentThread();
    KeAcquireInStackQueuedSpinLockRaiseToSynch(&Thread->ApcQueueLock,
                                               &LockHandle);

    //
    // If the current thread is alerted for the specified processor mode,
    // then clear the alerted state. Else if the specified processor mode
    // is user and the current thread's user mode APC queue contains an
    // entry, then set user APC pending.
    //

    Alerted = Thread->Alerted[AlertMode];
    if (Alerted == TRUE) {
        Thread->Alerted[AlertMode] = FALSE;

    } else if ((AlertMode == UserMode) &&
              (IsListEmpty(&Thread->ApcState.ApcListHead[UserMode]) != TRUE)) {

        Thread->ApcState.UserApcPending = TRUE;
    }

    //
    // Release the thread APC queue lock, lower IRQL to its previous value,
    // and return the previous alerted state for the specified mode.
    //

    KeReleaseInStackQueuedSpinLock(&LockHandle);
    return Alerted;
}
2017-1-29 10:46
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
  嗨,猜猜我是谁
2017-1-31 20:14
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
13
看头像是TA?。。。。。。
2017-1-31 21:53
0
游客
登录 | 注册 方可回帖
返回
//