如何突破icesword实现文件隐藏(iceswordwin10上使用)

如何突破icesword实现文件隐藏(iceswordwin10上使用)

浏览次数:
信息来源: 用户投稿
更新日期: 2025-12-15
文章简介

估计想在icesword下隐藏文件的人有很多吧。今天我介绍一种方法。 先介绍一下icesword是如何查找文件的。基本原理就是自己构造一个irp出来,然后直接IoCallDriver发送到fsd。但

2025阿里云双十一服务器活动

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

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

前段时间cardmagic公布了一种方法,hookIofCompleteRequest。然后在UserBuffer里处理要隐藏的文件。到目前位置,apihook基本上走到尽头了。那么如果要处理calldispatchroutine后的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这个dispatchroutine,那么我们是否可以hook这个routine中调用过的函数,然后判断函数返回地址,和dispatchroutine的地址做比较以此来判断是否在查询文件。?先看ntfs.sys的开头部分代码:INIT:0009527Emov??dwordptr[esi+7Ch],offset_NtfsFsdLockControl@8;NtfsFsdLockControl(x,x)INIT:00095285mov??dwordptr[esi+68h],offset_NtfsFsdDirectoryControl@8;NtfsFsdDirectoryControl(x,x)INIT:0009528Cmov??dwordptr[esi+50h],offset_NtfsFsdSetInformation@8;NtfsFsdSetInformation(x,x)INIT:00095293mov??dwordptr[esi+38h],offset_NtfsFsdCreate@8;NtfsFsdCreate(x,x)INIT:0009529Amov??dwordptr[esi+40h],offset_NtfsFsdClose@8;NtfsFsdClose(x,x)INIT:000952A1mov??dwordptr[esi+44h],offset_NtfsFsdRead@8;NtfsFsdRead(x,x)INIT:000952A8mov??dwordptr[esi+48h],offset_NtfsFsdWrite@8;NtfsFsdWrite(x,x)INIT:000952AFmov??dwordptr[esi+5Ch],offset_NtfsFsdFlushBuffers@8;NtfsFsdFlushBuffers(x,x)INIT:000952B6mov??dwordptr[esi+6Ch],offset_NtfsFsdFileSystemControl@8;NtfsFsdFileSystemControl(x,x)INIT:000952BDmov??dwordptr[esi+80h],offset_NtfsFsdCleanup@8;NtfsFsdCleanup(x,x)INIT:000952C7mov??dwordptr[esi+78h],offset_NtfsFsdShutdown@8;NtfsFsdShutdown(x,x)INIT:000952CEmov??dwordptr[esi+0A4h],offset_NtfsFsdPnp@8;NtfsFsdPnp(x,x)INIT:000952D8mov??dwordptr[esi+28h],offset_NtfsFastIoDispatchINIT:000952DFmov??eax,offset_NtfsFsdDispatchWait@8;NtfsFsdDispatchWait(x,x)

开头这部分是初始化驱动的分发历程,我们需要关注的是mov??dwordptr[esi+68h],offset_NtfsFsdDirectoryControl@8,跟进来:PAGE:00037FBDpush??14ChPAGE:00037FC2push??offsetunk_28848PAGE:00037FC7call??__SEH_prologPAGE:00037FCCxor??edi,ediPAGE:00037FCEmov??[ebp+var_1C],ediPAGE:00037FD1call??ds:__imp__KeEnterCriticalRegion@0;KeEnterCriticalRegion()PAGE:00037FD7push??1PAGE:00037FD9push??1PAGE:00037FDBlea??eax,[ebp+var_4C]PAGE:00037FDEpush??eaxPAGE:00037FDFcall??_NtfsInitializeTopLevelIrp@12;NtfsInitializeTopLevelIrp(x,x,x)PAGE:00037FE4mov??esi,eaxPAGE:00037FE6mov??[ebp+var_20],esiPAGE:00037FE9PAGE:00037FE9loc_37FE9:???;CODEXREF:MakeRoomForAttribute(x,x,x,x)+2B19jPAGE:00037FE9xor??ebx,ebxPAGE:00037FEBmov??[ebp+ms_exc.disabled],ebxPAGE:00037FEEcmp??[ebp+var_1C],ebxPAGE:00037FF1jnz??shortloc_3806CPAGE:00037FF3mov??byteptr[ebp+var_24],blPAGE:00037FF6push??[ebp+arg_4]PAGE:00037FF9call??ds:__imp__IoIsOperationSynchronous@4;IoIsOperationSynchronous(x)?//我想从这个函数下手PAGE:00037FFFtest??al,alPAGE:00038001jz???shortloc_38010PAGE:00038003mov??byteptr[ebp+var_24],1PAGE:00038007lea??eax,[ebp+var_15C]PAGE:0003800Dmov??[ebp+var_1C],eaxPAGE:00038010PAGE:00038010loc_38010:???;CODEXREF:NtfsFsdDirectoryControl(x,x)+44jPAGE:00038010lea??eax,[ebp+var_1C]PAGE:00038013push??eaxPAGE:00038014push??[ebp+var_24]PAGE:00038017push??[ebp+arg_4]PAGE:0003801Acall??_NtfsInitializeIrpContext@12;NtfsInitializeIrpContext(x,x,x)

这个dispatchroutine的开始不远处有对IoIsOperationSynchronous的调用。我看能不能方便的hook这个函数,打开windbg,选择localkerneldebuging。

如何突破icesword实现文件隐藏,iceswordwin10上使用

//-----------------------------------------------------------??GetKernelModuleAddress();???HookFunction(kernelBaseAddress,"IoIsOperationSynchronous",MyIoIsOperationSynchronous,(ULONG*)&OldIoIsOperationSynchronous);???irql=KeRaiseIrqlToDpcLevel();??returnAddr=HookCode((PVOID)OldIoIsOperationSynchronous,(PVOID)MyIoIsOperationSynchronous);??KeLowerIrql(irql);//-------------------------codeendshere--------------------如何判断是否是在文件系统的IRP_MJ_DIRECTORY_CONTROL函数中被调用的呢???ULONGcallerAddr=0;??_asmmoveax,[ebp+4]??//得到返回地址??_asmmovcallerAddr,eax???if(callerAddr-0xbfefb69d<120)?和fsd的dispatchroutine入口地址比较??{HackIrp(Irp);??}?注:0xbfefb69d这个是我调试的时候得到的地址,我直接硬编码了。

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

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

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

#defineIoSetCompletionRoutine(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参数进去,然后callicesword的完成函数就行了。

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

标签:
中小企业需要什么样的云存储和备份解决方案(云备份解决方案的优缺点是什么)
« 上一篇
返回列表
下一篇 »

如本文对您有帮助,就请抽根烟吧!