26 12
发新话题
打印

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

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

文章作者:炉子[0GiNr]
信息来源:邪恶八进制信息安全团队(www.eviloctal.com
引用:
/*
        TerminateThread.c
        By 炉子[0GiNr]
        http://hi.baidu.com/breakinglove_
        http://0ginr.com
*/

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

typedef enum _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
         );  

#define PS_CROSS_THREAD_FLAGS_SYSTEM 0x00000010UL

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

  
for (cPtr = (PUCHAR)PsTerminateSystemThread;
    cPtr < (PUCHAR)PsTerminateSystemThread + 0x100;
    cPtr += Length)
  {
    Length = SizeOfCode(cPtr, &pOpcode);

   
if (!Length) break;  
   
if (*(USHORT *)pOpcode == 0x80F6) //f6804802000010 test byte ptr [eax+248h],10h
   
{
      Offset=*(USHORT *)((ULONG)pOpcode+2);
      
return Offset;
      
//break;
   
}
  }
  
return 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(
"[TerminateThread] KernelTerminateThreadRoutine.\n");
  ExFreePool(Apc);
  
if (ThreadFlagsOffset)
  {
    ThreadFlags=(ULONG *)((ULONG)(PsGetCurrentThread())+ThreadFlagsOffset);
    *ThreadFlags=(*ThreadFlags)|PS_CROSS_THREAD_FLAGS_SYSTEM;
    PsTerminateSystemThread(STATUS_SUCCESS);
//o(∩_∩)o
  
}
  
else
  
{
   
//failed :&#39;(
  
}
  
return; //never be here
}

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

VOID DriverUnload(PDRIVER_OBJECT pDriverObj)
{  
  DbgPrint(
"[TerminateThread] Unloaded\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
  DbgPrint(
"[TerminateThread] DriverEntry.\n");
  TerminateThread((PETHREAD)0xff6f3c70);
// for test
  
pDriverObj->DriverUnload = DriverUnload;
  
return STATUS_SUCCESS; //do NOT return an unsuccessful value here, or you need to wait for apc routine return.
}
本帖最近评分记录
  • 认真的雪 威望 +10 好滴东西,竟然一直漏看到了 2008-4-14 20:54
EST的头像都引人遐想

TOP

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

炉子的这招儿就不好使咯
WINDOWS内核疯狂爱好者

TOP

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

btw:还是没混到X片区权限- -!
EST的头像都引人遐想

TOP

大米那个猫头怎么看怎么ws啊 - -!
EST的头像都引人遐想

TOP

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

btw:还是没混到X片区权限- -!
为啥过啊?

你滴code中投递APC使线程自杀.最终还是经过PspTerminateThreadByPointer的呀.
inline hook咋能pass 啊
WINDOWS内核疯狂爱好者

TOP

噢,,对了。。忘记了汗。。。 老记得我调用的是PspExitThread - -! 汗。。。 以前写simple taskmgr是PspExitThread的- -! 忘了。。忘了。。
EST的头像都引人遐想

TOP

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

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

学习
WINDOWS内核疯狂爱好者

TOP

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

btw:还是没混到X片区权限- -!
这里没有"世外桃园",更米传说中的X片区哦...
游戏吧  http://www.game8.cc/MyBlog    http://www.asm32.cn

TOP

引用:
引用第2楼炉子于2008-01-30 20:21发表的 :
PspTerminateThreadByPointer没必要全bin搜索,你u下PsTerminateSystemThread就明白了。
汗,是呀.反正PsTerminateSystemThread已经导出了. 在它地址的基础上搜索出特征码就可以了...
引用:
nt!PsTerminateSystemThread:
808a622d 8bff      mov   edi,edi // 2字节nop
808a622f 55       push  ebp
808a6230 8bec      mov   ebp,esp
808a6232 64a124010000  mov   eax,dword ptr fs:[00000124h] // 当前ETHREAD
808a6238 f6804802000010 test  byte ptr [eax+248h],10h// 判断PS_CROSS_THREAD_FLAGS_SYSTEM
808a623f 0f8464cf0700  je   nt!PsTerminateSystemThread+0x14 (809231a9)
808a6245 ff7508     push  dword ptr [ebp+8]  // 压入参数2 ExitStatus
808a6248 50       push  eax         // 压入参数1 PsGetCurrentThread()
808a6249 e8b5e4ffff   call  nt!PspTerminateThreadByPointer (808a4703)// 这就是了=。=!
嘿嘿. copy你的.

for (cPtr = (PUCHAR)PsTerminateSystemThread;
   cPtr < (PUCHAR)PsTerminateSystemThread + 0x100;
   cPtr += Length) {

    Length = SizeOfCode(cPtr, &pOpcode);

    if (!Length) break;  
    if (*(BYTE *)pOpcode == 0xe8) {
      
      // e8b5e4ffff call nt!PspTerminateThreadByPointer (808a4703) +。+|
      Offset=*(USHORT *)((ULONG)pOpcode+1);
      return Offset;
      //break;
    }
}

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

炉子名言: 很爽很舒服

此帖不赚个精华真是可惜了啊
WINDOWS内核疯狂爱好者

TOP

引用:
nt!PsTerminateSystemThread:
808a622d 8bff      mov  edi,edi
808a622f 55       push  ebp
808a6230 8bec      mov  ebp,esp // 5字节nop
理解为5字节nop不好啊不好。。

push ebp  mov ebp,esp都是有实际意义的啊实际意义
EST的头像都引人遐想

TOP

hook ExAcquireRundownXXXX
[EST VIP] VXK/CVC.GB

TOP

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

理解为5字节nop不好啊不好。。
好吧.2字节滴nop...
ebp保存当前esp...
引用:
vxk:

hook ExAcquireRundownXXXX
不懂啊, 没有见过这个神秘的函数啊ExAcquireRundownXXXX
WINDOWS内核疯狂爱好者

TOP

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

TOP

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

TOP

引用:
引用第13楼evilsir于2008-02-01 10:37发表的 :
都快把PspTerminateXXXByXXX实现一遍了。其实核心还在PspExitXXX....
PsTerminateSystemThread(STATUS_SUCCESS); 这句是败笔...
APC不够猥琐,有很大弊端,XXXattachXXX才是王道...
继续inine hook KiAttachProcess 、KiReadyXXXX、KiSwapThXXX、KiSwapPrXXX
让您attach吧,让gz1x牛attach啊,让evilsir attach呀...
WINDOWS内核疯狂爱好者

TOP

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

继续inine hook KiAttachProcess 、KiReadyXXXX、KiSwapThXXX、KiSwapPrXXX
让您attach吧,让gzx1牛attach啊,让evilsir attach呀... [attach]12648[/attach]
要比谁流氓,谁猥琐,看楼上VXK...
我早也说过,想单靠一种XX方法,是不行的不行的...inline hook也把你拔了...
期待大米放个anti出来,我的gzck等着...

TOP

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


要比谁流氓,谁猥琐,看楼上VXK...
我早也说过,想单靠一种XX方法,是不行的不行的...inline hook也把你拔了...
期待大米放个anti出来,我的gzck等着...
.......
俺是菜鸟....
gz1x放demo,俺来IDA看看.顺便偷偷学习
WINDOWS内核疯狂爱好者

TOP

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


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

TOP

强大的CV啊...

以后放demo的大牛们要是都这样就和谐了
WINDOWS内核疯狂爱好者

TOP

R, V大说的原来是  HOOK ExAcquireRundownProtection

真邪恶
WINDOWS内核疯狂爱好者

TOP

汗,一直不知道Psp系列的函数会检查ExAcquireXXX
EST的头像都引人遐想

TOP

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

TOP

看来ls的帖子偶还是不知道psp会ExAcXXX
EST的头像都引人遐想

TOP

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

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

5555~
WINDOWS内核疯狂爱好者

TOP

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

找半天找到一份有乱码的 乱码鸟语看不懂,谁能提供一份?呼唤炉子。。。
众人都在假装正经,我唯有假装不正经了。

TOP

 26 12
发新话题