Neues Problem: ICMP header/Ping Abfrage

Biehler

BiehlerProductions
ID: 89792
L
4 Mai 2006
1.948
181
Das neue problem ist im Post #12 beschrieben ;)

Altes problem:
Reverse Connection (WinSocket Verbindung "tarnen")

Hi,
ich arbeite mich gerade in Client-Server programme ein.
Hab heut nen Clienten und Server geschrieben (ziemlich provisorisch) in Win32 Assembler und bin dann auf den Gedanken gekommen, das ich ja auf die selbe Art und Weise ziemlich einfach auch meinen PC fernsteuern könnte.

Dann kam mir der Gedanke, dass ein Trojaner eigentlich auch nix anderes macht, er wartet eben auf Befehle eines Clienten.

Nu isses ja so, dass einje Desktop Firewall wohl selten was von einem trojaner mitbekommt, mcih würd nun inteerssieren, wie der Trojaner seine verbindung vor de FW "versteckt"?

ich hab was von einer "reverse Connection" im Kopf, kann mir aber darunter nix vorstellen und da das Internet mir auch nix brauchbares liefert, geh ich in der Annahme, dass es einen anderen begriff dafür gibt :LOL:

Jo, meine konkrete frage: Wie kann ich eine Verbindung vor der desktop Firewall verstecken?

Und:
Webserver verwenden ja den Port 80.
Angenommen ich lasse meinen Clienten und den dazu dienenden Server auch über Port 80 laufen (weil der mit 100&iger Wahrscheinlichkeit auch in der Hardware FW freigeschaltet ist), woher weis dann Windows, für welches prog die Datenpackete bestimmt sind?

Jo, und weil ich eh grad nen Thread erstell, noch ne frage, die ich zwar eventuell bei Google selber finden könnte, aber wenn sowieso ein Thread offen ist... ;)

Ein webserver verwendet den Port 80.
Wenn ich jetzt selber einen Browser coden möchte, der lediglich ne Datei anfordern kann, könnte ich dann mittels WinSocket FUnktionen diese Datei anfordern?
Ich stelle es mir so vor, dass ich zuerst den HTTP Header über den Port 80 ermittle, damit der Server weis, dass eben eine HTTP Anforderung gesendet wird.
Dann sende ich dem den Namen der Datei, die ich will und der schickt sie mir Byteweise.

Dass das nicht so funzt, wie ich es hier beschrieben habe, ist klar, aber kann ich grundsätzlich mit den WinSocket Funktionen ne Datei anfordern, bzw. mit nem Webserver komunizieren oder benötige ich daszu spezielle Funktionen?

Weil ich hab noch ne WinAPI Funktion im Kopf, die irgendwie heißt "GetFileFromURL" oder so.
Wäre ja sinnlos, wenn ich das ganze auch per WinSocket lösen könnte.
 
Zuletzt bearbeitet:
Mir scheind deine Vorstellung von der ganzen Portgeschichte nen bisschen falsch. Evl. guckste dir das nochmal an und dann dürfte dir der Rest ganz schnell klar werden ;)

Der Punkt ist, selbst wenn ich an meinem Rechner Port 80 sperre kann ich ohne Schmerzen Inet surfen weil ich nur den Port 80 an dem entfernten Rechner brauch und nicht den an meinem. Da geht ein x-beliebiger > 1024 ( nur um den Stil zu wahren ).

Was ich mit ganz gut vorstellen könnte, dass das klappt ist : Windows scheind ne Funktion zu haben, mit der man Portfreigaben zur eigenen FW ohne Benutzerinteraktion hinzufügen kann ... ausserdem gibts da noch UPnP ... so rein theoretisch natürlich.
 
Du hast da mit deinem Webserver-Beispiel einen Denkfehler drin.

Server (der Webserver):
  • Erstellt Socket (socket()), bindet es an Port 80 (bind()), d.h. der Port ist belegt und folglich auch diesem Programm zugeordnet.
  • Danach "lauscht" (listen()) er nach eingehenden Verbindungen.
  • Geht eine Verbindung ein, akzeptiert er diese normal (accept()) und empfängt (recv()) dann die Daten, die der Client schickt und antwortet (send()).
Client (dein Browser):
  • Erstellt Socket (socket()) und versucht, mit dem Server (connect()) zu verbinden. Der Server nimmt dann an, s.o. Der Port, der clientseitig benutzt wird, den kannst du nicht steuern, das is immer ein anderer.
