基于CallStack的Anti-Rootkit HOOK检测思路

基于CallStack的Anti-Rootkit HOOK检测思路:

MJ0011
2007-11-2
th_decoder@126.com

Anti-Rootkit目前扫描Hook的方法主要有以下几种:

1.对抗inline -hook ,IAT/EAT Hook

Anti-Rootkit使用读取磁盘上系统文件并将之进行map\重定位后,同内存中的代码进行对比的方法来检测inline hook(或EAT/IAT HOOK,后同),类似的工具例如Rootkit Unhooker, gmer, Icesword等等

为了对抗Anti-Rootkit的inline Hook扫描,Rootkit们使用一些方法来进行自己HOOK的隐藏

例如Shadow Walker的方法,HOOK Int 0Eh缺页中断来隐藏内存中被HOOK的代码

或者是例如流氓软件CNNIC中文上网,HOOK FSD的IRP_MJ_READ,当读取到ntfs.sys等文件时,修改数据,将错误的结果返回回去,导致Anti-rootkit工具误认为内存中的代码是正确的

多种方式都可以让这种传统的INLINE HOOK检测方法失效

2.Object Hook Continue reading “基于CallStack的Anti-Rootkit HOOK检测思路”

简单认识Anti-RootKit

简单认识Anti-RootKit

作者:single

现在RK(rootkit)和ARK(anti-rootkit)的斗争已经进行了很久,在印象中最早出来的ARK工具是冰刃(IceSword),从冰 刃开始出来到现在RK和ARK的斗争一直在继续,目前冰刃还是在流行当中,自己感觉也正是冰刃的出来才带动了当前流行的RK和ARK的斗争 呵呵,现在很多病毒木马已经广泛的带有驱动,使用一些RK的技术和方法使自己更底层些更强大些,当前流行的ARK工具主要包括:隐藏进程检测,内核驱动检 测,SSDT检测,代码HOOK检测,注册表隐藏的检测,隐藏文件的检测等一些功能的,下面谈谈自己对一些功能的简单愚见 嘻嘻。

关于进程检测:其实最早在R3下隐藏进程的方法已经很早开始流行起来被用到各种软件上来,在R0下如断ActiveProcessLinks链,擦掉句柄表等等,一步步的发展渐渐的更强大起来一些技巧和方法开始出来和流行起来,如FUTO,phide_ex等。。。。。。

检测隐藏进程的方法可以把一些现在流行的方法组合起来用,首先可以通过进程的EPROCESS结构中的进程活动链表ActiveProcessLinks 来进行扫描一边,可以通过进程句柄表的枚举通过EPROCESS的HANDLE_TABLE,HANDLE_TABLE结构中的 HandleTableLis链表来扫描一边来获得一些EPROCESS,可以通过定位PsLookupProcessByProcessId代码中的 PspCidTable链表扫描一边获得一些EPROCESS,PspCidTable在各系统中枚举是不太一样的,也可以通过先找出 KiWaitInListHead,KiWaitOutListHead和KiDispatcherReadyListHead这些链表然后对这些链表扫 描获得一些EPROCESS,以上具体的实现代码可以GOOGLE之网上实现的代码已经很多了,再者也可以找到内核中的线程切换SwapContext函 数进行HOOK下的,在自己实现的SwapContext函数根据线程的偏移量找出进程的EPROCESS结构,把上面获得的所有EPROCESS汇集起 来还需要判断下当前进程是否是真正的活着的:)可以通过EPROCESS里的标志位Flags(如XP 下0x248)一些标志判断下的,还要注意下对上面这些链表汇集起来是会有重复的进程的,在你自己的汇集函数中根据EPROCESS判断下的 废话了,感觉实现了上面的一些方法对付一般的隐藏进程已经足够了的,但厉害的RK还是有的,现在存在可以逃过这些方法的RK的,在进程EPROCESS的 结构里偏移0x1f8(XP SP2下)有个struct MMSUPPORT Vm结构:

struct _MMSUPPORT
{
/* off 0x00000000 */ union LARGE_INTEGER LastTrimTime;
/* off 0x00000008 */ struct MMSUPPORT_FLAGS Flags;
/* off 0x0000000C */ unsigned long PageFaultCount;
/* off 0x00000010 */ unsigned long PeakWorkingSetSize;
/* off 0x00000014 */ unsigned long WorkingSetSize;
/* off 0x00000018 */ unsigned long MinimumWorkingSetSize;
/* off 0x0000001C */ unsigned long MaximumWorkingSetSize;
/* off 0x00000020 */ struct _MMWSL* VmWorkingSetList;
/* off 0x00000024 */ struct LIST_ENTRY WorkingSetExpansionLinks;
/* off 0x0000002C */ unsigned long Claim;
/* off 0x00000030 */ unsigned long NextEstimationSlot;
/* off 0x00000034 */ unsigned long NextAgingSlot;
/* off 0x00000038 */ unsigned long EstimatedAvailable;
/* off 0x0000003C */ unsigned long GrowthSinceLastEstimate;
};

