- 注册时间
- 2021-4-16
- 最后登录
- 2024-3-13
- 在线时间
- 4 小时
编程入门
- 龙马币
- 70
|
上一边帖子里回顾了一下内核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。
文章内容较多,感兴趣的同学,回复后继续学习。。。。
|
|