Viele Schadprogramme sind im Grunde nur sog. Downloader, die den Hauptteil erst nach Ausführung aus dem Netz laden.

Dieser Teil ist dann meistens so aktuell, dass er von einer Antivirensoftware nicht erkannt werden kann, und sicherlich auch verhindern wird, dass du deine AV-Software überhaupt wieder starten kannst.

Antivirensoftware ist sowieso größtenteils Schwachsinn, und die Marketing-Futzies versprechen im Grunde genommen Zauberei, die sie aus technischer Sicht gar nicht einhalten können.

Falls du also einen Trojaner mit oder ohne (völlig egal!) deaktivierter AV-Software ausführen solltest, kannst du dein System danach getrost als kompromittiert betrachten.

...zur Antwort

Dass sie z. B. die Diskussion zum akutellen Migrationspakt mit glatten Lügen vergiften und ihre Anhänger zu faul sind, sich die öffentlich einsehbaren Dokumente raus zu suchen und zu überprüfen.

Ungefähr das gleiche Niveau wie Trump bei seiner Amtseinführung, der vor einem recht leeren Platz behauptet hat, es waren noch nie so viele Zuschauer anwesend, obwohl auf den Fotos von Obamas Amtseinführung genau das Gegenteil zu sehen war.

Ich finde es deshalb erschreckend, wie dreist Gauland im Bundestag lügt, und die Anhänger jubeln auch noch ... anstatt einfach mal den offiziellen EU-Entwurf zu lesen.

Die AfDler haben doch immer etwas gegen Lügenpresse, also hätten sie hier tatsächlich mal die Gelegenheit, wirklich ungefiltert ein Originaldokument SELBST zu begutachten ... aber nee ... viel zu viel Text. Dann lieber von der eigenen Echokammer berieseln lassen und lieber Gaulands Halluzinationen lauschen. hahaha :)

...zur Antwort

Unter Windows funktioniert DLL-Hijacking nach über 20 Jahren leider immer noch, da Microsoft diese Art von Bug nicht einfach schließen kann, ohne sich anderweitig Flöhe in den Pelz zu setzen.

Deshalb kann man grundsätzlich sagen: Ja, abhängig von der auf deinem Rechner installierten Software, reicht es schon aus, eine Zip-Datei zu entpacken, und darin enthaltene Bilder, Musik, Videos, Dokumente, Wasauchimmer zu konsumieren.

Diese Art von Angriff ist allerdings nicht sehr häufig anzutreffen, also musst du dir vermutlich keinen Kopf machen! :)

Vor ca. einem Jahr hatte der Explorer in Windows eine interessante Lücke, bei der es genügte, nur in das Verzeichnis zu wechseln, in dem eine heruntergeladene und manipulierte ZIP-Datei lag. Aber wie gesagt, solche Lücken sind relativ selten. So alle Dreivierteljahre mal ... :)

...zur Antwort

Der Screenshort vom Video macht mir einen zu unseriösen Eindruck, sodass ich mir das jetzt nicht ansehen werde, aber:

Du kannst Cookies relativ komfortabel aus dem Speicher lutschen, vor allem bei Chrome, da Chrome exzessiv In-Memory SQLite-Datenbanken nutzt, für die du dir nur das entsprechende Handle mit einem beliebigen Debugger besorgen musst.

Dafür brauchst du natürlich lokalen Zugriff auf den Rechner. Dank TLS wird eine primitive MITM-Attacke kaum noch funktionieren!

Dann gibt es noch ein paar weitere Möglichkeiten, aber ehrlich gesagt glaube ich, dass dich das alles überfordern wird. :)

...zur Antwort

Favicons kannst du nicht ins PDF direkt einfügen, aber für die Anzeige im Browser kannst du einen einen Link-Header in den HTTP-Response klatschen:

Link: <http://domain.com/favicon.ico>; REL="shortcut icon"; TYPE="image/x-icon"
Link: <http://domain.com/favicon.ico>; REL="icon"; TYPE="image/x-icon"

Das hat früher funktioniert, weiß aber nicht, wie das heutzutage aussieht und wie sich die verschiedenen Browser verhalten.

Das Ganze basiert nicht auf einem Standard, sondern nur auf einem Vorschlag von 2010, ist also nicht verbindlich!

Aber, wenn deine "favicon.ico" Datei sowieso im Docroot liegt, und es wird bei PDFs nicht angezeigt, dann wird obiger Trick mit den zusätzlichen Headern auch nicht fruchten.

Aber ist das nicht egal? Warum braucht man ein Favicon bei einer PDF-Datei? :)

...zur Antwort
Sehr gute Frage!

Also wenn man Deklaration und Definition zusammen fasst und überflüssige Klammern entfernt, kommt dabei das hier raus:

int i = (int []) { 0x01 };

Damit bauen wir uns jetzt dieses formschöne Demoprogramm, bei dem ich aus praktischen Gründen mal einen etwas breiteren Integertypen ge-typedef-ed habe:

#include <stdio.h>

typedef unsigned long long ull;

int main(void) {
  ull i = (int []) { 0x01 };
  ull j = (int *)  { 0x01 };

  printf("i  = %016llX\n", i);
  printf("&i = %016llX\n", (ull)&i);

  printf("j  = %016llX\n", j);
  printf("&j = %016llX\n", (ull)&j);

  return 0;
}

Übersetzt wird der Klimmbimm hiermit:

clang -std=c99 -O0 -g -Wall -Wextra -Wpedantic foo.c

Als Ausgabe erhält man dann z. B. so etwas:

i  = 00007FFE9D10AA7C
&i = 00007FFE9D10AA80
j  = 0000000000000001
&j = 00007FFE9D10AA70

Beachte bitte auch, dass du zwei Compilerwarnungen bekommst:

foo.c:7:7: warning: incompatible pointer to integer conversion
      initializing 'ull' (aka 'unsigned long long') with an
      expression of type 'ull [1]'

foo.c:8:22: warning: incompatible integer to pointer conversion
      initializing 'ull *' (aka 'unsigned long long *') with an
      expression of type 'int'

Die Variable "i" wird also mit einem anonymen und sog. "flexiblen Array" (also einem Array ohne Größenangabe!) initialisiert, welches gar nicht wirklich existiert (!) aber auf dem Stack ganz in der Nähe von der Variablen "i" eine Adresse hat.

Da es aber von diesem flexiblen Array keinen expliziten Cast (!) in den Integer-Typen von "i" gibt (also ull bzw. unsigned long long), castet der Compiler implizit, und zeigt eine Warnung an.

Die Variable "j" wird hingegen mit einem Zeiger initialisiert, der wiederum auf die Speicherposition "1" zeigt. Aber da es auch hier nur einen Cast von der Konstanten auf einen Zeiger, und keinen Cast (!) von Zeiger auf den Typen von "j" gibt, sagt dir auch hier der Compiler in einer Warnung, dass ein Cast fehlt.

  • Im Ergebnis hat jetzt "i" den Wert der Adresse eines nicht-existenten flexiblen Arrays irgendwo auf dem Stack, wobei sich dieser Wert bei jedem Programmstart ändern wird.
  • Die Variable "j" hat hingegen bei jedem Programmstart den Wert "1", der einmal explizit in einen Zeiger gecastet wurde, und einmal implizit wieder zurück.

Fazit: Im Grunde genommen liefert dir dein Programm jedes mal eine halbe Adresse (da sizeof(int *) doppelt so groß ist wie sizeof(int) auf 64-Bit Systemen) auf dem Stack, irgendwo in der Nähe deiner Variablen "i" ... und die sieht natürlich recht zufällig bzw. nach "Müll" aus. :)

Noch etwas Zusatzinfo: Mit einer "anonymen Zeichenkette" hat das aber nichts zu tun. Genau genommen kannst du zwar auch in C und C++ anonyme Variablen ohne Namen erzeugen, hast damit aber nur noch bei C++ Zugriff darauf, da C hierfür der syntaktische Zucker fehlt. Diesen "Trick" setzt man oft u. a. bei "selbstregistrierenden Unittests" o. ä. ein.

Außerdem hat nur C++ (und nicht C), eine einzige anonyme Zeichenkette, und zwar heißt die "__func__". Bei C gibt es etwas ähnliches, wie z. B. "__FILE__", aber das sind nur Präprozessor-Makros und keine richtigen "anonymen Zeichenketten", falls du die überhaupt so nennen willst, da ja eigentlich nur die Deklaration, nicht aber der Name, anonym ist.

Deshalb wird "__func__" auch klein geschrieben, weil es im Grunde eine Variable, und "__FILE__" groß, weil es eine Art Makro ist. :)

Naja egal ... wie immer, eine schicke Frage von dir! Ich bin übrigens derjenige, der dir auch immer deine Assembler und Linux-System-Programmierfragen beantwortet hat, aber nicht wundern, weil ich meinen Account mehrmals pro Woche wechsele! Es kommt ja nur auf die Antwortqualität an. Accounts sind belanglos. ;)

Viel Spaß noch mit C! :)

...zur Antwort

Münchhausen Syndrom?

...zur Antwort

Diese Meldung heißt übersetzt so viel wie: "Avast taugt - wie alle anderen Antivirenprogramme auch - überhaupt nichts, und muss mithilfe von Drückermethoden jeden Pups so weit aufblähen, damit naive Leute für diesen Müll auch noch Geld ausgeben" :)

...zur Antwort

Nachdem dir hier schon einige E-Technik empfohlen haben, guck dir bitte auch mal an, was man beim Studium der "Automatisierungstechnik" so macht.

Jetzt weißt du, wonach du googeln musst ... vielleicht ist das ja was für dich! ;)

Für was auch immer du dich entscheidest: Viel Spaß und Erfolg! :)

...zur Antwort

Ich will jetzt nicht übertreiben, aber GENAU diese Frage wurde hier in den letzten Jahren mit Sicherheit über 100 mal gestellt ... genau genommen stellt sie jemand mindestens einmal pro Woche, manchmal auch häufiger.

Von daher: Einfach mal die Suchfunktion benutzen! ;)

...zur Antwort

Ich kaufe mir immer die "offiziellen" Arduinos im Familienpack und dazu den ganzen Elegoo-Kram einzeln.

Das ist in der Summe billiger, man Unterstützt die Firma Arduino, und man kann sich genau zusammen stellen, was man alles haben möchte. :)

...zur Antwort

Ich bin mir jetzt nicht sicher, ob ich dein Problem verstehe, aber im Grunde musst du nur ein Lambda an async() übergeben:

#include <future> // async
#include <iostream> // cout, endl

int main() {
	using namespace ::std;

	const int a = 23;
	const int b = 42;

	auto job = async([a, b] {
		return a + b;
	});

	cout << job.get() << endl;
}

Ist es das, was du so ähnlich von C# kennst?

Beachte dabei aber bitte, dass du dem Lambda-Objekt die Werte kopiert bzw. auch als Referenzen übergeben, und auch anstelle mit gebundenen Parametern mit normalen Funktionsargumenten arbeiten kannst!

Das hat alles Vorzüge und Nachteile, aber ohne zu wissen, was du vor hast, kann ich dazu weiter nichts sagen. :)

...zur Antwort

Diese "komischen Symbole" sind eigentlich nicht-portabler Pfusch.

Wenn dein Programm möglichst überall laufen soll, dann nimm die "ncurses" Bibliothek zur Hilfe:

https://en.wikipedia.org/wiki/Ncurses

Die ist kostenlos (Open Source), existiert für alle Plattformen, und damit kannst du unglaublich viel Kram auf der Konsole machen, nicht nur farbigen Text!

Viel Spaß! :)

...zur Antwort

Die Aufgabenstellung lässt so viele Lücken offen, dass folgende Lösung durchgehen muss:

#include <stdio.h>

int main(void) {
  const int values[] = {
    1, 1,
    1, 3,
    3, 4,
    1, 3,
    2, 3,
    2, 2,
    5, 2,
    2, 3,
    1, 3,
    1, 1
  };

  const size_t elems =
    sizeof(values) / sizeof(*values);

  int a = 0;
  int b = 0;

  int *pa = &a;
  int *pb = &b;

  for (size_t i = 0; i < elems; i += 2) {
    *pa = values[i];
    *pb = values[i + 1];

    printf("a = %i, b = %i\n", a, b);
  }

  return 0;
}

Damit erhältst du die erwartete Ausgabe:

a = 1, b = 1
a = 1, b = 3
a = 3, b = 4
a = 1, b = 3
a = 2, b = 3
a = 2, b = 2
a = 5, b = 2
a = 2, b = 3
a = 1, b = 3
a = 1, b = 1

Das ist zwar vermutlich nicht das, was dein Lehrer / Dozent erwartet, aber alle Anforderungen ...

  • erwartete Ausgabe erzeugt
  • höchstens vier mal a = ...
  • höchstens vier mal b = ...
  • zur Ausgabe printf("a = %i, b = %i\n", a, b); genutzt

... sind erfüllt. :)

...zur Antwort

Beide Sprachen sind empfehlenswert, weshalb ich hier jetzt keine der beiden auswählen werde. :)

Beide wollen teilweise die gleichen historisch gewachsenen Probleme erschlagen, mit teils sehr unterschiedlichen Ansätzen.

Zur Nachfolge von C - falls es überhaupt dazu kommen sollte - kann man, so denke ich, noch keine Aussage treffen, da beide Sprachen noch zu jung sind.

Ein C-Compiler mit Linker und allem drum und dran frisst ein paar zich KB und man kann ihn relativ schnell auf jeder nur erdenklichen Plattform zusammen hacken.

Rust fällt hierbei extrem negativ auf, da du dir erst mal Bloatware und Abhängigkeiten installieren musst, die an die Größe eines mittleren Betriebssystems erinnern. Deshalb laden sich die meisten Rust-Entwickler auch alles fertig im Paket runter, weil selbst bauen fast unmöglich ist, extrem viel Zeit frisst und viel Erfahrung erfordert.

Bei Go gefällt mir nicht, dass es so extrem an Google gekoppelt ist. Was dabei passieren kann, sieht man am Beispiel Oracle, die Java von Sun übernommen haben. Aber das ist nur eine persönliche Abneigung gegen Monopolisten und Großkonzerne. (C# von Microsoft ist natürlich auch ne schicke Sprache, aber Mono dümpelt immer irgendwie hinterher.)

Wie gesagt, beide Sprachen haben sehr sehr interessante Konzepte, deshalb würde ich empfehlen beide zu lernen. Gerade bei Go ist die Compiler / Interpreter Dualität ja für Einsteiger eigentlich eine super Sache, die ich mir auch bei anderen Sprachen wünschen würde.

Dass Go oder Rust aber C mittelfristig ersetzen könnten, sehe ich überhaupt nicht. :)

...zur Antwort