在这个结构里+0x24有个 WorkingSetExpansionLinks他也是个LIST_ENTRY链表的,遍例下他可以获得进程的EPROCESS的,如
PEPROCESS eprocess, eprocess2
eprocess =PsGetCurrentProcess();
lp=(PLIST_ENTRY)(*(PVOID )((PUCHAR)eprocess+0x1f8+0x24+4));
cur =lp->Flink;
for(;cur!=lp;cur=cur->Flink)
{
eprocess2=(PEPROCESS)((ULONG)cur-0x1f8-0x24);
PVOID session= (PVOID)(*(PULONG)((PCHAR) eprocess2+ 0x170));
if(MmIsAddressValid(session)){
AddProcess(eprocess2);
}
}

再者在进程EPROCESS的结构里偏移0x0b4(XP SP2下)存在个struct _LIST_ENTRY SessionProcessLinks结构,他也是个链表的 :)通过遍例他也可以的获得一些EPROCESS。还有个地方可以的 呵呵 在每个线程对象里(ETHREAD)偏移0x34里有个struct _KAPC_STATE ApcState 结构的在_KAPC_STATE结构里偏移0x10,再者也可以通过遍例内存来查找隐藏进程,从内存MmSystemRangeStart开始到 System进程的EPROCESS地址就可以了主要是判断这个地址是否是个有效的进程,方法挺多的如判断下是否是进程对象这个地址如果是 EPROCESS看看PID,ThreadListHead,ReadyListHead是否正确有效的等等,很多方法的应该组合起来判断下保证肯定是进 程就可以了,还可以通过HOOK一些函数的如KeUpdateRunTime,KeDispatchInterrupt等来检测隐藏进程,还可以设置下 PsSetCreateProcessNotifyRoutine在每次进程创建的时候对线程插入个APC的来进行统计检测的,其实我觉得对于检测隐藏进 程的方法技巧还有很多,伟大的WINDOWS还需要我们挖掘呀。进程的结束可以通过调用ZwTerminateProcess或者调用未公开的 PspTerminateProcess函数的,关于这个函数在网上已经很广泛了,可以通过遍例进程的每个线程调用 PspTerminateThreadByPointer的结束每个线程的,这些未公开的函数都需要事先的查找和定位的,还可以使用RKU (RkUnhooker)的内存清零大法的切换到该进程然后对该进程内存清零RtlZeroMemory,再者也可以对该进程的每个线程插入APC来结束 进程的,最后如果你有时间你也可以通过观看2K的代码自己来实现进程的结束。

内核驱动检测首先你可以通过ZwQuerySystemInformation的SystemModuleInformation功能号来枚举内核驱动 的,然后可以通过打开目录对象,进行枚举代码就略了GOOGLE之吧,也可以通过枚举IoDriverObjectType和 IoDeviceObjectType对象类型进行查找枚举顺便把他们的DeviceObject和AttachedDevice等也枚举下吧,接着可以 通过查找PsLoadedModuleList对该链进行下枚举的,可以对这个目录对象再搜索一边的”\\Driver”。通过对上面这些方法的枚举可以 查找到很多驱动对象了,相信现在你的驱动对象链表已经够多了 嘿嘿,够累吧,接下来,你可以对上面你已经查找到的驱动对象的0x38偏移MajorFunction查找一边看看他的地址是否在已知的驱动地址范围内, 如不在你知道该怎么办的,再对MajorFunction里的每个例程地址找一边的从0到28也看看他们的地址是否在已知的驱动地址范围内,最后再说一种 的方法的,也可以像进程那样内存枚举的,像进程那样从MmSystemRangeStart开始枚举吧,判断下是否是PE文件有没有那几个关键PE特征 的,如MZ,PE等,看看是否存在PE文件头是否有效,看看这个地址是否已经是你检测出来的驱动地址的,避免重复的,看看你所检测出来的所有驱动对象的 MajorFunction[X]和DriverStartIo是否有在这个地址,如果有并且这个地址你先前没有检测出来没有重复的他很有可能是个未知的 驱动的,其实和进程内存查找一样的,关键是判断的,需要判断对的,肯定他是某个对象的然后你就可以把他加如到你自己的某个链表里。最后也可以通过对一些关 键函数的HOOK 如ExAllocatePool,ExAllocatePoolWithTag等在自己实现这些函数里记录下esp+0x24地址的,对这些地址进行判断 的来看看这些地址是否包含在某些内核模块当中当然还需要判断下他是否就是个PE驱动文件,这种方法就是RKU用到的方法的。驱动就说这些吧。

前面说得太多了,后面说少点吧 嘿嘿。

关于SSDT HOOK的检测,通过定位ntoskrnl.exe磁盘文件里KeServiceDescriptorTable与内存中的KeServiceDescriptorTable对各个服务函数进行比较就可以的。代码网上很多的。

关于代码HOOK检测,我也不想说什么的,可以对内存中ntoskrnl.exe 的导入函数和导出函数与磁盘文件中的地址进行比较,也可以通过对ntoskrnl.exe PE文件里的某些节(section)进行扫描的,再加上对一些关键文件的导入函数和导出函数进行扫描,加上对某些关键驱动(如文件系统驱动)的 MajorFunction里的每个例程进行扫描,再者对IDT,GDT扫描下的。

