PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Logikproblem/Suche Idee



CYSER
14.12.2010, 11:20
Also es geht um folgendes...

Ich habe ein Webpanel indem ich Tasks für den Bot eintragen kann dass schaut so aus:
http://img688.imageshack.us/img688/6577/45744760.jpg

Und mein Table für die Tasks so:


CREATE TABLE tasks (
nick varchar(50) NOT NULL default '',
command varchar(255) NOT NULL default '',
bnum int(11) NOT NULL default '0',
executed int(11) NOT NULL default '0'
) TYPE=MyISAM;Nun habe ich nur ein Problem.. mein bot connected jede 10min und es wird bis jetzt nur Abgefragt wie ob er schon in der Datenbank vorhanden ist oder nicht.

Wie könnte ich es jetzt realisieren das er den Task nur einmal ausführt und sich für längere Zeit merkt dass er den Auftrag schon ausgeführt hat? Die Abfrage ob schon die erforderlichen 'executions' erfolgt sind kann man ja einfach Abfragen.

Ungf. so:


if limit < execution {
echo befehl
}

nur wenn er dann wieder connected soll er den nächsten command in der Liste ausführen.. habe irgendwie ein Brett vor dem Kopf!

Danke schonmal wenn sich jemand die Zeit nimmt sich dass durchzulesen..

Joe Cock
14.12.2010, 11:30
Genau das ist die einzige Herausforderung bei der Programmierung eines Webpanels. Du musst dir merken welcher Bot was und wann ausführt. Das ganze natürlich mit möglichst wenigen Queries und immer möglichst aktuell. Du solltest dir ein Diagramm zeichnen, in dem du festlegst, wie ein Bot in welcher Situation reagieren soll, denn ich kann dir versprechen, dass du dich sonst noch mehr verwirrst. Was wenn ein Bot während der Ausführung offline geht? Was wenn ein Command abgebrochen wird? Sollte man nicht zwischen verschiedenen Befehlen unterscheiden? Ein bin-update sollte optimalerweise nicht mehrmals ausgeführt werden ;)

CYSER
14.12.2010, 11:34
:D, ja du hast recht.. klingt logisch bei dem Rest hatte ich keine Probleme, da hängts bei mir irgendwie. Ich werd mich mal an eine Skizze setzen..

Wenn ich weitergekommen bin werde ich dass mal posten :P

EBFE
14.12.2010, 11:42
Nur als Anmerkung: warum immer den Server belasten? Der Bot kann sich doch die letzten ausgeführten Befehle merken ;)

CYSER
14.12.2010, 11:48
Ja daran hatte ich auch schon gedacht aber wie soll ich es über ne längere Zeit speichern wenn z.B. der Pc des Bots herunterfährt. In einer Text-datei oder in den Resourcen speichern? Ich wollte eigentlich eher den Server belasten.. - wie du so schön gesagt hast. Doch ich kriege es nicht gebacken ich wollte eigentlich nur immer bei executed + 1 rechnen doch das schützt nicht vor Doppelausführungen.. habe ich dann gemerkt x)

blackberry
14.12.2010, 12:26
Wenn nur der Bot sich das merkt muss der Bot auch in der Lage sein, dem Command&Control Server mitzuteilen, dass der Befehl nun oft genug ausgeführt wurde, wobei man dem Bot letztlich Kontrolle über den Server einräumen müsste, was logischer Weise nicht wünschenswert ist (vorallem deshalb, weil dann ein Angreifer "Bot spielen" könnte und so Befehle aus der DB löscht, bevor diese wirklich ausgeführt worden sind).

Eine mögliche Lösung wäre es dem Bot eine eindeutige ID zu verpassen (möglichst etwas Computer-bezogenes und nicht gerade die IP, da die sich ja i.d.R. ändert) und sich zu merken, welcher Bot sich welche Befehle wann abgeholt hat. Entsprechend dem kann man dann dem Bot die Befehle geben, die er noch nicht ausgeführt hat, bzw. der Bot kann Befehle abfragen, die er vor einem Neustart erhalten hat und noch ausführen soll.
Ein weiterer Vorteil ist der, dass sich ein Bot dann auch registrieren kann (Vorsicht: Flood-Schutz einbauen!) und so auch erweiterte Statistiken erstellt werden können.

CYSER
14.12.2010, 12:58
Danke für die Anregungen BlackBerry um nochmal drauf zu einzugehen;

..und sich zu merken, welcher Bot sich welche Befehle wann abgeholt hat...Da sind wir beim Knackpunkt angekommen es, ist ja so das ich den Bot schon mit einer eindeutigen ID registriert habe.. das ist schonmal da.

