找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 9882|回复: 10

【紫水晶首发】VB小子玩转驱动程序(6):结束线程

 火.. [复制链接]

6

主题

196

回帖

0

精华

铜牌会员

菜鸟

积分
52
发表于 2010-1-25 15:24:42 | 显示全部楼层 |阅读模式
本帖最后由 xiaoly99 于 2014-7-10 20:41 编辑

      VB小子玩转驱动程序(6):结束线程


作者:0.0
  


①.准备工具
     WinDbg和未导出函数符号包
     未下载请打开:http://www.m5home.com/bbs/thread-3442-1-1.html
1.前提
     本例使用了未导出函数PspExitThread,未导出函数KiInsertQueueApc经测试容易蓝屏,所以使用导出函数KeInsertQueueApc.
系统调用列表:NtTerminateProcess -> XXX -> PspTermianteThreadByPointer ->KeInsertQueueApc ->KiINsertQueueApc -> InsertHeadList -> PspExitThread
2.获得PspExitThread地址
     PspExitThread貌似不被任何一个已导出函数调用,本例中通过查找未导出函数PspTerminateThreadByPointerAddr中,而PspTerminateThreadByPointerAddr被导出函数PsTerminateSystemThread调用.
lkd> u PsTerminateSystemThread l 10
nt!PsTerminateSystemThread:
805c9f74 8bff            mov     edi,edi
805c9f76 55              push    ebp
805c9f77 8bec            mov     ebp,esp
805c9f79 64a124010000    mov     eax,dword ptr fs:[00000124h]
805c9f7f f6804802000010  test    byte ptr [eax+248h],10h
805c9f86 7507            jne     nt!PsTerminateSystemThread+0x1b (805c9f8f)
805c9f88 b80d0000c0      mov     eax,0C000000Dh
805c9f8d eb09            jmp     nt!PsTerminateSystemThread+0x24 (805c9f98)
805c9f8f ff7508          push    dword ptr [ebp+8]
805c9f92 50              push    eax
805c9f93 e828fcffff      call    nt!PspTerminateThreadByPointer (805c9bc0)
注意:为什么用红色标注了两句呢?因为特征码是两句,特征码是50e8########,按照ULONG的读法就是e850########
驱动代码:

PVOID GetFunctionAddr(IN PCWSTR FunctionName){UNICODE_STRING UniCodeFunctionName;RtlInitUnicodeString(&UniCodeFunctionName,FunctionName);return MmGetSystemRoutineAddress(&UniCodeFunctionName);}
PUCHAR GetPspTerminateThreadByPointerAddr();
{
int i = 0;
PUCHAR psExitSystemThreadAddr = (PUCHAR)GetFunctionAddr(L"PsTerminateSystemThread");//获得函数地址
for ( i=0; i<= 0x50; i++)
{
  psExitSystemThreadAddr ++;
  if ( *(PWCHAR)psExitSystemThreadAddr == 0xe850 )//校验特征码
  {
   psExitSystemThreadAddr++;
   return (PUCHAR)((ULONG)psExitSystemThreadAddr + 5 + *(PULONG)(psExitSystemThreadAddr + 1));//返回地址
   break;
  }
}

return;
}
lkd> u PspTerminateThreadByPointer l 20
nt!PspTerminateThreadByPointer:
805c9bc0 8bff            mov     edi,edi
805c9bc2 55              push    ebp
805c9bc3 8bec            mov     ebp,esp
805c9bc5 83ec0c          sub     esp,0Ch
..............................................
805c9c0a ff750c          push    dword ptr [ebp+0Ch]
805c9c0d e87af7ffff      call    nt!PspExitThread (805c938c)
按照ULONG读出特征码就是0xe80C75FF
驱动代码:

PVOID GetPspExitThread()
PUCHAR PspTerminateThreadByPointerAddr = NULL;
int i = 0;

PspTerminateThreadByPointerAddr = GetPspTerminateThreadByPointerAddr();
for ( i = 0; i<= 0x50; i++)
{
  PspTerminateThreadByPointerAddr ++;
  if ( *(PULONG)PspTerminateThreadByPointerAddr == 0xe80C75FF)
  {
   PspTerminateThreadByPointerAddr++;
   PspTerminateThreadByPointerAddr++;
   PspTerminateThreadByPointerAddr++;
   return (PSPEXITTHREAD)( (ULONG)PspTerminateThreadByPointerAddr + 5 + *(PULONG)(PspTerminateThreadByPointerAddr +1) );
   break;
  }
}

return;
}
3.调用(结束线程)
先声明:

NTKERNELAPI VOID KeInitializeApc (PRKAPC Apc,PKTHREAD Thread,KAPC_ENVIRONMENT Environment,PKKERNEL_ROUTINE KernelRoutine,PKRUNDOWN_ROUTINE RundownRoutine,PKNORMAL_ROUTINE NormalRoutine,KPROCESSOR_MODE ApcMode,PVOID NormalContext);
NTKERNELAPI BOOLEAN KeInsertQueueApc(IN PKAPC Apc,IN PVOID SystemArgument1,IN PVOID SystemArgument2,IN KPRIORITY PriorityBoost);
typedef VOID (*PSPEXITTHREAD)(IN NTSTATUS ExitStatus);
PSPEXITTHREAD PspExitThread = NULL;
代码和注释:
VOID KernelTerminateThreadRoutine(IN PKAPC Apc,IN OUT PKNORMAL_ROUTINE *NormalRoutine,IN OUT PVOID *NormalContext,IN OUT PVOID *SystemArgument1,IN OUT PVOID *SystemArgument2)
{
   PspExitThread(0);//结束自身线程 因为已经通过Apc进行Attach到内部Exit的YY操作
}
VOID TerminateThread(PETHREAD Thread)
{
    PKAPC Apc=NULL;
    Apc=ExAllocatePool(NonPagedPool,sizeof(KAPC));//分配Apc内存
GetPspExitThreadAddr();//获得地址
KeInitializeApc(Apc,(PKTHREAD)Thread,OriginalApcEnvironment,KernelTerminateThreadRoutine,NULL,NULL,KernelMode,NULL); //初始化Apc
KeInsertQueueApc(Apc,0,0,0);//插Apc
    ExFreePool(Apc);
}