关于注册表隐藏的检测,首先可以用到把一些注册表相关的函数INLINE HOOK的SSDT HOOK的都恢复下再使用的其实所谓的不相关的也需要UNHOOK下的,如badrkdemo 他就HOOK了ObOpenObjectByName函数组织对注册表的访问的 具体的看情况来吧 哈哈,也可以通过对一些未公开的函数进行使用的CM系列函数的,再者可以通过分析HIVE文件的来显示注册表各个项的,通过分析HIVE文件其实也不是很 难的,了解了HIVE文件结构和HIVE文件的组织的,就可以读他了,这些资料网上可以找到的,通过读HIVE文件来给用户显示当前注册表各个项的可以的 但我并不推荐自己改写系统的HIVE文件的,如提供DELETE MODIFE等功能的我觉得如改的不好,或结构没有完全清楚的,写到HIVE文件里是错误的,那么当再次启动时系统读HIVE文件时就不好过了,自己一点 愚见,如果你够强大当然是没有问题的。

关于隐藏文件的检测,现在流行的隐藏文件的RK很多的,如Unreal.A,AK922等,自己可以通过在驱动中自己构建IRP包自己发送给文件驱动的方 法的,还有就是先恢复些关键函数的,像注册表那样的,恢复INLINE HOOK SSDT HOOK,文件驱动关键例程HOOK的,现在流行HOOK内核的完成例程的,HOOK是防不胜防的,还要注意下附加在文件系统上的一些过滤驱动的,还有就 是通过使用DeviceIoControl发送一些特殊的IoControlCode控制代码给文件系统的,这需要对文件系统的熟悉的,还有就是自己分析 磁盘文件的对FAT32,NTFS等格式文件系统自己分析来查找文件的,关于自己分析磁盘文件的,网上的信息和资料也是很多的,首先判断下属于哪个文件系 统,然后根据特定的文件系统格式自己分析的就可以的,其实这些方法的关键是怎么读和写的,读和写做到最底层,把读和写做好我想他检测文件功能是强大的。

够了,一些ARK的功能说到这就可以了,我希望各位搞RK的和ARK的人看了之后又会作出很多厉害,强大的东西来,希望看了之后会对各位有一点帮助的,希 望可以在当前流行的RK和ARK中会有更新更强大的东西出现的,来激励我们学习和前进的,引用一位好友的话“现在感觉大部分木马病毒什么的都是用的老一套 东西的什么SSDT HOOK的。。。。。。,希望可以有些新的技术出现的”,其实现在有些RK是很牛的,其实都是一个目标的 希望技术和知识可以不断进步的 嘿嘿。一个没有未来的人:)谈谈关于RK和ARK未来的发展 RK 更底层,ARK也更底层,攻和防,RK和ARK的斗争会继续的,RK会出现固化在某个文件里,会在重装系统后还会存在,会写到硬件中。。。。。。,ARK 势必也需要对这些问题关注的。

Rootkit清除工具

Rootkit就像是一件隐身的斗篷,可以隐藏计算机中应用程序的软件。Rootkit悄悄地把自己安装在用户的计算机中,隐藏自己的进程、文件、网络通 讯和其它可能暴露自己的信息。Rootkit一般隐藏能够让黑客可以轻松找回被控制计算机的工具。Rootkit不易被发现,由于没有任何一家厂商能够可 靠地检测所有的Rootkit,因此建议最好使用多种免费的Rootkit检测工具。  杀毒软件公司Sophos的Anti-Rootkit是一种高级的Rootkit检测工具,能够清除Windows NT、XP和2003等平台中的Rootkit。在扫描之前,这个工具软件强烈建议关闭所有不重要的应用程序。Rootkit扫描台式电脑需要几分钟的时 间,扫描服务器需要更多的时间。这种扫描搜索隐藏的文件、进程、注册键和键值。当扫描结束时,弹出一个对话框,证实这次扫描的状态和结果。点击可疑的文件 可显示更多的有关信息。显示的信息包括建议是否删除这个项目。如果可疑的文件被识别为可以安全地删除,如果这个扫描器不能确定这个软件是什么,但是认为这 个软件可疑,这个可疑的软件仍可以删除。

同Sophos的工具一样,熊猫公司的AntiRootkit工具有一个图形用户接口,允许选择使用命令行。同Sophos的工具一样,它能够 识别已知的Rootkit以及具有这种特征的可疑的Rootkit行为,并且提供一些选择,让用户删除这些Rootkit及其相关的注册表登记、进程和文 件。熊猫AntiRootkit查找隐藏的文件、注册表登记、驱动程序、进程、执行挂钩(execution hooks),能够很好地完成清除可疑Rootkit的工作。熊猫AntiRootkit能够在Windows 2000、XP和2003等平台上运行。这个工具能够完全清除危险的Rootkit,即使它不能完全识别它们。

如果上述任何一种Rootkit扫描器都不能为你完成清除Rootkit的工作,你还可以使用其它的Rootkit检测与清除工具,如:

McAfee Rootkit Detective检测工具。这是一种能够在XP、2000和2003平台上检测和清除Rootkit的程序。然而,McAfee强烈建议这个软件只能在 McAfee Avert实验室或者McAfee技术部门的指导下由懂技术的人员使用。AVG Anti-Rootkit Free工具软件提供Rootkit检测与删除功能,能够在Windows 2000和XP上运行。

