邪恶八进制信息安全团队技术讨论组's Archiver

炉子 2008-1-29 21:32

[原创]一段杀线程的代码

文章作者:炉子[0GiNr]
信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])

[quote]
[font=宋体][color=#008000]/*
        TerminateThread.c
        By 炉子[0GiNr]
        [url]http://hi.baidu.com/breakinglove_[/url]
        [url]http://0ginr.com[/url]
*/

[/color][color=#0000FF]#include [/color][color=#800080]"ntddk.h"
[/color][color=#0000FF]#include [/color][color=#800080]"LDasm.h" [/color][color=#008000]//网上很多的,自己找一个好了。

[/color][color=#0000FF]typedef enum [/color][color=#808080]_KAPC_ENVIRONMENT {
  OriginalApcEnvironment,
  AttachedApcEnvironment,
  CurrentApcEnvironment,
  InsertApcEnvironment
} KAPC_ENVIRONMENT;

NTKERNELAPI
VOID
KeInitializeApc (
         PKAPC Apc,
         PETHREAD Thread,
         KAPC_ENVIRONMENT Environment,
         PKKERNEL_ROUTINE KernelRoutine,
         PKRUNDOWN_ROUTINE RundownRoutine,
         PKNORMAL_ROUTINE NormalRoutine,
         KPROCESSOR_MODE ProcessorMode,
         PVOID NormalContext
         );

NTKERNELAPI
BOOLEAN
KeInsertQueueApc (
         PKAPC Apc,
         PVOID SystemArgument1,
         PVOID SystemArgument2,
         KPRIORITY Increment
         );  

[/color][color=#0000FF]#define [/color][color=#808080]PS_CROSS_THREAD_FLAGS_SYSTEM 0x00000010UL

ULONG GetThreadFlagsOffset()
{
  UCHAR *cPtr, *pOpcode;
  ULONG Length;
  USHORT Offset;

  [/color][color=#0000FF]for [/color][color=#808080](cPtr = (PUCHAR)PsTerminateSystemThread;
    cPtr < (PUCHAR)PsTerminateSystemThread + 0x100;
    cPtr += Length)
  {
    Length = SizeOfCode(cPtr, &pOpcode);

    [/color][color=#0000FF]if [/color][color=#808080](!Length) [/color][color=#0000FF]break[/color][color=#808080];  
    [/color][color=#0000FF]if [/color][color=#808080](*(USHORT *)pOpcode == 0x80F6) [/color][color=#008000]//f6804802000010 test byte ptr [eax+248h],10h
    [/color][color=#808080]{
      Offset=*(USHORT *)((ULONG)pOpcode+2);
      [/color][color=#0000FF]return [/color][color=#808080]Offset;
      [/color][color=#008000]//break;
    [/color][color=#808080]}
  }
  [/color][color=#0000FF]return [/color][color=#808080]0;
}

VOID KernelTerminateThreadRoutine(
                 IN PKAPC Apc,
                 IN OUT PKNORMAL_ROUTINE *NormalRoutine,
                 IN OUT PVOID *NormalContext,
                 IN OUT PVOID *SystemArgument1,
                 IN OUT PVOID *SystemArgument2
                 )
{
  ULONG ThreadFlagsOffset=GetThreadFlagsOffset();
  PULONG ThreadFlags;
  DbgPrint([/color][color=#800080]"[TerminateThread] KernelTerminateThreadRoutine.\n"[/color][color=#808080]);
  ExFreePool(Apc);
  [/color][color=#0000FF]if [/color][color=#808080](ThreadFlagsOffset)
  {
    ThreadFlags=(ULONG *)((ULONG)(PsGetCurrentThread())+ThreadFlagsOffset);
    *ThreadFlags=(*ThreadFlags)|PS_CROSS_THREAD_FLAGS_SYSTEM;
    PsTerminateSystemThread(STATUS_SUCCESS); [/color][color=#008000]//o(∩_∩)o
  [/color][color=#808080]}
  [/color][color=#0000FF]else
  [/color][color=#808080]{
    [/color][color=#008000]//failed :&#39;(
  [/color][color=#808080]}
  [/color][color=#0000FF]return[/color][color=#808080]; [/color][color=#008000]//never be here
[/color][color=#808080]}

BOOLEAN TerminateThread(PETHREAD Thread)
{
  PKAPC Apc=NULL;
  BOOLEAN blnSucceed=FALSE;
  [/color][color=#0000FF]if [/color][color=#808080](!MmIsAddressValid(Thread)) [/color][color=#0000FF]return [/color][color=#808080]FALSE; [/color][color=#008000]//error.
  [/color][color=#808080]Apc=ExAllocatePool(NonPagedPool,[/color][color=#0000FF]sizeof[/color][color=#808080](KAPC));
  KeInitializeApc(Apc,
    Thread,
    OriginalApcEnvironment,
    KernelTerminateThreadRoutine,
    NULL,
    NULL,
    KernelMode,
    NULL); [/color][color=#008000]//special apc - whether alertable or not makes no difference..
  [/color][color=#808080]blnSucceed=KeInsertQueueApc(Apc,
    NULL,
    NULL,
    0);
  [/color][color=#008000]//add some code works like KeForceResumeThread here.
  [/color][color=#0000FF]return [/color][color=#808080]blnSucceed;
}

VOID DriverUnload(PDRIVER_OBJECT pDriverObj)
{  
  DbgPrint([/color][color=#800080]"[TerminateThread] Unloaded\n"[/color][color=#808080]);
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
  DbgPrint([/color][color=#800080]"[TerminateThread] DriverEntry.\n"[/color][color=#808080]);
  TerminateThread((PETHREAD)0xff6f3c70); [/color][color=#008000]// for test
  [/color][color=#808080]pDriverObj->DriverUnload = DriverUnload;
  [/color][color=#0000FF]return [/color][color=#808080]STATUS_SUCCESS; [/color][color=#008000]//do NOT return an unsuccessful value here, or you need to wait for apc routine return.
[/color][color=#808080]}
[/color][/font][/quote]

sudami 2008-1-30 20:08

顺着ntoskrnl.exe (ntkrnlpa.exe)找到PspTerminateThreadByPointer的地址,inline hook之,

炉子的这招儿就不好使咯 [attach]1343[/attach]

炉子 2008-1-30 20:21

这套过PspTerminateThreadByPointer的hook。
PspTerminateThreadByPointer没必要全bin搜索,你u下PsTerminateSystemThread就明白了。

btw:还是没混到X片区权限- -!

炉子 2008-1-30 20:22

大米那个猫头怎么看怎么ws啊 - -!

sudami 2008-1-30 20:25

[quote]引用第2楼炉子于2008-01-30 20:21发表的 :
这套过PspTerminateThreadByPointer的hook。
PspTerminateThreadByPointer没必要全bin搜索,你u下PsTerminateSystemThread就明白了。

btw:还是没混到X片区权限- -![/quote]


为啥过啊?

你滴code中投递APC使线程自杀.最终还是经过PspTerminateThreadByPointer的呀.
inline hook咋能pass 啊[s:289]

炉子 2008-1-30 20:30

噢,,对了。。忘记了汗。。。 老记得我调用的是PspExitThread - -! 汗。。。 以前写simple taskmgr是PspExitThread的- -! 忘了。。忘了。。

sudami 2008-1-31 08:47

嘿嘿,调用PspExitThread...确实猥亵.
不过杀杀IS等,直接调用PspTerminateProcess就够了.

炉子这代码能搞定大部分ARK咯~~

学习 [s:238]

asm 2008-1-31 09:08

[quote]引用第2楼炉子于2008-01-30 20:21发表的

btw:还是没混到X片区权限- -![/quote]



[s:264]这里没有"世外桃园",更米传说中的X片区哦...[s:264]

sudami 2008-1-31 18:00

[quote]引用第2楼炉子于2008-01-30 20:21发表的 :
PspTerminateThreadByPointer没必要全bin搜索,[b]你u下PsTerminateSystemThread[/b]就明白了。
[/quote]

汗,是呀.反正PsTerminateSystemThread已经导出了. 在它地址的基础上搜索出特征码就可以了...

[quote]nt!PsTerminateSystemThread:
808a622d 8bff      [color=#0000D0]mov[/color]   [color=#FF0000]edi[/color],[color=#FF0000]edi[/color] [color=#008000]// 2字节nop[/color]
808a622f 55       [color=#0000D0]push[/color]  [color=#FF0000]ebp[/color]
808a6230 8bec      [color=#0000D0]mov[/color]   [color=#FF0000]ebp[/color],[color=#FF0000]esp[/color]
808a6232 64a124010000  [color=#0000D0]mov[/color]   [color=#FF0000]eax[/color],dword ptr [color=#FF0000]fs[/color]:[00000124h] [color=#008000]// 当前ETHREAD[/color]
808a6238 f6804802000010 [color=#0000D0]test[/color]  byte ptr [[color=#FF0000]eax[/color]+248h],10h[color=#008000]// 判断PS_CROSS_THREAD_FLAGS_SYSTEM[/color]
808a623f 0f8464cf0700  [color=#0000D0]je[/color]   nt!PsTerminateSystemThread+0x14 (809231a9)
808a6245 ff7508     [color=#0000D0]push[/color]  dword ptr [[color=#FF0000]ebp[/color]+8]  [color=#008000]// 压入参数2 ExitStatus[/color]
808a6248 50       [color=#0000D0]push[/color]  [color=#FF0000]eax[/color]         [color=#008000]// 压入参数1 PsGetCurrentThread()[/color]
808a6249 e8b5e4ffff   [color=#0000D0]call[/color]  nt!PspTerminateThreadByPointer (808a4703)[color=#008000]// 这就是了=。=![/color][/quote]

嘿嘿. copy你的.

[color=#0000D0]for[/color] (cPtr = ([color=#0000D0]PUCHAR[/color])PsTerminateSystemThread;
   cPtr < ([color=#0000D0]PUCHAR[/color])PsTerminateSystemThread + 0x100;
   cPtr += Length) {

    Length = SizeOfCode(cPtr, &pOpcode);

    [color=#0000D0]if[/color] (!Length) [color=#0000D0]break[/color];  
    [color=#0000D0]if[/color] (*([color=#0000D0]BYTE[/color] *)pOpcode == [b][size=7]0xe8[/size][/b]) {
      
      [color=#008000]// e8b5e4ffff call nt!PspTerminateThreadByPointer (808a4703) +。+|[/color]
      Offset=*([color=#0000D0]USHORT[/color] *)(([color=#0000D0]ULONG[/color])pOpcode+1);
      [color=#0000D0]return[/color] Offset;
      [color=#008000]//break;[/color]
    }
}

哈哈.发现利用ntoskrnl已经导出的函数来找未导出的函数真方便. 有些全局变量也是...

炉子名言: 很爽很舒服 [attach]1345[/attach]

此帖不赚个精华真是可惜了啊[s:267]

炉子 2008-1-31 19:19

[quote]nt!PsTerminateSystemThread:
808a622d 8bff      mov  edi,edi
808a622f 55       push  ebp
808a6230 8bec      mov  ebp,esp // 5字节nop[/quote]

理解为5字节nop不好啊不好。。

push ebp  mov ebp,esp都是有实际意义的啊实际意义

vxk 2008-2-1 05:41

hook ExAcquireRundownXXXX

sudami 2008-2-1 07:03

[quote]引用第9楼炉子于2008-01-31 19:19发表的 :

理解为5字节nop不好啊不好。。
[/quote]

好吧.2字节滴nop...
ebp保存当前esp...[s:267]


[quote]vxk:

hook ExAcquireRundownXXXX[/quote]

不懂啊, 没有见过这个神秘的函数啊[b]ExAcquireRundownXXXX[/b]

zaroty 2008-2-1 09:42

炉子你不是想在X区发帖啊。。我有方法啊,虽然以我现在的技术是从来都没有奢望过能发帖的,但是我想你是可以的啊。
第一步:找出在邪恶八进制的5个荣誉会员。
第二步:找出它们的联系方式。
第三步:写一个操作系统。
第四步:把你的操作系统的源码发给他们5个。
第五步:让他们推荐你成为荣誉会员。
第六步:等谁谁通过。
然后你就行了饿。。。。。。就可以发帖了。。。。
[s:264]

evilsir 2008-2-1 10:37

都快把PspTerminateXXXByXXX实现一遍了。其实核心还在PspExitXXX....
代码里有几句XXX是败笔...
APC不够猥琐,有很大弊端,XXXattachXXX才是王道...

sudami 2008-2-1 10:53

[quote]引用第13楼evilsir于2008-02-01 10:37发表的 :
都快把PspTerminateXXXByXXX实现一遍了。其实核心还在PspExitXXX....
PsTerminateSystemThread(STATUS_SUCCESS); 这句是败笔...
APC不够猥琐,有很大弊端,XXXattachXXX才是王道...[/quote]

继续inine hook [b]KiAttachProcess 、KiReadyXXXX、KiSwapThXXX、KiSwapPrXXX[/b]
让您attach吧,让gz1x牛attach啊,让evilsir attach呀... [attach]1346[/attach]

evilsir 2008-2-1 11:01

[quote]引用第14楼sudami于2008-02-01 10:53发表的 :

继续inine hook [b]KiAttachProcess 、KiReadyXXXX、KiSwapThXXX、KiSwapPrXXX[/b]
让您attach吧,让gzx1牛attach啊,让evilsir attach呀... [attach]12648[/attach][/quote]

要比谁流氓,谁猥琐,看楼上VXK...
我早也说过,想单靠一种XX方法,是不行的不行的...inline hook也把你拔了...
期待大米放个anti出来,我的gzck等着...
[s:270]

sudami 2008-2-1 11:03

[quote]引用第15楼evilsir于2008-02-01 11:01发表的 :


要比谁流氓,谁猥琐,看楼上VXK...
我早也说过,想单靠一种XX方法,是不行的不行的...inline hook也把你拔了...
期待大米放个anti出来,我的gzck等着...
.......[/quote]

俺是菜鸟....
gz1x放demo,俺来IDA看看.顺便偷偷学习[s:265]

evilsir 2008-2-1 11:19

[quote]引用第16楼sudami于2008-02-01 11:03发表的 :


俺是菜鸟....
gz1x放demo,俺来IDA看看.顺便偷偷学习[s:265][/quote]

就事论事而已,每种XX都是有优有劣,就这个意思。
我学习来的...很久不摸内核方面了,没水平放...怕大牛们笑话。
不过CV这东西真不错,IDA直接pass。。。

sudami 2008-2-1 13:02

强大的CV啊...

以后放demo的大牛们要是都这样就和谐了 [s:289]

sudami 2008-2-1 15:01

R, V大说的原来是  HOOK [b]ExAcquireRundownProtection[/b]

真邪恶 [s:275]

炉子 2008-2-1 18:27

汗,一直不知道Psp系列的函数会检查ExAcquireXXX

evilsir 2008-2-1 20:21

楼上两位还是有空自己IDA吧...谁说Psp系列会检查ExAcquireXXX了?Hook了又怎么个邪恶?内核也就是比谁更猥琐更底层而已。
VXK牛给的只是猥琐的思路,怎么XX还得绕着来。
防止被杀只要对函数钻空子,很容易让这些方法失效。

炉子 2008-2-1 20:27

看来ls的帖子偶还是不知道psp会ExAcXXX

sudami 2008-2-2 08:21

[quote]引用第21楼evilsir于2008-02-01 20:21发表的 :
楼上两位还是有空自己IDA吧...谁说Psp系列会检查ExAcquireXXX了?Hook了又怎么个邪恶?内核也就是比谁更猥琐更底层而已。
VXK牛给的只是猥琐的思路,怎么XX还得绕着来。
防止被杀只要对函数钻空子,很容易让这些方法失效。[/quote]


严重学习.

俺只能一边IDA,一边WRK,再一边KD了.

5555~

l4bm0s 2008-4-4 10:27

#include "LDasm.h" //网上很多的,自己找一个好了。

找半天找到一份有乱码的:mad: 乱码鸟语看不懂,谁能提供一份?呼唤炉子。。。

l4bm0s 2008-4-4 10:50

修改了一下,可以用了:lol:

页: [1]
© 1999-2008 EvilOctal Security Team