Webserver verwenden ja den Port 80.
Angenommen ich lasse meinen Clienten und den dazu dienenden Server auch über Port 80 laufen (weil der mit 100&iger Wahrscheinlichkeit auch in der Hardware FW freigeschaltet ist), woher weis dann Windows, für welches prog die Datenpackete bestimmt sind?
Wenn der Webserver schon auf Port 80 läuft, wird der Befehl zum Binden an den Port fehlschlagen.

Willst du eine einfache Webseite downloaden, musst du nur die Schritte oben tun. Sobald du die Verbindung hast, also der Server angenommen hat, sendest du den HTTP-Request und liest dann die Daten aus, die dir der Server geschickt hat.
Im Prinzip ganz einfach.
Weil ich hab noch ne WinAPI Funktion im Kopf, die irgendwie heißt "GetFileFromURL" oder so.
Irgendne Funktion gibts, die das alles für dich erledigt, aber da hast du halt das Problem, dass wenn was schief geht, du eigentlich keine Ahnung hast, was.

Das Kapitel in der MSDN sollte eigentlich ne gute Lektüre sein. Ich hab nur wenig Kenntnisse, was Netzwerkprogrammierung angeht, aber ich hab mal die Funktionen oben dazugeschrieben, die ich noch im Kopf hab.

edit:
4.500ster Post :D :D
 
@theHacker/buggle
Der Punkt ist, selbst wenn ich an meinem Rechner Port 80 sperre kann ich ohne Schmerzen Inet surfen weil ich nur den Port 80 an dem entfernten Rechner brauch und nicht den an meinem. Da geht ein x-beliebiger > 1024 ( nur um den Stil zu wahren ).

Erstellt Socket (socket()) und versucht, mit dem Server (connect()) zu verbinden. Der Server nimmt dann an, s.o. Der Port, der clientseitig benutzt wird, den kannst du nicht steuern, das is immer ein anderer.

achso, den port, den ich der Funktion connect übergebe, ist der Port, über den der Server kommuniziert?

Ah, das ergibt dann schon eher Sin.
Ist irgendwie auch logisch :D

@HTTP
lol, seh grad, das protokoll hat auch seine unendlich vielen Spezifikationen :ugly:

Naja, mal schauen, ob ich mich da durchwälze :LOL:


aber das mit der Verbindung verstecken?
hab mal ein bischen gegoogelt nach der genannten Funktion, bisher kein ergebniss.
mal weiter suchen, notfalls muss eben ein Trojaner Source herhalten :LOL:

schonmal thx @all und guten rutsch ins neue jahr :ugly:
 
achso, den port, den ich der Funktion connect übergebe, ist der Port, über den der Server kommuniziert?
Genau. Du (als Client) verbindest auf den Port, auf dem der Server lauscht.
Zum Ausprobieren einfach mal telnet google.de 80 machen ;)

@HTTP
lol, seh grad, das protokoll hat auch seine unendlich vielen Spezifikationen :ugly:
Ne, HTTP ist eigentlich ganz einfach.
GET/POST und ein paar Header und schon weißt du das Wichtigste :)
aber das mit der Verbindung verstecken?
Da hab ich keine Ahnung, muss aber zugeben, dass ich mich weniger mit Trojaner-Entwicklung beschäftige :ugly:

Ich könnte mir vorstellen, dass es am einfachsten ist, ein Programm zu verwenden, was schon bekannt ist und dieses dazu zu missbrauchen, aber die Firewalls erkennen ja auch, wenn ein Programm geändert wurde :think:
 
Genau. Du (als Client) verbindest auf den Port, auf dem der Server lauscht.
Zum Ausprobieren einfach mal telnet google.de 80 machen ;)

Öh, was sollt eigentlich passieren, wenn ich das Telnet prog mit den Parameter aufruf? bei mir tut sich gar nix :oops:

Ne, HTTP ist eigentlich ganz einfach.

Das Dokument kenn ich, habs gestern mal rausgesucht und hab mir gedacht, das schaut nach ziemlich viel Arbeit aus :ugly:

Ich könnte mir vorstellen, dass es am einfachsten ist, ein Programm zu verwenden, was schon bekannt ist und dieses dazu zu missbrauchen, aber die Firewalls erkennen ja auch, wenn ein Programm geändert wurde :think:

Jo, geht nicht, weil die meistem FW's mit Checksummen arbeiten.

Werd mich wohl mal durch die ganzen "Underground HaX0r" Boards suchen müssen :ugly:

oder ein bekannter ging mal wieder im ICQ online, der hatte mal ein prog, mit dem er mein ICQ Passwort ausgelesen hat und an seinen PC geschickt hat.
Auch ohne, dass das die FW bemerkte.
mal schauen, ob er den Code dazu hat.
 
Öh, was sollt eigentlich passieren, wenn ich das Telnet prog mit den Parameter aufruf? bei mir tut sich gar nix :oops:
Normal sollte sich der Bildschirm löschen, wenn du eine Verbindung hast.
Dann kannst du mit dem Server kommunizieren. Natürlich is das nur was für ASCII-basierende Protokolle wie HTTP, FTP, POP3, SMTP, ...
(So hab ich damals gelernt, ne Mail zu verschicken 8) :biggrin:)

Wenn du die Verbindung hast, tipp folgendes ein:
GET / HTTP/1.1\r\n
Host: www.google.de
\r\n
Connection: close\r\n
\r\n
Daraufhin sollte dir der Server die Webseite liefern ;)

Weil ich grad eh was nachgeschaut hab, hab ich hier grade den Link für die MSDN:
https://msdn2.microsoft.com/en-us/library/ms741416.aspx
 
//Nochmals Edit:
So, das mit Telnet funzt doch, sowohl mit google, als auxch mit meinem provesorischen Server.
Es scheiterte scheinbar an der Blödheit des Ausführenden :ugly:

Dann kannst du mit dem Server kommunizieren. Natürlich is das nur was für ASCII-basierende Protokolle wie HTTP, FTP, POP3, SMTP, ...
(So hab ich damals gelernt, ne Mail zu verschicken 8) :biggrin:)

Könnt ich auch mal ausprobieren, dann lern ich wenigstens endlich mal die verschiedenen Protokoll Header kennen.
Schaden kann das Wissen nie was :think:

Also je mehr ich über das zeug lese, umso einfacher erscheint es mir. :think:


Weil ich grad eh was nachgeschaut hab, hab ich hier grade den Link für die MSDN:
https://msdn2.microsoft.com/en-us/library/ms741416.aspx

THX :)

ne frage nebenbei:
Wen ich die IP von jemanden habe, kann ich dann praktisch nur etwas ausrichten, wenn auf dem PC ein Server läuft, dessen Sicherheitslücken ich ausnutzen könnte?

Und das programm ping.exe sendet ja an einen PC eine Anfrage.
Wieso antwortet der PC darauf?

//edit:
OK. Die Ping Frage hat sich dank Wikipedia gelöst.

btw²
Weil mir grad wieder der Link zwischen die Finger kommt:
https://www.stophiphop.com/modules/news/article.php?storyid=184
Wesi nicht, obs schon jemand kennt. Auch egal, ich finds immer wieder hammergeil :LOL:

//edit:
Hab nun den Artikel hier:
https://www.heise.de/security/artikel/82054
Ganz interessant, aber rein gefühlsmäßig würd ich sagen, dass trotzdem die FW nachfragt, ob das programm connecten darf?
 
Zuletzt bearbeitet:
hab jetzt mal so ne "reverse Conenction" asuprobiert, trotzdem muss ich beide Progs (Client+Server) von meiner FW freigeben :ugly:

Ist hier im Forum kein potentieller Trojaner Coder, der mir helfen könnte?

Ansonsten werd ich jetzt mal versuchen, das ICMP protokoll einzubauen, damit ich ne Ping abfrage starten kann.
 
Ist hier im Forum kein potentieller Trojaner Coder, der mir helfen könnte?

Nein, ich gehöre nicht zur Regierung ^^

evtl. ganz interessant zum Testen: https://www.atelierweb.com/awft/ (bei meinem Test mit Windows-FW 9:1 für den potentiellen Trojaner (mit Hijacking des Firefox)).
Ansonsten bin ich noch hierrauf gestoßen:
https://faq.underflow.de/#SECTION000100000000000000000 - besonders der Abschnitt "Wie Personal Firewalls umgangen werden:" dürfte interessant sein.