评分

参与人数 2水晶币 +50 收起 理由
zouxiaofei + 10 很给力!
HoviDelphic + 40

查看全部评分

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-1-25 15:42:45 | 显示全部楼层
不用这么狠吧,结束个线程就PspExitThread?
如果附件无法下载,请点击这里

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-1-25 15:45:27 | 显示全部楼层
加个for循环就能结束进程了
如果附件无法下载,请点击这里

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-1-25 15:47:06 | 显示全部楼层
本帖最后由 HoviDelphic 于 2010-1-25 15:53 编辑

你的前途不可估量!你才11岁啊!
如果附件无法下载,请点击这里

6

主题

196

回帖

0

精华

铜牌会员

菜鸟

积分
52
 楼主| 发表于 2010-1-25 15:48:04 | 显示全部楼层
狠是狠了点 对于网上某些Hook PspExitThread的YY程序.......IceFreak内部是加了恢复的

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-1-25 15:55:24 | 显示全部楼层
狠是狠了点 对于网上某些Hook PspExitThread的YY程序.......IceFreak内部是加了恢复的
xiaoly99 发表于 2010-1-25 15:48



    我还真的没见过这样的YY程序。
如果附件无法下载,请点击这里
本网站最菜的人 该用户已被删除
发表于 2010-1-29 21:10:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-1-29 21:49:21 | 显示全部楼层
WP是什么?
如果附件无法下载,请点击这里
本网站最菜的人 该用户已被删除
发表于 2010-1-29 22:22:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

6

主题

196

回帖

0

精华

铜牌会员

菜鸟

积分
52
 楼主| 发表于 2010-1-30 14:50:11 | 显示全部楼层
回复 9# 本网站最菜的人
那是MP吧 又不是WeiPoint
  1. lkd> u keterminatethread l 25
  2. nt!KeTerminateThread:
  3. 804fce90 8bff mov edi,edi
  4. 804fce92 55 push ebp
  5. 804fce93 8bec mov ebp,esp
  6. 804fce95 83ec10 sub esp,10h
  7. 804fce98 56 push esi
  8. 804fce99 57 push edi
  9. 804fce9a 64a124010000 mov eax,dword ptr fs:[00000124h]
  10. 804fcea0 8bf0 mov esi,eax
  11. 804fcea2 8b7e44 mov edi,dword ptr [esi+44h]
  12. 804fcea5 8d4f58 lea ecx,[edi+58h]
  13. 804fcea8 8d55f0 lea edx,[ebp-10h]
  14. 804fceab ff1590864d80 call dword ptr [nt!_imp_KeAcquireInStackQueuedSpinLockRaiseToSynch (804d8690)]
  15. 804fceb1 a120b25580 mov eax,dword ptr [nt!PsReaperList (8055b220)]
  16. 804fceb6 8986dc010000 mov dword ptr [esi+1DCh],eax
  17. 804fcebc 803d24b2558000 cmp byte ptr [nt!PsReaperActive (8055b224)],0
  18. 804fcec3 893520b25580 mov dword ptr [nt!PsReaperList (8055b220)],esi
  19. 804fcec9 7518 jne nt!KeTerminateThread+0x53 (804fcee3)
  20. 804fcecb 6a00 push 0
  21. 804fcecd ba10b25580 mov edx,offset nt!PsReaperWorkItem (8055b210)
  22. 804fced2 b9b8c15580 mov ecx,offset nt!ExWorkerQueue+0x78 (8055c1b8)
  23. 804fced7 c60524b2558001 mov byte ptr [nt!PsReaperActive (8055b224)],1
  24. 804fcede e8e7f4ffff call nt!KiInsertQueue (804fc3ca)
  25. 804fcee3 8b8ee4000000 mov ecx,dword ptr [esi+0E4h]
  26. 804fcee9 85c9 test ecx,ecx
  27. 804fceeb 7415 je nt!KeTerminateThread+0x72 (804fcf02)
  28. 804fceed 8d8618010000 lea eax,[esi+118h]
  29. 804fcef3 8b10 mov edx,dword ptr [eax]
  30. 804fcef5 8b4004 mov eax,dword ptr [eax+4]
  31. 804fcef8 8910 mov dword ptr [eax],edx
  32. 804fcefa 894204 mov dword ptr [edx+4],eax
  33. 804fcefd e828f1ffff call nt!KiActivateWaiterQueue (804fc02a)
  34. 804fcf02 8d4608 lea eax,[esi+8]
  35. 804fcf05 3900 cmp dword ptr [eax],eax
  36. 804fcf07 c7460401000000 mov dword ptr [esi+4],1
  37. 804fcf0e 740a je nt!KeTerminateThread+0x8a (804fcf1a)
  38. 804fcf10 8b5508 mov edx,dword ptr [ebp+8]
  39. 804fcf13 8bce mov ecx,esi
复制代码

哪有PspExitThread?

评分

参与人数 1 +40 收起 理由
HoviDelphic + 40 syf那小子经常胡言乱语,别理他。

查看全部评分

0

主题

4

回帖

0

精华

初来乍到

积分
16
发表于 2012-3-20 17:07:29 | 显示全部楼层
不懂 继续学习
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表