Rootkit检测与清除是更多的杀毒软件包的一部分。但是,这些扫描器能够为帮助防御黑魔法提供一道额外的防线

突破icesword实现文件隐藏

突破icesword实现文件隐藏

估计想在icesword下隐藏文件的人有很多吧。今天我介绍一种方法。

先介绍一下icesword是如何查找文件的。基本原理就是自己构造一个irp出来,然后直接IoCallDriver发送到fsd。但是 icesword做了更多的工作。它直接读取ntfs.sys 和fastfat.sys,从pe文件格式的角度上计算出正确的fsd的dispatch routine地址,然后再call。而且icesword自己实现了一个IoCallDriver。所以一般的fsd hook是对付不了icesword的。

前段时间cardmagic公布了一种方法,hook IofCompleteRequest。然后在UserBuffer里处理要隐藏的文件。到目前位置,api hook 基本上走到尽头了。那么如果要处理 call dispatch routine 后的buffer还可以在哪里下手呢?

写过驱动的人容易知道,一般的filter类驱动在往下层驱动传递irp的时候会设置一个完成函数,就是CompletionRoutine。 IofCallDriver 调用下层驱动,下层驱动处理完成之后CompletionRoutine 就会被调用。那么我们能不能hook掉查询文件的irp 的完成函数呢?调试的时候发现当 MajorFunction==IRP_MJ_DIRECTORY_CONTROL, MinorFunction==IRP_MN_QUERY_DIRECTORY 的时候IrpStackLocation中的CompletionRoutine的是空的。如何解决呢?先总结一下,现在面临两个问题:

1 如何得到icesword下发的irp ?
2 如何为捕获到的irp设置一个callback的完成函数?

下面我来逐个突破:
icesword毕竟还是基于os开发的东西,所以它不可能独立于os去做所有的事。就是说\\FileSystem\\ntfs 的IRP_MJ_DIRECTORY_CONTROL的处理函数它一定会被调用。既然我们不能hook这个dispatch routine,那么我们是否可以hook 这个routine中调用过的函数,然后判断函数返回地址,和dispatch routine的地址做比较以此来判断是否在查询文件。
先看ntfs.sys的开头部分代码:
INIT:0009527E mov dword ptr [esi+7Ch], offset _NtfsFsdLockControl@8 ; NtfsFsdLockControl(x,x)
INIT:00095285 mov dword ptr [esi+68h], offset _NtfsFsdDirectoryControl@8 ; NtfsFsdDirectoryControl(x,x)
INIT:0009528C mov dword ptr [esi+50h], offset _NtfsFsdSetInformation@8 ; NtfsFsdSetInformation(x,x)
INIT:00095293 mov dword ptr [esi+38h], offset _NtfsFsdCreate@8 ; NtfsFsdCreate(x,x)
INIT:0009529A mov dword ptr [esi+40h], offset _NtfsFsdClose@8 ; NtfsFsdClose(x,x)
INIT:000952A1 mov dword ptr [esi+44h], offset _NtfsFsdRead@8 ; NtfsFsdRead(x,x)
INIT:000952A8 mov dword ptr [esi+48h], offset _NtfsFsdWrite@8 ; NtfsFsdWrite(x,x)
INIT:000952AF mov dword ptr [esi+5Ch], offset _NtfsFsdFlushBuffers@8 ; NtfsFsdFlushBuffers(x,x)
INIT:000952B6 mov dword ptr [esi+6Ch], offset _NtfsFsdFileSystemControl@8 ; NtfsFsdFileSystemControl(x,x)
INIT:000952BD mov dword ptr [esi+80h], offset _NtfsFsdCleanup@8 ; NtfsFsdCleanup(x,x)
INIT:000952C7 mov dword ptr [esi+78h], offset _NtfsFsdShutdown@8 ; NtfsFsdShutdown(x,x)
INIT:000952CE mov dword ptr [esi+0A4h], offset _NtfsFsdPnp@8 ; NtfsFsdPnp(x,x)
INIT:000952D8 mov dword ptr [esi+28h], offset _NtfsFastIoDispatch
INIT:000952DF mov eax, offset _NtfsFsdDispatchWait@8 ; NtfsFsdDispatchWait(x,x)