Nun habe ich eine eine Zeile in Tasks die sagen wir mal so aussieht:

Task-1, download*http://bla.de/file.exe, 100, 0Ich kann ja jetzt nicht extra für jeden Task ein Table registrieren (was phpseitig garnicht geht?) um die namen der bots einzutragen die den Task schon ausgeführt haben.

Um dann letztendlich zu checken ala:

select*eintask if botname schon im table nächster taskDas muss doch einfacher gehen, irgendwie ist mein Horizont in Php auch noch nicht so weit um mir so ein ~ "simpel" scheinendes System auszudenken.

Ich möchte das aber schon irgendwie schaffen :-(

dzdz
14.12.2010, 13:10
Was ist wen jeder bot ne eigene spalte bekommt.

Alla bot1_id|download*http://bla.de/file.exe, 100, 0,befehl2,befehl3|

sähe dann so aus

Bot1:halo server ich lebe und bin bot1 hast du befehle für mich ?
Server:jo in deiner table steht du sollst file.exe runterladen und befehl 2 ist auchnoch da.
Bot1v2:Jo exe runtergeladen und ausgeführt. Hast du noch was ?
Server:befehl 2
Bot1v2:done

hab mich mysql nur nen bischen beschäftigt

CYSER
14.12.2010, 13:43
@dzdz danke dir :P, habe jetzt mal was erstellt - vielleicht kann es wer nachvollziehen bei fragen zu bestimmten Prozeduren werde ich nochmal fragen :P

http://img838.imageshack.us/img838/8566/123123ew.jpg

blackberry
14.12.2010, 17:29
Und da hapert es halt schon bei den Basics im Datenbankdesign.

Wofür ist eine Tabelle gut? Eine Tabelle fasst gleiche Daten zusammen.

Wenn man dynamische Namen (wie Tabelle1, Tabelle2, ...) benutzt, weiß man i.d.R. schon, dass man beim DB-Design richtig Mist gebaut hat, da eine Tabelle für sich zur strukturierung dient und du dir bei dynamischen Tabellennamen auch noch die Namen merken müsstest (=> Strukturieren von Strukturiertem :S)

http://img2.imagebanana.com/img/ivg804fq/Picture2.jpg

Jeder User landet in der selben Tabelle. Jeder Task landet in der selben Tabelle.
Jeder Eintrag hat seine eigene eindeutige(!) ID.

Da ein User viele Tasks abarbeiten kann und ein Task von vielen Usern bearbeitet wird (m:n-Beziehung) muss eine Assoziationstabelle her. Diese hat als Einträge jeweils die UserID und die TaskID. D.h. sie repräsentiert die Abarbeitung eines Users von genau einem Task.

Die Menge der User, die an einem Task arbeiten kannst du dann ganz einfach selektieren und mit dem angegebenen Limit vergleichen (siehe Beispielabfrage im Bild)... je nachdem ob das mehr oder weniger sind erlaubst du dann halt das Aufnehmen neuer Tasks... Gibst du bei einem Task jeweils noch ein Datum an, an dem er ausläuft kannst du dann auch leicht eine Liste aller laufenden Tasks für einen User generieren.

Das läuft dann ungefähr so: der Client verbindet zum Server und fragt ganz nett "so Chef, was steht denn heute an?". Der Server schaut erstmal was noch zu erledigen ist - d.h. er selektiert alle laufenden Aufträge von dem speziellen User (der muss natürlich bereits seine Identifikation gesendet haben) und schaut nach bei welchen Aufträgen das "Verfallsdatum" noch nicht überschritten wurde. Die gibt der Server dem Client aus. Zusätzlich fragt der Server sich auch noch welche Aufträge laufen und NOCH NICHT von dem User bearbeitet werden (aber noch nicht von genug Clients bearbeitet werden) und gibt auch die an den User weiter.
Tjo... und dann wird geschafft. (bleibt nur zu hoffen, dass das keine DDoS-Aufträge o.ä. sind - weil das wäre ziemlich armselig)

SFX
14.12.2010, 18:10
Du musst, wie auf Blackberrys ERD bereits ersichtlich wird, eine Crosstable anlegen, über die sich dann, wenn jeder Bot und jeder Task einen PK bekommen hat, das Ganze relativ leicht handeln lässt

denkbar wäre auch eine direkte 1:n Beziehung zwischen Task und User, über einen FK in der Usertable, in dem die ID des aktuellen Tasks steht, wenn eine Aufgabe über längere Zeit ausgeführt wird

CYSER
14.12.2010, 18:35
Danke BlackBerry & SFX, nun muss ich sagen dass ich mich seit 3-4 Tagen peripher mit Datenbankensystemen beschäftige - nicht aus Lust sondern um ein Panel zu basteln und ich dachte dass ich das mal so "nebenbei" mache doch irgendwie überfordert es mich.. :>

Ich werde schauen wie ich das hinbekomme, ob es dann eine optimale Lösung darstellt ist eine andere Frage..

wacked
14.12.2010, 19:37
Um BlackBerrys Post abzurunden hier kleine auszüge des EliteLoaders:


//Select all tasks
$cmd = $db->query("SELECT * FROM `".PREFIX."_tasks_loads` ORDER BY `id`", true);
//Loop through them
while($data = $db->get_row($cmd))
{
$bots = $db->super_query("SELECT count(`id`) AS 'count' FROM `".PREFIX."_work` WHERE `type`='loads' AND `cid`='".$data['id']."' AND `botid`='".$db->safesql($_GET['id'])."'");
//skip task if already executed
if($bots['count'] > 0){ continue; }
}

Außerdem ist der Threadtitel scheiße. Es hat einfach nix mit dem thema zu tun also werden Leute die eventuell Ahnung haben nicht angesprochen und helfen dir auch nicht.

SFX
14.12.2010, 19:57
eh ja..

der Snippet ist aber nicht besonders "elite"

a) nicht besonders sauber
b) nicht besonders performant