Gruß
 
Nein, ich gehöre nicht zur Regierung ^^

evtl. ganz interessant zum Testen: https://www.atelierweb.com/awft/ (bei meinem Test mit Windows-FW 9:1 für den potentiellen Trojaner (mit Hijacking des Firefox)).
Ansonsten bin ich noch hierrauf gestoßen:
https://faq.underflow.de/#SECTION000100000000000000000 - besonders der Abschnitt "Wie Personal Firewalls umgangen werden:" dürfte interessant sein.

Gruß

Thx, der 2. Link ist in der Tat sehr interessant, bzw. die seiten, auf die dort verlinkt werden.
Das wäre sowas, was ich suche; ich versuch grad zu verstehen, wie diese Beispielprogramme arbeiten.
Blöd, dass der Source von tooleaky ( https://tooleaky.zensoft.com/ ) in C++ ist :ugly:
Naja, ein Programmierer muss mit sowas fertig werden :think:

Wenn jemand weitere Links im Angebot hat, kann er sie gerne posten, wär ich sehr froh ;)
 
Also folgende Problematik:
Ich versuche eine einfache "Ping Abfrage".
also einfach ein Echo Request an ne IP mit dem ICMP protokoll.

Problem: Das Packet wird zwar verschickt, kommt aber nicht an.
Nun könnte man meinen, es liegt an der Daten-Empfangsfunktion.
Isses aber nicht.
Weil wen ich den Clienten starte, sendet er zuerst ein Packet an meine IP, danach versucht er sofort die Antwort des Computers zu empfangen.
Da kommt unter normalen Umständen nix an.
Wenn ich allerdings ne Ping Abfrage mit dem Programm ping.exe auf meine IP starte, kommt sehr wohl ein packet bei meinem Clienten an.

--> Mein Client kann also Daten empfangen.

ich gehe nun deshalb davon aus, das der ICMP Header falsch ist.
Bzw. die Checksumme.
Ich habs mir so vorgestellt, dass der Ciomputer, wenn ein Echo request eintrifft, die Checksumme berechnet, und diese mit der eeingetragenen vergleicht.
Wenn diese nicht stimmen, schmeist der PC die Anfrage "weg".

Liege ich mit dieser Annahme richtig?

wenn ja, gibt sich die Frage, wie man diese Checksumme berechnet.
Hier: https://www.c-worker.ch/tuts/raw_icmp.php
wird das verfahren beschrieben. Mal abgesehen davon, dass es etwas schwammig ebschrieben ist, habe ich versucht, die Funktion "unsigned short Checksum(unsigned short *p_usBuffer, int iSize)" nach ASM zu konvertieren.
das ist der C-Code:
Code:
unsigned short Checksum(unsigned short *p_usBuffer, int iSize)
{
  unsigned long lCheckSum = 0;

  while(iSize > 1)
  {
    lCheckSum += *p_usBuffer++;
    iSize -= sizeof(unsigned short);
  }

  if(iSize)
    lCheckSum += *(unsigned char*)p_usBuffer; // + 0 entfällt, da überflüßig

  lCheckSum = ((lCheckSum >> 16) + (lChecksum & ffff)) + (lCheckSum >> 16);
  return (unsigned short)(~lCheckSum);
}

Das ist mein ASM Code:
Code:
	;Checksdum berechnen
	LEA EDI, ucType ;Pointer auf das Datenpacket
	MOV ECX, 16 ;Größe des Packetes
	LOOP_CHK:
		MOV EAX, CHKSUM
		ADD EAX, [EDI]
		MOV CHKSUM, EAX
		ADD EDI, 2
	LOOP LOOP_CHK
	MOV EAX, CHKSUM
	ADD EAX, EAX
	AND EAX, EAX
	MOV usChkS, EAX

also ich schätze, die Konvertierung ist fehl geschlagen :ugly:
Ich will eigentlich auch keinen Sourcecode für die Umwandlung, sondern nur ne gute Erläuterung, wie das funktioniert?
Der Absatz in der RFC hilft mir eigentlich auch nicht :think:

The 16 bit one's complement of the one's complement sum of all 16
bit words in the header. For computing the checksum, the checksum
field should be zero. This checksum may be replaced in the
future.
Ich versteh nur complement :ugly:

btw
Mit dem verbindungs verstecken:
ich habs momentan mal aufgegeben, die techniken, so wie sie auf den obigen Seiten beschrieben sind, sind bereits alle überholt, will sagen, von FW Herstellern ausgemertzt.
Naja, auch egal, das ICMP zeugs ist mir im Moemnt eh wichtiger :ugly:

Edit:
und ne frage zum IP header:
Im IP Header ist doch ein Feld, wo die Gesamtgröße drinn steht.
nur von was die Gesamtgröße?
Vom IP Header oder vom gesamten verschickten packet?
Weil soweit ich das gelesen hab, hat der IP Header mindestens 20Byte, kann aber größer sein.
Für mich stellt sich jetzt die Frage:
Wie finde ich dann die Gesamtgröße des Headers heraus?
 
Zuletzt bearbeitet:
Die Formulierung ist in der Tat etwas.. mmh.. seltsam ;)

Eins vorweg, keine Ahnung ob der ASM Code stimmt, damit kenn ich mich nicht aus ;)

Daher einfach mal das Prinzip:
Zuerst brauchst du eine 32 Bit Variable zum addieren.
Dann addierst du einfach immer 2Byte-weise (also in 16-bit schritten) den ganzen IP-Header. D.h. du nimmst einen Pointer auf den Anfang des IP-Headers und behandelst den als 16-Bit Variable, danach wird der Pointer um 2 Byte erhöht bis du am Ende des IP Headers bist (die Länge steht im IHL, die 2. 4 Bits des 1. Bytes im IP Header. Multipliziert mal 2 erhälst du die Anzahl der 2Byte-Wörter).
Danach addierst du den Übertrag noch zur Checksumme dazu (sprich checksum>>16) bis eine 16bit variable ausreicht die checksumme zu speichern. Das was da rauskommt wird noch invertiert und fertig ist die Prüfsumme.

Spasseshalber mal die Funktion zur Berechnung der TCP Prüfsumme (wie IP, nur zusätzlich noch über die Daten des Pakets + Pseudoheader )
Code:
/*********************************************
* function write_tcp_checksum()              *
**********************************************
* Errechnet die TCP Checksumme               *
* Parameter: char adr (Adresse des TCPPakets)*
*********************************************/
void write_tcp_checksum(char adr, unsigned int length, IP des_ip) {
 unsigned long checksum=0;
 unsigned short puffer=0;
 unsigned int i;
 char ungerade=0;

 if ((length%2)==1) { ungerade=1; write_dma_s(adr+((34+length)>>8),(34+length)%256,0); }

 	for (i=0;i<length+ungerade;i=i+2){ //jeweils die 2Byte Wörter addieren
 		puffer =((read_dma_s(adr+((34+i)>>8),(34+i)%256)<<8)&0xFF00)+(read_dma_s(adr+((34+i+1)>>8),(34+i+1)%256)&0xFF);
		checksum = checksum + (unsigned long)puffer;
	}	
	for (i=0;i<4;i=i+2){
		puffer =((our_ip[i]<<8)&0xFF00)+(our_ip[i+1]&0xFF);
		checksum=checksum+puffer;	//eigene IP dazu addieren
	}
	for (i=0;i<4;i=i+2){ //Ziel IP dazu addieren
		puffer =((des_ip.ip[i]<<8)&0xFF00)+(des_ip.ip[i+1]&0xFF);
		checksum=checksum+puffer; 	
	}
	checksum = checksum + 6 + length; //länge berücksichtigen

  while (checksum>>16)
	  checksum = (checksum & 0xFFFF)+(checksum >> 16); //überträge sichern

  checksum = (~checksum);//invertieren
  write_dma_s(adr,50,(checksum>>8)%256);//an ziel adresse schreiben
  write_dma_s(adr,51,checksum%256);
}
Anmerkung: Bei einer ungeraden Anzahl von Datenbytes muss auf eine gerade Anzahl mit 0-Werten aufgefüllt werden. Die Funktion read_dma_s liest ein Byte von der adresse arg1<<8+arg2. Die Funktion ist von nem Miniwebserver für einen kleinen AT Controller ;) Aber ich denke das Prinzip wird damit klar.
 