开头这部分是初始化驱动的分发历程,我们需要关注的是 mov dword ptr [esi+68h], offset _NtfsFsdDirectoryControl@8 , 跟进来:
PAGE:00037FBD push 14Ch
PAGE:00037FC2 push offset unk_28848
PAGE:00037FC7 call __SEH_prolog
PAGE:00037FCC xor edi, edi
PAGE:00037FCE mov [ebp+var_1C], edi
PAGE:00037FD1 call ds:__imp__KeEnterCriticalRegion@0 ; KeEnterCriticalRegion()
PAGE:00037FD7 push 1
PAGE:00037FD9 push 1
PAGE:00037FDB lea eax, [ebp+var_4C]
PAGE:00037FDE push eax
PAGE:00037FDF call _NtfsInitializeTopLevelIrp@12 ; NtfsInitializeTopLevelIrp(x,x,x)
PAGE:00037FE4 mov esi, eax
PAGE:00037FE6 mov [ebp+var_20], esi
PAGE:00037FE9
PAGE:00037FE9 loc_37FE9: ; CODE XREF: MakeRoomForAttribute(x,x,x,x)+2B19j
PAGE:00037FE9 xor ebx, ebx
PAGE:00037FEB mov [ebp+ms_exc.disabled], ebx
PAGE:00037FEE cmp [ebp+var_1C], ebx
PAGE:00037FF1 jnz short loc_3806C
PAGE:00037FF3 mov byte ptr [ebp+var_24], bl
PAGE:00037FF6 push [ebp+arg_4]
PAGE:00037FF9 call ds:__imp__IoIsOperationSynchronous@4 ; IoIsOperationSynchronous(x) // 我想从这个函数下手
PAGE:00037FFF test al, al
PAGE:00038001 jz short loc_38010
PAGE:00038003 mov byte ptr [ebp+var_24], 1
PAGE:00038007 lea eax, [ebp+var_15C]
PAGE:0003800D mov [ebp+var_1C], eax
PAGE:00038010
PAGE:00038010 loc_38010: ; CODE XREF: NtfsFsdDirectoryControl(x,x)+44j
PAGE:00038010 lea eax, [ebp+var_1C]
PAGE:00038013 push eax
PAGE:00038014 push [ebp+var_24]
PAGE:00038017 push [ebp+arg_4]
PAGE:0003801A call _NtfsInitializeIrpContext@12 ; NtfsInitializeIrpContext(x,x,x)

这个dispatch routine的开始不远处有对IoIsOperationSynchronous的调用。我看能不能方便的hook这个函数,打开windbg,选择local kernel debuging。

lkd> u IoIsOperationSynchronous
nt!IoIsOperationSynchronous:
804f0808 8bff mov edi,edi
804f080a 55 push ebp
804f080b 8bec mov ebp,esp
804f080d 8b4508 mov eax,dword ptr [ebp+8]
804f0810 8b4860 mov ecx,dword ptr [eax+60h]
804f0813 8b4918 mov ecx,dword ptr [ecx+18h]
好的,函数被导出。我们直接直接inline hook它。
hook的代码片段:

//———————————————————–
GetKernelModuleAddress();

HookFunction(kernelBaseAddress, “IoIsOperationSynchronous”, MyIoIsOperationSynchronous, (ULONG*)&OldIoIsOperationSynchronous);

irql = KeRaiseIrqlToDpcLevel();
returnAddr = HookCode((PVOID)OldIoIsOperationSynchronous, (PVOID)MyIoIsOperationSynchronous);
KeLowerIrql(irql);
//————————- code ends here——————–
如何判断是否是在文件系统的IRP_MJ_DIRECTORY_CONTROL函数中被调用的呢?
ULONG callerAddr = 0;
_asm mov eax,[ebp+4] // 得到返回地址
_asm mov callerAddr,eax

if(callerAddr – 0xbfefb69d < 120) 和fsd 的dispatch routine入口地址比较
{
HackIrp(Irp);
}
注:0xbfefb69d 这个是我调试的时候得到的地址,我直接硬编码了。

到此为止,第一个问题解决了,所以现在可以捕获到icesword查询文件的irp了。

第2个问题,如何接管完成函数。

之前发现,ntfs驱动的dispatch routine是没有设置CompletionRoutine的。那么我就来给他设置一个。设置完成函数的api是 IoSetCompletionRoutine。但是这个函数是给下层驱动设置完成函数的。我们现在是需要给当前的 stack location 设置CompletionRoutine。ok,看一下IoSetCompletionRoutine,从wrk中找源码:

#define IoSetCompletionRoutine( Irp, Routine, CompletionContext, Success, Error, Cancel ) { \
PIO_STACK_LOCATION __irpSp; \
ASSERT( ((Success) | (Error) | (Cancel)) ? (Routine) != NULL : TRUE ); \
__irpSp = IoGetNextIrpStackLocation( (Irp) ); \
__irpSp->CompletionRoutine = (Routine); \
__irpSp->Context = (CompletionContext); \
__irpSp->Control = 0; \
if ((Success)) { __irpSp->Control = SL_INVOKE_ON_SUCCESS; } \
if ((Error)) { __irpSp->Control |= SL_INVOKE_ON_ERROR; } \
if ((Cancel)) { __irpSp->Control |= SL_INVOKE_ON_CANCEL; } }

看了源码马上知道该怎么做了。(如果你还没知道那就不用知道了…)
ok,下面为fsd处理IRP_MJ_DIRECTORY_CONTROL的routine设置CompletionRoutine

irpSp->CompletionRoutine = MyFilterFiles;
irpSp->Context = Irp->UserBuffer;
irpSp->Control = 0;
irpSp->Control = SL_INVOKE_ON_SUCCESS;
irpSp->Control |= SL_INVOKE_ON_ERROR;
irpSp->Control |= SL_INVOKE_ON_CANCEL;

函数MyFilterFiles是被我们控制的,所以我们可以在里面隐藏掉想要隐藏的文件。MyFilterFiles的实现不写了,参见cardmagic就可以了。

做到这里我认为我可以成功了,但是我拿到虚拟机里一试,机器篮屏了。出错的module是icesword的驱动。郁闷了。这是vxk提醒了我。原来 icesword自己设置了完成函数。下断点,调试,icesword果然有自己的完成函数。(严重感谢vxk)解决这个问题不难,不管它的完成函数是怎 么实现的,CompletionRoutine的函数原型基本是固定的。所以我只需要在MyFilterFiles处理完Irp-> UserBuffer后 , push参数进去,然后call icesword的完成函数就行了。

至此,突破icesword实现文件隐藏的全部工作完成了。完整的代码我不就放出来的。对于写rootkit的人们来说知道了思路就已经足够了。放完整的代码出来如果被一些流氓直接a过去就不和谐了。

另外,要想比较完美的实现还有几个小细节问题要处理。譬如如何得到IRP_MJ_DIRECTORY_CONTROL处理routine的正确地址,这个可以像icesword一样map 磁盘文件,然后自己计算。其余的问题我一时想不起来了,昨天失眠……

Rootkit相关链接

categories:Decompilers
Garage – Homebrew haxoring of a different type
Network Drivers – Contains links for both NDIS and TDI drivers.
Remote Control Packages

links:

Anti-trojan.org – The worlds largest trojan information website. Information on over 1000 different trojans. (3096 hits)
antiserver rootkit collection – a small archive that includes backdoored services (2540 hits)
Author for Google hacking/penetration testers – Very useful website. (556 hits)
Bochs – An x86 emaulator w/ source, like VMWare (844 hits)
brilliant trick to program ROM chips – (1007 hits)
Cain and Abel + other tools – Cain & Abel is a password recovery tool for Microsoft Operating Systems. (380 hits)
chkrootkit – a rootkit detector (1881 hits)
DJ CMOS PhNeutral – Keith has informed us that these are the worst mixes of his entire life. This is mostly because of FX’s amazing hospitallity and allowing Keith to “enjoy” the bar free of charge. Keith has requested that we remove the files but don’t worry, we told him to fuck himself. (887 hits)
DLL World – search engine and a ton of DLL’s and OCX’x (1296 hits)
Edge Engine – The CMS Engine used for this website (415 hits)
EXEtools – (1974 hits)
exploit archive – yet another, w/ search (2052 hits)
Finding Hidden Processes and Terminate It – “Finding Hidden Processes” is a tool For Finding Hidden Processes in our Systems. (647 hits)
Free Computer Books, Tutorials & Lecture Notes – A whole archive of about everyhting and anyhting computer related. Lots of good referance material. (1111 hits)
Generating small executables with Visual C++ – Nice tutorial on how to create small exe’s with visual c++. (1273 hits)
Getting WinDBG and VMWare to play together – (710 hits)
Good info on filesystem drivers – (916 hits)
google hack: browsable directories – this search string returns sites w/ browsable root dir’s (2734 hits)
google hack: finds user auth files – find files called “auth_user_file.txt” – you can crack hashes (1747 hits)
GoogleHack-Getting ASP Pages For jection Check – This hack throws you with a search how to get direct ASP pages index for injection check (277 hits)
Hacking DNA at home – Hacking code getting old? Try DNA instead. This resource will help you build super-virulent E. Coli (be careful!) and grow glow-in-the-dark house plants. (700 hits)
http://www.k-otik.com/exploits/ – exploit archive (1480 hits)
Interrupt Hooking – (1164 hits)
Just check it out – apihooks and others (957 hits)
Kernel Security Therapy Anti-Trolls (KSTAT) – (self describes:) Kernel Security Therapy Anti-Trolls (KSTAT) is a very powerful security tool to detect many kinds of rogue kernel rootkits. It analyzes the kernel through /dev/kmem and detects modified syscalls as well as various other problems. This version runs on 2.4.x only, and can assist in finding and removing trojan LKMs. It supports network socket dumps, sys_call fingerprinting, stealth module scanning, and more. (1136 hits)
Matt Pietrek’s homepage – (1746 hits)
Microlib – machine simulator (727 hits)
neworder security references – good i guess for the newbie, helped me out with some questions and thought maybe it would help out. great community aspect thought, has alot of references to different sites that they host, like code.box.sk and junk like that. not just for a weird wanna be hacker. (386 hits)
Nice article on API apying technique – Yariv Kaplan’s article, a good one (1145 hits)
Nmap website – One of the best network mapping and port scanning tools that is freely available for many operating systems (342 hits)
Open Reverse Code Engineering – Open Reverse Code Engineering community was created to foster a shared learning environment among researchers interested in the field of reverse engineering. Heavily modeled on Rootkit.com, OpenRCE aims to serve as a centralized resource for reverse engineers (currently heavily win32/security/malcode biased) by hosting files, blogs, forums articles and more. (1081 hits)
Packetstorm Directory Tree – (991 hits)
PearPC – PowerPC machine emulator (603 hits)
QEMU – Another x86 machine emulator (543 hits)
RCE Messageboards – A set of message boards dedicated to reverse code engineering issues ranging from newbie to advanced. There is also a RCE tool discussion board and a board dedicated to cryptographics. (546 hits)
ReactOS – ReactOS is an OS based on windows nt, the source code contains allooooot of info about nt kernel, how windows boot, …. (1050 hits)
rootkit archive – (2363 hits)
Rootkit’s Unloader – t’s tool for unmapping the modules and loaded Rootkit’s DLLS. It also can terminate the Threads and processes. For Unloading the Rootkits first you must know your target’s DLL After finding these Processes you can terminate the Library. Tip: Before selecting this you must close and save your Program’s Data, because this Program erasing all Threads and Maybe Your Lose your data .TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination. Down load’s Link Full Source Code with Binary https://www.rootkit.com/vault/neocrackr/Rootkits_Unloader.rar (286 hits)
rootkit.nl – rootkit detector (1512 hits)
Rootkits: The “r00t” of Digital Evil – Viruses, worms, trojans, spyware and rootkits abound in the maelstorm of modern malware. Rootkits easily stand out as the greatest threat to site security. To combat this growing problem, administrators need to understand how they work. (1014 hits)
Russian Rootkits Project – Russian Rootkits Project. (89 hits)
Samuel Jackson Sound Board – this is funny, you MUST try it (1641 hits)
The Injecting Dlls Into Processes – this is a too for Injecting Dlls Into Processes , free source code VB 6 + Exe Binary (169 hits)
tripatourium – (899 hits)
Universitas Virtualis – Universitas Virtualis offers with it’s own powerful bibliotheca system a comprehensive knowledge base for topics like Algorithms, Software-Engineering, Software-Protection and Reverse Code Engineering, Cryptography and Cryptanalysis. The Bibliotheca offers access to important research papers and grey papers to provide a wide range of available knowledge. (909 hits)
worms archive – (1333 hits)
XEN – The Xen virtual machine monitor (814 hits)
XFOCUS (they have english version) – looks to be a good site (1297 hits)
zone-h 0day rumor – a list with alot of noise and very little signal, but interesting none the less (1404 hits)
[ X- Zero-Day ] – The dumping ground for Zero-Day Exploits.. The following entries are active zero-day vulnerabilities. Exploits that do not have any published vendor-supplied patch. (135 hits)

Windows Rootkit相关链接
[ 1] Avoiding Windows Rootkit Detection/Bypassing PatchFinder 2 – Edgar Barbosa[2004-02-17]
http://www.geocities.com/embarbosa/bypass/bypassEPA.pdf

[ 2] TOCTOU with NT System Service Hooking
http://www.securityfocus.com/archive/1/348570

TOCTOU with NT System Service Hooking Bug Demo
http://www.securesize.com/Resources/hookdemo.shtml

[ 3] Hooking Windows NT System Services
http://www.windowsitlibrary.com/content/356/06/1.html
http://www.windowsitlibrary.com/content/356/06/2.html

[ 4] NTIllusion: A portable Win32 userland rootkit – Kdm <Kodmaker@syshell.org>
http://www.phrack.org/phrack/62/p62-0x0c_Win32_Portable_Userland_Rootkit.txt

[ 5] Kernel-mode backdoors for Windows NT – firew0rker <firew0rker@nteam.ru>
http://www.phrack.org/phrack/62/p62-0x06_Kernel_Mode_Backdoors_for_Windows_NT.txt

[ 6] Win2K Kernel Hidden Process/Module Checker 0.1 (Proof-Of-Concept) – Tan Chew Keong[2004-05-23]
http://www.security.org.sg/code/kproccheck.html
http://www.security.org.sg/code/KProcCheck-0.1.zip

[ 7] port/connection hiding – akcom[2004-06-18]
http://www.rootkit.com/newsread_print.php?newsid=143

[ 8] Process Invincibility – metro_mystery[2004-06-13]
http://www.rootkit.com/newsread_print.php?newsid=139

[ 9] KCode Patching – hoglund[2004-06-06]
http://www.rootkit.com/newsread_print.php?newsid=152
http://www.rootkit.com/vault/hoglund/migbot.zip

[10] Hiding Window Handles through Shadow Table Hooking on Windows XP – metro_mystery[2004-06-12]
http://www.rootkit.com/newsread_print.php?newsid=137

[11] hooking functions not exported by ntoskrnl – akcom[2004-07-02]
http://www.rootkit.com/newsread_print.php?newsid=151

[12] A method of get the Address of PsLoadedModuleList – stoneclever[2004-06-10]
http://www.rootkit.com/newsread_print.php?newsid=135

[13] Fun with Kernel Structures (Plus FU all over again) – fuzen_op[2004-06-08]
http://www.rootkit.com/newsread_print.php?newsid=134
http://www.rootkit.com/vault/fuzen_op/FU_Rootkit.zip

[14] Getting Kernel Variables from KdVersionBlock, Part 2 – ionescu007[2004-07-11]
http://www.rootkit.com/newsread_print.php?newsid=153

[15] Byepass Scheduler List Process Detection – SoBeIt <kinvis@hotmail.com>[2004-04-25]
http://www.rootkit.com/newsread_print.php?newsid=117

[16] Detecting Hidden Processes by Hooking the SwapContext Function – worthy[2004-08-03]
http://www.rootkit.com/newsread_print.php?newsid=170

Rootkit技术

