[原创]一段杀线程的代码
文章作者:炉子[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 :'(
[/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] 顺着ntoskrnl.exe (ntkrnlpa.exe)找到PspTerminateThreadByPointer的地址,inline hook之,
炉子的这招儿就不好使咯 [attach]1343[/attach] 这套过PspTerminateThreadByPointer的hook。
PspTerminateThreadByPointer没必要全bin搜索,你u下PsTerminateSystemThread就明白了。
btw:还是没混到X片区权限- -! 大米那个猫头怎么看怎么ws啊 - -! [quote]引用第2楼炉子于2008-01-30 20:21发表的 :
这套过PspTerminateThreadByPointer的hook。
PspTerminateThreadByPointer没必要全bin搜索,你u下PsTerminateSystemThread就明白了。
btw:还是没混到X片区权限- -![/quote]
为啥过啊?
你滴code中投递APC使线程自杀.最终还是经过PspTerminateThreadByPointer的呀.
inline hook咋能pass 啊[s:289] 噢,,对了。。忘记了汗。。。 老记得我调用的是PspExitThread - -! 汗。。。 以前写simple taskmgr是PspExitThread的- -! 忘了。。忘了。。 嘿嘿,调用PspExitThread...确实猥亵.
不过杀杀IS等,直接调用PspTerminateProcess就够了.
炉子这代码能搞定大部分ARK咯~~
学习 [s:238] [quote]引用第2楼炉子于2008-01-30 20:21发表的
btw:还是没混到X片区权限- -![/quote]
[s:264]这里没有"世外桃园",更米传说中的X片区哦...[s:264] [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] [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都是有实际意义的啊实际意义 hook ExAcquireRundownXXXX [quote]引用第9楼炉子于2008-01-31 19:19发表的 :
理解为5字节nop不好啊不好。。
[/quote]
好吧.2字节滴nop...
ebp保存当前esp...[s:267]
[quote]vxk:
hook ExAcquireRundownXXXX[/quote]
不懂啊, 没有见过这个神秘的函数啊[b]ExAcquireRundownXXXX[/b] 炉子你不是想在X区发帖啊。。我有方法啊,虽然以我现在的技术是从来都没有奢望过能发帖的,但是我想你是可以的啊。
第一步:找出在邪恶八进制的5个荣誉会员。
第二步:找出它们的联系方式。
第三步:写一个操作系统。
第四步:把你的操作系统的源码发给他们5个。
第五步:让他们推荐你成为荣誉会员。
第六步:等谁谁通过。
然后你就行了饿。。。。。。就可以发帖了。。。。
[s:264] 都快把PspTerminateXXXByXXX实现一遍了。其实核心还在PspExitXXX....
代码里有几句XXX是败笔...
APC不够猥琐,有很大弊端,XXXattachXXX才是王道... [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] [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] [quote]引用第15楼evilsir于2008-02-01 11:01发表的 :
要比谁流氓,谁猥琐,看楼上VXK...
我早也说过,想单靠一种XX方法,是不行的不行的...inline hook也把你拔了...
期待大米放个anti出来,我的gzck等着...
.......[/quote]
俺是菜鸟....
gz1x放demo,俺来IDA看看.顺便偷偷学习[s:265] [quote]引用第16楼sudami于2008-02-01 11:03发表的 :
俺是菜鸟....
gz1x放demo,俺来IDA看看.顺便偷偷学习[s:265][/quote]
就事论事而已,每种XX都是有优有劣,就这个意思。
我学习来的...很久不摸内核方面了,没水平放...怕大牛们笑话。
不过CV这东西真不错,IDA直接pass。。。 强大的CV啊...
以后放demo的大牛们要是都这样就和谐了 [s:289] R, V大说的原来是 HOOK [b]ExAcquireRundownProtection[/b]
真邪恶 [s:275] 汗,一直不知道Psp系列的函数会检查ExAcquireXXX 楼上两位还是有空自己IDA吧...谁说Psp系列会检查ExAcquireXXX了?Hook了又怎么个邪恶?内核也就是比谁更猥琐更底层而已。
VXK牛给的只是猥琐的思路,怎么XX还得绕着来。
防止被杀只要对函数钻空子,很容易让这些方法失效。 看来ls的帖子偶还是不知道psp会ExAcXXX [quote]引用第21楼evilsir于2008-02-01 20:21发表的 :
楼上两位还是有空自己IDA吧...谁说Psp系列会检查ExAcquireXXX了?Hook了又怎么个邪恶?内核也就是比谁更猥琐更底层而已。
VXK牛给的只是猥琐的思路,怎么XX还得绕着来。
防止被杀只要对函数钻空子,很容易让这些方法失效。[/quote]
严重学习.
俺只能一边IDA,一边WRK,再一边KD了.
5555~ #include "LDasm.h" //网上很多的,自己找一个好了。
找半天找到一份有乱码的:mad: 乱码鸟语看不懂,谁能提供一份?呼唤炉子。。。 修改了一下,可以用了:lol:
页:
[1]