an sowas kann man schon erkennen dass der Autor grade mal grobe Grundlagen von SQL hatte

Joe Cock
15.12.2010, 09:14
Zum Glück haben wir ja dich hier :)

Hu5eL
15.12.2010, 09:41
stimme sfx zu.
das beispiel ohne wäre mit subqueries bzw joins in ein sql gepackt und damit schöner zu lesen und wesentlich schneller...

irgendwer hat die frage gehabt ob er für jeden task ne tabelle brauch in die sich die bots eintragen
--> Nein, du hast eine tabelle in der die tasks beschrieben sind und eine in der die aufträge auftauchen diese werden dann mit den ids verknüpft...
also sollte das ganze mit 3 (n zu m)- max!!! 5 tabellen auskommen (wenn es auf eine art aufgabenverwaltung geht). Da sind dann noch keine Tabellen für die Botbeschreibung dabei, aber ob die interessiert...

echoslider
15.12.2010, 10:54
also ich würde das so machen.

es gibt eine datenbank. z.b "botnet"

dadrin sind 2 tabellen wie "aufgaben" und "erledigt"

ich weiß aber net was bei dir limit heißt. vielleicht zeit?
die struktur von "aufgaben" sieht so aus:


id,name,befehl,zeit,codedie id ist immer random und wird vom sql server generiert beim eintragen in die datenbank. name ist unwichtig halt nur für dich zur übersicht. befehl sollte klar sein. zeit sollte auch klar sein z.b 13:00,code ist ne zufallszahl möglichst hoch z.b 36824


beispiele:

[1][cmd ausführen][start cmd.exe][13:00] [36824]
[2][firefox ausführen][start firefox.exe][14:00] [47247]

so nun die index.php

aufruf vom bot:

index.php?bot=BOTNAME

vom server die auswahl treffen lassen anhand der zeit ist nicht sinnvoll. bots in russland.. andere zeit als in spanien...

die index.php schaut so nur in der tabelle "erledigt" nach. und prüft dann was der nächste befehl wäre. wenn es keine befehle mehr gibt werden alle einträge in "erledigt" zu dem bot gelöscht.also halt prüfen ob die sachen von "aufgaben" alle schon in "erledigt" sind.


"erledigt" sieht so aus:


botname,auftragsidbeispiel:

[testbot4][1]
[testbot4][2]

so ausgabe von index.php wird sein:

"1 start cmd.exe 13:00 36824"

weiß natürlich niemand was der zahlencode bedeutet.

der bot führt den befehl aus. und berechnet dann etwas z.b:

(36824-648)*2

woraus sich die zahl 72352 ergibt.

dann ruft der bot die index.php wieder auf.

./index.php?bot=BOTNAME&code=72352&id=1


so die index.php prüft nun ob (72352/2)+648 gleich 36824 ist. wenn ja dann wird der auftrag in "erledigt" eingetragen..


dabei muss man halt programmieren das die index.php noch darauf achtet das der auftrag nicht schon eingetragen wurde. sonst könnte man die db flooden.


bots müssen auf aufträge warten und müssen sich diese nicht durch irgend wo einlogen besorgen.


ne extra tabelle musste net extra anlegen für die botnamen. weil die ja übermittelt werden... und so alles getrennt wird.. kannste aber machen zur sicherheit nicht das wer bots mit allen möglichen namen "registriert"...