Auf jeden Fall Assembler. Allerdings pfuschen Skriptkiddies in den letzten Jahren auch gerne mit C# oder ähnlichem Müll rum.

Früher wurde man ausgelacht, wenn man Malware nicht in Assembler, sondern in C++ oder Delphi gebaut hat, und diese dann nicht mehr ein bis zwei KB, sondern bei gleicher Funktionalität über 100 KB groß war.

Seit einigen Jahren läuft mir aber oft Malware über den Weg, welche die 30 Megabyte-Grenze sprengt. Weit mehr als 20 MB sind durchaus üblich ... leider.

Irgendwie wird überall nur noch gepfuscht, auch bei den Malwareautoren.

Fazit: Meine erste Wahl wäre Assembler. Danach kommt erst mal sehr sehr lange nichts, und dann irgendwann vielleicht C oder C++.

Eine mehrere Megabyte große Malware mit einer gemanageten Sprache wie C# oder Java zu schreiben ist zwar möglich, aber nichts für Leute, die etwas auf sich halten. (Es sei denn natürlich, man möchte mit Hilfe von z. B. Reflection bestimmte Dinge an anderer Software, geschrieben in eben einer dieser Sprachen, etwas manipulieren ... dann ist das natürlich völlig legitim.)

Aber die Standard-Trojaner-Funktionen, wie Screenshot, Dateibrowser, und und und macht man mit Assembler, und am Ende purzelt eine schön kleine Executable raus.

...zur Antwort

Ich habe gerade nochmal - einfach aus Sport - eine Template-Funktion geschrieben, welche die Parität entweder als konstanten Ausdruck oder auf Wunsch auch zur Laufzeit von einem beliebigen vorzeichen-behafteten oder -losen Ganzzahltypen berechnet:

#include <ios> // boolalpha
#include <iostream> // cout, endl

#include <limits> // numeric_limits
#include <type_traits> // is_integral, is_signed

#include <cstdlib> // size_t

template <typename INT>
constexpr bool parity(const INT n) noexcept {
  using namespace ::std;
  static_assert(is_integral<INT>());

  using UINT = make_unsigned_t<INT>;
  using limits = numeric_limits<UINT>;

  static_assert(2 == limits::radix);
  constexpr size_t bits { limits::digits };

  UINT par { static_cast<UINT>(n) };
  for (size_t i { bits >> 1 }; i; i >>= 1) {
    par ^= par >> i;
  }

  return par & 1;
}

int main() {
  using namespace ::std;

  cout << boolalpha;

  const long l = 0b0101;
  cout << parity(l) << endl;

  const int i = 0b1011;
  cout << parity(i) << endl;

  const short s = 0b1001;
  cout << parity(s) << endl;

  const char c = 0b0100;
  cout << parity(s) << endl;
}

Die Funktion dürfte im Schnitt maximal-effizient sein und hat eine Laufzeitkomplexität von O(1) mit exakt log2(sizeof(INT)) durchläufen, also praktisch 5 "Faltungen" bei einem 32 Bit Integer.

Um den Code übersetzen zu können, ist aber ein C++17 Compiler notwendig.

Wie gesagt, das war jetzt nur Sport, weil "KarlRanseierIII" in seiner Antwort etwas von "aufgehübschter" und "lesbarer" geschrieben hat. Darunter verstehe ich als C++ler "effizienter" und "portabler", was mich soz. getriggert hat. ;)

Der Fragensteller kann meinen Template-Code getrost ignorieren! Das ist noch ganz weit von dem jetzigen Kenntnisstand entfernt. Aber weil ich das jetzt sowieso geschrieben hatte, kann ich es auch gleich hier veröffentlichen. :)

...zur Antwort

Ja, das ist möglich, sogar mit mehreren völlig unterschiedlichen Ansätzen.

Aber da der Schutz ja nur ein paar Schüler abhalten soll, und DDoS sowieso die primitivste aller Angriffsarten ist, die ja nur von Kindern genutzt wird, reichen die Maßnahmen des Lehrers sicher aus.

Wie du effektiv den IP-Blocker und / oder den DDoS Schutz umgehen kannst, bzw. einfach den Server down bekommst, würde dich aber vermutlich überfordern. Deshalb versuche lieber auf anderem Wege an eine "Eins in Englisch" zu kommen. :)

PS: Hab gerade die anderen Antworten überflogen, und möchte nochmal hinzufügen, dass im Idealfall ein einziger Request (oder wenn man es anders anstellt, nur eine Hand von Clients, keine Tausenden!) ausreicht, um den Server abzuschießen.

...zur Antwort

Ich stimme bewusst nicht ab und ich werde dir auch keine Antwort auf deine Frage geben. Nur ein paar Hinweise:

Du solltest dich von dem Gedanken verabschieden, dass C etwas mit C++ zu tun hat. Die sind historisch zwar irgendwie miteinander verbunden, aber inzwischen gibt es so dermaßen viele und gewaltige Unterschiede, dass man C und C++ als völlig voneinander unabhängige und inkompatible Sprachen ansehen sollte. Der Erfinder von C++ - Bjarne Stroustrupp - sieht das neben vielen anderen aus dem C++ Standardisierungs-Komitee - wie Herb Sutter - übrigens auch so.

C++ beherrscht einen großen Teil der C Syntax, umgekehrt kann man das nicht unbedingt behaupten. Aber vor allem die Konzepte und Herangehensweisen bei der Programmierung an sich sind VÖLLIG unterschiedlich!

Allein schon das kleinstmögliche Programm (abgesehen von einigen Leerzeichen) sieht in C so aus:

int main(void) { return 0; }

... in C++ hingegen so:

int main() {}

Du kannst in C nicht wie in C++ programmieren, und umgekehrt gilt das gleiche. Nichtsdestotrotz tun das viele Einsteiger, und es ist das beste Merkmal, um Anfängercode erkennen zu können.

Beruflich und privat entwickle in in beiden Sprachen sehr gerne, vermische diese aber nie und habe für beide Sprachen einen gänzlich anderen Stil, bzw. eine inkompatible Herangehensweise.

Wenn ich etwas Schlankes ohne Abhängigkeiten mit maximaler Portabilität schreiben will, dann nehme ich C89. Auch wenn die neueren Standards wie C99 und vor allem C11 wunderbare Features bieten, ist es aus verschiedenen Gründen oft sinnvoll, selbst Hand anzulegen. Aber natürlich auch nicht immer. Mit genügend Erfahrung weiß man einfach, wann man was am besten einsetzen sollte.

Falls ich hingegen etwas größeres schreibe, bei dem moderene Konzepte umgesetzt werden sollen, und was maximal effizient mit den Ressourcen umgehen soll, dann nehme ich C++17. Funktionalitäten von C++11 und C++14 sind zwar ebenfalls enorm wichtig und richtig, aber bei C++ möchte ich ohne einige C++17 Features gar nicht mehr entwickeln.

Wie du siehst, setze ich bei C auf den ältesten Standard, bei C++ hingegen auf den neuesten. Das hat sich bei mir im Laufe der Jahre als optimale Herangehensweise herauskristallisiert. Aber auch hierbei gilt natürlich wieder: Man muss im Einzelfall abwägen, ob nicht vielleicht doch C++11 oder C99 geeigneter ist. Hängt natürlich auch immer vom Projekt ab.

Auf jeden Fall solltest du C und C++ als völlig unabhängige Programmiersprachen auffassen, die rein gar nichts miteinander zu tun haben. Es wird kaum eine Aufgabe geben, die länger als 2 Zeilen ist, und in C und C++ identisch gelöst werden wird. Wie gesagt, Anfänger machen das zwar trotzdem oft, weil sie es nicht besser wissen, aber als erfahrener Entwickler sollte man genügend Wissen mitbringen, um die Unterschiede kennen und nutzen zu können.

C ist vom Umfang her wesentlich überschaubarer als C++, und C++ dürfte eine der Feature-reichsten Sprachen sein, die du finden kannst. Hinzu kommt, dass die Standardbibliothek von C++ um ein Vielfaches größer ist, als die recht Schlanke von C.

Das heißt, für Einsteiger ist vermutlich C am Anfang leichter, da du hierbei mit sprachübergreifenden Grundkonzepten wie Bedingungen, Schleifen, und solchem Kram in Berührung kommst.

Falls du danach aber C++ lernst, musst du teilweise völlig umdenken, vor allem bei Themen wie der Fehlerbehandlung, dem Programmfluss, uvm.

Aber die Reihenfolge, bleibt letztendlich dir allein überlassen. :)

...zur Antwort
Weitere Inhalte können nur Nutzer sehen, die bei uns eingeloggt sind.