Zuletzt bearbeitet:
Daher einfach mal das Prinzip:
Zuerst brauchst du eine 32 Bit Variable zum addieren.
Dann addierst du einfach immer 2Byte-weise (also in 16-bit schritten) den ganzen IP-Header. D.h. du nimmst einen Pointer auf den Anfang des IP-Headers und behandelst den als 16-Bit Variable, danach wird der Pointer um 2 Byte erhöht bis du am Ende des IP Headers bist (die Länge steht im IHL, die 2. 4 Bits des 1. Bytes im IP Header. Multipliziert mal 2 erhälst du die Anzahl der 2Byte-Wörter).
Danach addierst du den Übertrag noch zur Checksumme dazu (sprich checksum>>16). Das was da rauskommt wird noch invertiert und fertig ist die Prüfsumme.

Also erstmal THX für die Erklärung, das liest sich gleich viel besser :D
Aber du sprichst vom IP Header und von der Checksumme des IP Headers?
Wenn ich ein ICMP Packet versende, sieht das Packet doch so aus:

IP HEADER
-----
ICMP HEADER
----
Eventuelle Daten

wenn ich jetzt nen Socket erstelle und ein ICMP packet versenden will, erstellt windows für mich automatisch den IP Header, nur wenn das packet ankommt, muss ich den IP Header selber noch auswerten ?
(Zumindest geht das so aus meinen Quellen hervor :ugly: )

Und bei der berechnung der Checksumme muss ich nur den Header beachten?
Den Datenbereich nicht mehr mit?
Was hat dann die Checksumme für nen Sinn :think:
 
Ich muss zugeben, dass ich gleich runtergescrollt bin, weil oben stand neues problem in #12. Aus #12 war jetzt nicht ersichtlich ob du die Checksumme erstellen oder auswerten willst und ob du jetzt die Checksumme von IP oder ICMP meinst.

Das Auswerten läuft aber genauso ab, nur dass das Prüfsummenfeld nicht 0 ist. Stattdessen muss am Ende 0xFFFF rauskommen, dann ist die Prüfsumme korrekt.

Für die Integrität der Daten ist die Transportschicht zuständig, also im Normalfall TCP oder UDP oder sonst ein Layer 4 Protokoll (darum wird bei TCP die Prüfsumme ja auch über die Daten gebildet).

Im konkreten Fall von ICMP wird die Prüfsumme des ICMP Headers genauso gebildet wie bei TCP ohne den Pseudoheader, sprich einfach beim Datenbereich des IP Pakets anfangen (Type Feld vom ICMP Header) bis das Ende erreicht ist (IP-Längenfeld - IHL*4-Bytes).

Letztendlich ist das aber eine zig-fache Absicherung, da bereits auf Schicht 1 eine CRC Prüfsumme gebildet wird, die die Netzwerkkarte selbstständig auswertet. Bei den Netzwerkkarten mit denen ich gearbeitet hab wurden CRC Fehler gleich von der Netzwerkkarte verworfen und kamen gar nicht erst beim Betriebssystem an.
 
OK. THX.
ich bin mir zwar nicht sicher, ob ich alles richtig verstandne hab, aber ich versuchs jetzt mal. :)


Bitte Edit2 beachten :wall:


Edit:

Also Statusbericht:
Ich hab jetzt mal versucht das einzubauen, meiner Meinung nach, habs ich auch geschafft.
Aber das problem bleibt:
ich kann zwar ein Packet sendne, aber es kommt keines an.
Erst wenn ich ping.exe auf meine IP laufen lass, kommt ein Packet an.

Wie sieht der Header von ICMP aus?
Imo doch so:
8 Bit: Type
8 Bit: Code
16 Bit: Checksumme

Und danach kommen optionale Daten.
Wenn ich jetzt z.b. ne Ping Abfrage machen möchte, muss ich ein Echo request senden, also:

8 bit: type = 8
8 Bit: Code = 0
16 Bit: Checksume = xy
32 Bit: Daten = "abcd"
(hoffe, das ist einigermaßen verständlich)

Nun muss der Computer doch mit einer Echo Reply antworten, was er aber nicht tut.
Er verwirft also wahrscheinlich das Packet.
Wie könte man nun nachvollziehen, was da schief läuft?

Edit2: Alles im grünen bereich!
Ich idiot hab die Inversion falsch eingebaut :wall:
ich Depp mach mit der Checksumme ne UND verknüpfung anstatt ne NOT :ugly:
 
Zuletzt bearbeitet: