Iverson333 发表于 2018-2-28 11:51:30

讲解内核APC结合内存加载实现无模块注入附源码


上一边帖子里回顾了一下内核APC注入,代码有个地方欠妥,就没有选择合适的线程去注入,这里做了如下修改
      if (*(PULONG)((PCHAR)ethreAd + TCB_TEB_OFFSET) != 0 //teb!=0
            && *((PUCHAR)ethreAd + 0x068) == 0x5 //state=5
            && *(PULONG)((PCHAR)ethreAd + 0x06c) == 0 //waitstatus=0
            && (((*(PULONG)((PCHAR)ethreAd + ALERTABLE_OFFSET) >> 5) & 1) == 1)) //alertable=1
      {
            KdPrint(("target ethreAd: 0x%x\n", ethreAd));
            break;
      }

因为我们是在进程已经存在的时候注入的,我们需要选择处于等待状态而且可唤醒的线程,但是我们最好不要手动去设置UserApcPending,这样肯定会有问题
      else if ((Thread->State == Waiting) &&
                  (Thread->WaitMode == UserMode) &&
                  (Thread->Alertable || Thread->ApcState.UserApcPending)) {

            Thread->ApcState.UserApcPending = TRUE;
            KiUnwaitThread(Thread, STATUS_USER_APC, Increment);
      }

这一段是wrk里一部分插入用户apc的代码,可以看到如过我们找到的线程合适,这里系统会自动设置这个值,而线程返回用户层时在KiServiceExit中系统会检查这个 UserApcPending,如果true才会执行用户apc。如果我们强行吧 UserApcPending置为true线程将会被强制唤醒,唤醒的原因就是STATUS_USER_APC,那么如果这个线程是不能被唤醒的,比方说他在等待另一个线程执行某个操作后才能走下去,那么此时他肯定会崩溃,就是一开始玩apc的时候经常把进程插崩掉的原因之一。另外就是这个waitstatus=0,应该是代表等待成功?这里我也没摸清具体是啥意思,只是在测试的时候这个状态为0的时候注入就没问题,各位老铁知道的话跟我讲讲啊0,0。

文章内容较多,感兴趣的同学,回复后继续学习。。。。

**** Hidden Message *****

675550115 发表于 2018-5-21 18:07:50

看看啊!~!!!!

2581559949 发表于 2018-5-29 23:11:13

WIN7下,隐藏隐藏进程之进程链表断链。 [复制链接]

efeel 发表于 2018-6-30 14:51:15

看看后面的内容

82207007 发表于 2018-8-8 17:07:17

RE: 讲解内核APC结合内存加载实现无模块注入附源码 [修改]

arvinking 发表于 2019-9-26 17:30:39

支持7和10嘛

861607619 发表于 2020-2-20 19:24:23

49999999999999999999999999999999999999

redx 发表于 2020-2-20 22:30:16

刚接触注入这一块看看前辈留的笔记

redx 发表于 2020-2-20 22:33:17

前辈的代码写的很好 晚辈还是看不懂 要多学学了

794654607 发表于 2020-6-30 13:56:41

来看看
消息队列发现
页: [1] 2
查看完整版本: 讲解内核APC结合内存加载实现无模块注入附源码