随着安全技术的发展和计算机用户群的技术提高,一般的木马后门越来越难生存,于是一部分有能力的后门作者把眼光投向了系统底层——ring 0。位于ring 0层的是系统核心模块和各种驱动程序模块,所以位于这一层的木马也是以驱动的形式生存的,而不是一般的exe。后门作者把后门写成符合wdm规范 (windows driver model)的驱动程序模块,把自身添加进注册表的驱动程序加载入口,便实现了“无启动项”运行。一般的进程查看器都只能枚举可执行文件exe的信息,所 以通过驱动模块和执行文件结合的后门程序便得以生存下来,由于它运行在ring 0级别,拥有与系统核心同等级的权限,因此它可以更轻易的把自己隐藏起来,无论是进程信息还是文件体,甚至通讯的端口和流量也能被隐藏起来,在如此强大的 隐藏技术面前,无论是任务管理器还是系统配置实用程序,甚至系统自带的注册表工具都失去了效果,这种木马,就是让人问之色变的Rootkit。

要了解Rootkit木马的原理,就必须从系统原理说起,我们知道,操作系统是由内核(kernel)和外壳(shell)两部分组成的,内核负责一切实 际的工作,包括cpu任务调度、内存分配管理、设备管理、文件操作等,外壳是基于内核提供的交互功能而存在的界面,它负责指令传递和解释。由于内核和外壳 负责的任务不同,它们的处理环境也不同,因此处理器提供了多个不同的处理环境,把它们称为运行级别(ring),ring让程序指令能访问的计算机资源依 次逐级递减,目的在于保护计算机遭受意外损害——内核运行于ring 0级别,拥有最完全最底层的管理功能,而到了外壳部分,它只能拥有ring 3级别,这个级别能操作的功能极少,几乎所有指令都需要传递给内核来决定能否执行,一旦发现有可能对系统造成破坏的指令传递(例如超越指定范围的内存读 写),内核便返回一个“非法越权”标志,发送这个指令的程序就有可能被终止运行,这就是大部分常见的“非法操作”的由来,这样做的目的是为了保护计算机免 遭破坏,如果外壳和内核的运行级别一样,用户一个不经意的点击都有可能破坏整个系统。

由于ring的存在,除了由系统内核加载的程序以外,由外壳调用执行的一般程序都只能运行在ring 3级别,也就是说,它们的操作指令全部依赖于内核授权的功能,一般的进程查看工具和杀毒软件也不例外,由于这层机制的存在,我们能看到的进程其实是内核 “看到”并通过相关接口指令(还记得api吗?)反馈到应用程序的,这样就不可避免的存在一条数据通道,虽然在一般情况下它是难以被篡改的,但是不能避免 意外的发生,Rootkit正是“制造”这种意外的程序。简单的说,Rootkit实质是一种“越权执行”的应用程序,它设法让自己达到和内核一样的运行 级别,甚至进入内核空间,这样它就拥有了和内核一样的访问权限,因而可以对内核指令进行修改,最常见的是修改内核枚举进程的api,让它们返回的数据始终 “遗漏”Rootkit自身进程的信息,一般的进程工具自然就“看”不到Rootkit了。更高级的Rootkit还篡改更多api,这样,用户就看不到 进程(进程api被拦截),看不到文件(文件读写api被拦截),看不到被打开的端口(网络组件sock api被拦截),更拦截不到相关的网络数据包(网络组件ndis api被拦截)了,我们使用的系统是在内核功能支持下运作的,如果内核变得不可信任了,依赖它运行的程序还能信任吗?

但即使是Rootkit这一类恐怖的寄生虫,它们也并非所向无敌的,要知道,既然Rootkit是利用内核和ring 0配合的欺骗,那么我们同样也能使用可以“越权”的检查程序,绕过api提供的数据,直接从内核领域里读取进程列表,因为所有进程在这里都不可能把自己隐 藏,除非它已经不想运行了。也就是说,内核始终拥有最真实的进程列表和主宰权,只要能读取这个原始的进程列表,再和进程api枚举的进程列表对比,便能发 现Rootkit进程,由于这类工具也“越权”了,因而对Rootkit进行查杀也就不再是难事,而Rootkit进程一旦被清除,它隐藏自身的措施也就 不复存在,内核就能把它“供”出来了,用户会突然发现那个一直“找不到”的Rootkit程序文件已经老实的呆在文件管理器的视图里了。这类工具现在已经 很多,例如icesword、patchfinder、gdb等。

道高一尺,魔高一丈,因为目前的主流Rootkit检测工具已经能检测出许多Rootkit木马的存在,因此一部分Rootkit作者转而研究 Rootkit检测工具的运行检测算法机制,从而制作出新一代更难被检测到的木马——futo Rootkit。

国产优秀检测工具icesword在futo面前败下阵来,因为futo编写者研究的检测工具原型就是一款与之类似的black & light,所以我们只能换用另一款Rootkit检测工具darkspy,并开启“强力模式”,方可正常查杀Rootkit。

但是由于检测机制的变化,darkspy要检测到futo的存在,就必须保证自己的驱动比futo提前加载运行,这就涉及到优先级的问题,也是让业界感觉 不太满意的一种方式,因为这样做的后果会导致系统运行效率下降,不到紧急关头,都不要轻易采用这种方法,然而现在的瑞星卡卡助手所推广的“破甲”技术,实 现原理是与之类似的,它也会对系统造成一定影响,因而,这个介于安全和效率之间的选择,唯有留给用户自己思考了。