# qt oder gtk? Buch oder Internet?

## Pamino

Hallo, 

ich piele zur Zeit mit dem Gedanken ein bisschen programmieren zu lernen. C++ ist glaub ich das vernünfitgste, wenn auch schwerste? Da ich natürlich auch meine Programme grafisch darstellen möchte muss ich mich entscheiden ob ich für qt oder gtk programmierne will.

Mein momentaner Favorit ist qt, weil es auf mich einen besser etwickelten eindruck macht und auch für windows verfügbar ist. Verbessert mich bitte, wenn ich falsch liege. Gibt es zwischen den beiden eignedlich Geschwindigkeitsunterschiede?

Natürlich ist das nicht mein einziges Problem, ich brauche selbstverständlich auch Fachlektüre. In dem Bereich war leider die Suchfunktion nicht sehr hilfreich. Ich bräuchte etwas für totale Anfänger die C++ anhand von qt bzw gtk (ich möchte vorerst mich nur mit ein von beiden beschäftigen) beigebracht bekommen. Bei amazon.de gibt es ein qt buch von Trolltech, aber die Kommentare dort waren miserabel und wenn sie auch nicht sehr glaubwürdig waren, zweifle jetzt an dem Buch. Hat hier jemand Erfahrungen mit derartiger Lektüre oder soll ich gar nach howtos im internet programmieren?

Danke für eure hilfe  :Very Happy: 

----------

## _hephaistos_

1) C++ -> QT

2) geschwindigkeitsmäßig is nur subjektiv ein unterschied... -> IMHO

3) Lektüren: QT API und KDE Libraries API

cheers

----------

## Pamino

Danke für die schnelle Antwort  :Smile: 

1) also kann ich mit c++ theoretisch gar kein gtk...?

2) das liegt auch teiweise an den recht umfangreichen qt programmen schätz ich. QT ist technisch besser sagt ein bekannter - hat er recht?

3) Ich vergaß zu sagen dass zu ich zu Beginn nicht für KDE sondern rein für qt programmieren will.... Was sind das für lektüren die du nanntest? Bücher? *nix mit den namen find*

----------

## Gentoonie

Natürlich kann man auch mit C++ für GTK programmieren, und ich sehe ehrlichgesagt kein großes problem darin dies auch zu tun.

----------

## _hephaistos_

 *Pamino wrote:*   

> 1) also kann ich mit c++ theoretisch gar kein gtk...?

 

doch, geht schon

 *Quote:*   

> 2) das liegt auch teiweise an den recht umfangreichen qt programmen schätz ich. QT ist technisch besser sagt ein bekannter - hat er recht?

 

jo, die QT Struktur is IMHO schon ziemlich sehr gut...

 *Quote:*   

> 3) Ich vergaß zu sagen dass zu ich zu Beginn nicht für KDE sondern rein für qt programmieren will.... Was sind das für lektüren die du nanntest? Bücher? *nix mit den namen find*

 

http://doc.trolltech.com/3.0/

----------

## Earthwings

Wenn du *anfängst* zu programmieren, würde ich nicht gerade mit C++ einsteigen. Installier dir eclipse 3.1 und fang mit java an. eclipse als IDE ist hervorragend und java bewahrt dich erst mal vor einigen C/C++ Hässlichkeiten. Von GUIs würde ich auch erst mal die Finger lassen. python wäre auch noch ne Möglichkeit als Einstieg, gibt aber keine ordentlichen IDEs dafür.

----------

## Pamino

 *hephaistos6 wrote:*   

> http://doc.trolltech.com/3.0/

 

We assume that you already know C++!  :Shocked: 

 *Earthwings wrote:*   

> Wenn du *anfängst* zu programmieren, würde ich nicht gerade mit C++ einsteigen. Installier dir eclipse 3.1 und fang mit java an. eclipse als IDE ist hervorragend und java bewahrt dich erst mal vor einigen C/C++ Hässlichkeiten. Von GUIs würde ich auch erst mal die Finger lassen. python wäre auch noch ne Möglichkeit als Einstieg, gibt aber keine ordentlichen IDEs dafür.

 

Ja das hab ich schon oft gehört gelesen ^^. Du wirst sicher auch recht haben, aber den Teil mit GUIs glaub ich nich *g*. Man kann doch objektorientiert einsteigen oder eben nicht und ich hab hier auch ein kleines Anfänger-buch für windows, das hat damals (vor 2 jahren) nen heiden Spaß gemacht (C++). Ich bin glaub ich nicht gedulidg genug um erst was zu lernen was ich gar nicht möchte *g*. 

Deshalb brauch ich ja eine Fachlektüre wie das Borland buch für Windows die mir den Java-losen Einstieg etwas erleichtert.

----------

## mrsteven

Sehe das eigentlich ähnlich wie Earthwings, lern erstmal Standard-C++ (vielleicht vorher Python) und kümmere dich dann um den ganzen GUI-Kram. Für die Entwicklung von grafischen Oberflächen wäre gtkmm noch ganz nett, da es relativ "sauberes" C++ benutzt.

Für Standard-C++ würde ich mir an deiner Stelle auf jeden Fall ein Buch besorgen, für gtkmm gibt es ein schönes Tutorial auf der Homepage.

----------

## Pamino

 *mrsteven wrote:*   

> Sehe das eigentlich ähnlich wie Earthwings, lern erstmal Standard-C++ (vielleicht vorher Python) und kümmere dich dann um den ganzen GUI-Kram. Für die Entwicklung von grafischen Oberflächen wäre gtkmm noch ganz nett, da es relativ "sauberes" C++ benutzt.
> 
> Für Standard-C++ würde ich mir an deiner Stelle auf jeden Fall ein Buch besorgen, für gtkmm gibt es ein schönes Tutorial auf der Homepage.

 Nun gut. Dann erst mal ohne GUI  :Smile:  Kann mir dann jemand ein Linux c++ büchlein empfehlen?

----------

## zervus

 *Pamino wrote:*   

>  Kann mir dann jemand ein Linux c++ büchlein empfehlen?

 

Schau mal auf Tech Books For Free. Ganz unten steht übrigens 'Thinking in C++', das ist mir schon von mehreren Seiten ans Herz gelegt worden.

----------

## Pamino

So, hat ein paar Tage gedauert für diese Antwort, aber besser spät als nie!  :Very Happy: 

Ich hab mal das buch von zervus gesaugt (THXTHX!  :Wink:  ) und möcht euch jetzt das, was ich in der zwischenzeit gelernt habe zeigen.

Ist nichts besonderes und hat natürlich  keine GUI: (Ich weiß, über den Nutzen lässt sich streiten)

http://mitglied.lycos.de/dumdelidumm/cleverloader-0.1a

----------

## Gekko

Poste doch bitte den Quelltext, sonst kann kein Mensch beurteilen, was Du schon so alles gelernt hast  :Wink: 

Binaries ausführen ist nicht jedermanns Sache (möchte hier und jetzt niemanden was unterstellen!!)

Und wenn Du was veröffentlichst wäre eine kleine Doku in Form einer Readme z.B. nicht schlecht. Woher soll jemand wissen was ein cleverloader macht? Ich kann mir darunter halt recht wenig vorstellen (da es ja keine Infos darüber gibt)

----------

## Pamino

 *Gekko wrote:*   

> Poste doch bitte den Quelltext, sonst kann kein Mensch beurteilen, was Du schon so alles gelernt hast 
> 
> Binaries ausführen ist nicht jedermanns Sache (möchte hier und jetzt niemanden was unterstellen!!)
> 
> Und wenn Du was veröffentlichst wäre eine kleine Doku in Form einer Readme z.B. nicht schlecht. Woher soll jemand wissen was ein cleverloader macht? Ich kann mir darunter halt recht wenig vorstellen (da es ja keine Infos darüber gibt)

 ^^ den quelltext? dann seht ihr ja den portage wurm und den pam-trojaner!! *G* Ne, vertraut mir - das kann ich nich und habs auch nich vor zu tun. Und da das kleine Programm, nicht gut genug ist um ein Thread mit Readme und dem drumundran zu erstellen, startet es doch einfach in dem ihr es ausfürhbar macht und per konsole startet. Dort ist eine kleine beschreibung....  :Laughing: 

----------

## Gekko

 :Rolling Eyes:  mach ich bestimmt nicht   :Shocked: 

----------

## psyeye

Eins noch: Java (Eclipse als IDE ist unschlagbar) mit den Gnome- / Gtk-Bindings ist eine  feine Sache!

Stichwort also: java-gnome

Ausprobieren - für den Anfang und den Großteil der Anwendungen ist Java wie geschaffen für!

psyeye

----------

## Gekko

Ich hab mir mal die Strings in deinem Proggy angeguckt, ohne es jetzt ausgeführt zu haben und würde Dir folgendes raten:

Bau das Dings so um, dass es Parameter annimmt, und falls keine übergeben wurden -> Hilfetext der die Funktionalität erklärt ausspucken.

Warum ich das für sinnvoll halte: Automatisiertauglichkeit.

----------

## Pamino

 *Gekko wrote:*   

> Ich hab mir mal die Strings in deinem Proggy angeguckt, ohne es jetzt ausgeführt zu haben und würde Dir folgendes raten:
> 
> Bau das Dings so um, dass es Parameter annimmt, und falls keine übergeben wurden -> Hilfetext der die Funktionalität erklärt ausspucken.
> 
> Warum ich das für sinnvoll halte: Automatisiertauglichkeit.

 Was für Parameter? Und wie schaust du strings an ohne es auszuführen?  :Laughing: 

----------

## Gekko

in etwa sowas z.B.:

```
$ cleverloader --url --~/downloads --001-023
```

oder so ähnlich zum aufrufen.

Habs mir einfach im Vim angeguckt  :Laughing: 

Naja, und wget aufrufen kann ja jeder   :Mr. Green: Last edited by Gekko on Wed Apr 20, 2005 5:26 pm; edited 1 time in total

----------

## ruth

Hallo,

folgendes noch:

system() calls sind schwer sicher zu implememtieren.

Vor allem, wenn man sowas macht: system(wget ...)

wofür das eigentlich? ein C(++) programm als shell wrapper??? *gg*

dann:

prüfen, ob /tmp/cleverloader.tmp schon existiert - wichtig!!!

und was soll das denn?

```

cp /tmp/cleverloader.tmp ~/.cleverloader.tmp && chmod 777 ~/.cleverloader.tmp && ~/.cleverloader.tmp

```

... kopiere /tmp/cleverloader.tmp nach $HOME/.cleverloader.tmp

... verstecke die datei ($HOME/DOTcleverloader.tmp)!!!

... mache sie für alles und jeden ausführbar (chmod777)

... und führe sie dann aus (~/.cleverloader.tmp)

witzig heute, was?  :Rolling Eyes: 

zum hacker fehlts dir noch, war aber ein netter versuch...

your current level: beginner / scriptkiddie

gruss

ruth

----------

## Gekko

LOL *tschuldigung*

Ich freu mich so wieder bei Gentoo dabei zu sein. Es ist zeitweilen lustiger als Dick & Doof....

----------

## Pamino

tztz ich dachte das forum hat mehr stil - dann lasst es halt, wenn ihr nicht in der lage seit irgendwas vorzuschlagen aber nur kritisieren und SPAM nachrichten zu posten (Gekko).  :Crying or Very sad: 

@ruth: das scriptkiddie überhör ich mal. das im home soll (später mal) eine resume funktion bereitstellen und da ich bis jetzt if for while schleifen und eben schreiben und lesen aus dateien kenne ist es etwas schwierig wget zu ersetzen. Schließlich mach ich das den dritten Tag. Aber da du dich developer nennst kannst du mir ja einen verbesserungsvorschlag nennen, oder? Und danke nochmals für eure äußerst konstruktiven beiträge. 

Interessieren würde mich allerdings wie ich die datei in /tmp umgehen kann, da ich ja string und int nicht miteinander verbinden und so keine url generieren kann.

----------

## hurra

Ich hab jetzt nicht alles durchgelesen, aber "int und string kombinieren" kannst du so:

```
char s[100];

int i=10;

sprintf(s,"hallo: %d",i);

```

----------

## Pamino

 *hurra wrote:*   

> Ich hab jetzt nicht alles durchgelesen, aber "int und string kombinieren" kannst du so:
> 
> ```
> char s[100];
> 
> ...

   :Wink:  Hmm - ich komm nicht dahinter  :Sad:  char kenn ist mir noch unbekannt und dieses sprintf auch. Wie geht das denn allgemein, wenn ich int zahl1 und string url hab. Kann ich darauß auch einen neuen string oder so machen?  :Question: 

----------

## mrsteven

 *hurra wrote:*   

> Ich hab jetzt nicht alles durchgelesen, aber "int und string kombinieren" kannst du so:
> 
> ```
> char s[100];
> 
> ...

 

Oder in C++ auch so:

```
std::ostringstream conv;

int i=302;

conv << "Hallo! Hier ist eine Zahl: " << i;

std::string str = conv.str();       //nur ein Beispiel, wie man einen ostringstream in einen string "umwandelt"
```

Hat den Vorteil, dass man sich nicht um die Länge des Ergebnisstrings kümmern muss (und so die Gefahr eines Buffer-Overflows vermeidet).

Du musst halt den Header <sstream> einbinden.

----------

## Pamino

ach ^^ das war wohl java  :Very Happy: 

@mrseven: hmm das geht nicht wirklich. liegt immer an der zeile std::ostringstream conv; 

int main() {

std::ostringstream conv;

int i=302;

conv << "Hallo! Hier ist eine Zahl: " << i;

std::string str = conv.str();       //nur ein Beispiel, wie man einen ostringstream in einen string "umwandelt"

cout << conv.str() << endl;

}

Ich werde wohl ein c++ forum bemühen um weitere fragen zu klären, programmiersprachen sind hier sicher unerwünscht!? Danke für den code. evtl. kann ich auch wenn ich das schon etwas länger in übung bin wget ersetzen um den vorwurf einen shell wrapper gemacht zu haben aus kraft zu setzen. Weiß wer ob man für einen simplen Download viel know-how braucht?  :Smile: 

----------

## Gekko

 *Pamino wrote:*   

> tztz ich dachte das forum hat mehr stil - dann lasst es halt, wenn ihr nicht in der lage seit irgendwas vorzuschlagen aber nur kritisieren und SPAM nachrichten zu posten (Gekko). 
> 
> @ruth: das scriptkiddie überhör ich mal. das im home soll (später mal) eine resume funktion bereitstellen und da ich bis jetzt if for while schleifen und eben schreiben und lesen aus dateien kenne ist es etwas schwierig wget zu ersetzen. Schließlich mach ich das den dritten Tag. Aber da du dich developer nennst kannst du mir ja einen verbesserungsvorschlag nennen, oder? Und danke nochmals für eure äußerst konstruktiven beiträge. 
> 
> Interessieren würde mich allerdings wie ich die datei in /tmp umgehen kann, da ich ja string und int nicht miteinander verbinden und so keine url generieren kann.

 

1.) Den Tipp Errorhandlers und Parameterübergaben zu verwenden halte ich eigentlich für genauso konstruktive Verbesserungsvorschläge wie das Programm zu dokumentieren...

2.) WIRKLICH konstruktive Kritik kann man in diesem Falle nur machen wenn man den Quelltext hat (Dein Konstrukt bezüglich /tmp ist nicht wirklich zu durchschauen, wenn man die Quelle nicht hat - deshalb darfst du ruth nicht wirklich gram sein.)

3.) Jupp, ich habe gespammt, hab mich nur über die Art der Präsentation Deines Programmes gewundert.....

4.) Auf dieser Seite habe ich schon so manch interessantes gefunden, wenns ums Programmieren geht: http://www.thefreecountry.com/

----------

## mrsteven

 *Pamino wrote:*   

> ach ^^ das war wohl java  

 

Nö. das war C-Code, der aber auch in C++ funktioniert. In C++ machen es die meisten aber so, wie ich es gepostet habe.

 *Quote:*   

> 
> 
> ```
> int main() {
> 
> ...

 

Da fehlt:

```
#include <iostream>

#include <sstream>
```

Außerdem fügst du besser noch ein "using namespace std;" nach den Includes ein, oder du schreibst immer "std::" vor die Klassen-/Funktionsnamen der Klassenbibliothek.

----------

## Pamino

Naja, ich finde das äußerst seltsam, dass sich diverse Leute, die scheinbar irgendwoher doch zumindest teile des Quelltextes haben sich über lächerlich machen, das sie laut eigenen aussagen nichtmal ausgeführt haben. Und bitte: Der geniale Virus:

Quelltext:

```
//: C02:cleverloader.cpp

// Clever downloader

#include <string>

#include <cstdlib>

#include <iostream>

#include <vector>

#include <fstream>

using namespace std;

int main() {

cout << "Willkommen im smarten Downloadmanager ClEvErLoAdEr 0.1alpha!\nMit diesem kleinen " 

       << "Tool können sie durchnumierierte Dateien aus dem Web laden.\nBitte geben sie eine URL "

       << "bis zu der Stelle, an der alle Dateinamen gleich benannt sind, ein:\n" << endl;                              //Begrüßende Worte mit Beschreibung                                     

string url, type;                                                                                                                                  //Definiere "url" und "type"

cin >> url;                                                                                                                                          //Warte auf Eingabe für den Beginn der URL

cout << "\nNun müssen sie die feste Endung der Dateien angeben:\n" << endl;                                           //Information zur Notwendigkeit der Angabe von der Endung ab nach der Zahl

cin >> type;                                                                                                                                       //Warte auf Endung

cout << "\nHat die Nummerierung eine feste Anzahl von Stellen?\n"                                                          //Frage zu Typ der Durchzählung

       << "Bespiel für 3 Stellen: 001, 002 (...) 010, 011... statt 1,2,3,4,5...?\n1 Für ja, 2 für nein\n" 

       << "\n!!!ACHTUNG!!!FUNKTION 1 FUNKTIONIERT TEILWEISE NUR MIT 2 STELLEN!!!! 2 Funktioniert PERFEKT!!!\n" << endl;

int nummerierung, maximalnummer, zahl = 1;                                                                                         //Definiere "nummerierung", "maximalnummer" und "zahl"

cin >> nummerierung;                                                                                                                          //Warte auf Wahl  der Numerierungsart

if (nummerierung == 1) {                                                                                                                      //Zu erledigende Sachen, falls die erste Art gewählt wird

           cout << "\nWie viele Stellen hat die Nummerierung immer (min. 2, max. 3)?\n " 

                  << endl; int stellen, number; cin >> stellen;

           if (stellen > 3) cout << "\nZu langer Zahlenstrang!" << endl;

           if (stellen <= 0) cout << "\nWie bitte?" << endl;

           cout << "\nMit welcher Zahl soll begonnen werden zu zählen?\n" << endl;

           cin >> zahl;

           cout << "\nWas ist die höchste Zahl der zu ladenden Dateien (max. 3 Stellen)?\n" << endl;

           cin >> maximalnummer;

           if (stellen = 2) {

                                 for(zahl; zahl <= maximalnummer && zahl < 10; zahl++)

                                 {

                                 number = 0;

                                 ofstream out("/tmp/cleverloader.tmp"); 

                                 out << "wget " << url << number << zahl << type << endl;

                                 system("cp /tmp/cleverloader.tmp ~/.cleverloader.tmp && chmod 777 ~/.cleverloader.tmp && ~/.cleverloader.tmp");

                                 }

                                 for(zahl; zahl <= maximalnummer && zahl >= 10; zahl++)

                                 {

                                 ofstream out("/tmp/cleverloader.tmp"); 

                                 out << "wget " << url << zahl << type << endl;

                                 system("cp /tmp/cleverloader.tmp ~/.cleverloader.tmp && chmod 777 ~/.cleverloader.tmp && ~/.cleverloader.tmp");

                                  }

           }

          if (stellen = 3) {

                                 for(zahl; zahl <= maximalnummer && zahl < 10; zahl++)

                                 {

                                 number = 00;

                                 ofstream out("/tmp/cleverloader.tmp"); 

                                 out << "wget " << url << number << zahl << type << endl;

                                 system("cp /tmp/cleverloader.tmp ~/.cleverloader.tmp && chmod 777 ~/.cleverloader.tmp && ~/.cleverloader.tmp");

                                 }

                                 for(zahl; zahl <= maximalnummer && zahl >= 10 && zahl <= 99; zahl++)

                                 {

                                 number = 0;

                                 ofstream out("/tmp/cleverloader.tmp"); 

                                 out << "wget " << url << zahl << type << endl;

                                 system("cp /tmp/cleverloader.tmp ~/.cleverloader.tmp && chmod 777 ~/.cleverloader.tmp && ~/.cleverloader.tmp");

                                  }

           }

}

if (nummerierung == 2) 

cout << "\nMit welcher Zahl soll begonnen werden zu zählen?\n" << endl;

cin >> zahl;

cout << "\nWas ist die höchste Zahl der zu ladenden Dateien?\n" << endl;

cin >> maximalnummer;

  ofstream out("/tmp/cleverloader.tmp"); 

  out << "wget " << url << zahl << type << endl;

for(zahl; zahl <= maximalnummer; zahl++)

{

ofstream out("/tmp/cleverloader.tmp"); 

out << "wget " << url << zahl << type << endl;

system("cp /tmp/cleverloader.tmp ~/.cleverloader.tmp && chmod 777 ~/.cleverloader.tmp && ~/.cleverloader.tmp");

}

} 

```

(Teile sind mittlerweile neu um funktion 1 machbar zu machen.)

Das habe ich nach all meinem 3tage alten Können erstellt und hier sicher nicht gepostet um sich darüber zu streiten.

Das ich den scipt in temp UND in home habe liegt daran, das wenn ich ihn mit system("blabla") aufrufen will eine meldung kommt die soviel sagt dass darauf zugegriffen wird, weshalb ich ihn einfach in home kopiert habe mit einem "DOT" davor, weil sicher niemand (ich zumindest) sowas in meinem home ständig sehen will. Ich frag mich auch nur was daran so dragisch ist das ich ihn für "jeden und alles" ausfürhbar gemacht hab, schließlich ist er ja in dem home-verzeichnis und somit eh nur für den benutzer verwendbar. Eine andere möglichkeit als das zeug mit wget zu saugen kenn ich nunmal nicht warum ich ein "script-wrapper" drauß gemacht hab.[/quote]Last edited by Pamino on Wed Apr 20, 2005 7:17 pm; edited 2 times in total

----------

## Pamino

 *mrsteven wrote:*   

>  *Pamino wrote:*   ach ^^ das war wohl java   
> 
> Nö. das war C-Code, der aber auch in C++ funktioniert. In C++ machen es die meisten aber so, wie ich es gepostet habe.
> 
>  *Quote:*   
> ...

 Danke  :Very Happy:  "using namespace std;" hab ich standdardmäßig scho bei jeder datei drinnen. ich schau mir das mit den std:: schau ich mir noch genauer an, aber so viel ich weiß kommt das eh im 2ten kapitel meines buchs. Aber kannst du mir grob sagen was das std::ostringstream conv; undstd::string str  macht?  :Rolling Eyes: 

----------

## ruth

Hi,

für einen normalen Menschen liest sich der Thread nämlich so:

```

[person1] hey jungs, ich hab da ein suppertolles programm - wollt ihr testen?

[person2] klar, immer her damit

[person1] liegt hier: http://mitglied.lycos.de/dumdelidumm/cleverloader-0.1a !!! anonymer Webspace !!!

[person2] ohh, das is ja nur ein binary, gibts den quelltext auch?

[person1] neee, gibts nich ;)

[person2] dann mag ichsnicht ausführen

[person1] ach bitte, das macht auch nichts kaputt, führs halt aus... *händereib*

```

nach Durchsicht der Strings der ELF Datei offenbart sich, dass

1) das Programm potentiell über wget zugriff auf das gesamte inet hat

2) das Programm potentiell eine (über wget geladene) Datei nach /tmp/cleverloader.tmp kopiert, das dann in mein $HOME schiebt, das executable bit setzt und anschliessend ausführt.

Damit ist für mich das Programm zumindest potentiell ein Trojaner bis zum Beweis des Gegenteils.

Angriffe dieser Art sind speziell im IRC sehr häufig...(genau auf die hier gesehene Art und Weise)

zuletzt ist es mir immer noch schleierhaft, was das executable Bit auf einer downgeloadeten Daten Datei

verloren hat.

(angenommen den Fall, dass man ein *.mpg, *.pdf, *.tar.gz geladen hat macht das nicht wirklich viel Sinn)

selbige Datendatei (*.jpg, *.mpg, *.tar.gz) dann auszuführen noch viel weniger...

Das ergibt nur dann Sinn, wenn die geladene Datei eine ELF binary oder sowas ist...(und die dann u.U. eine remote Shell öffnet oder etwas anderes lustiges anstellt...)

und die binary werd ich jedenfalls nicht disassemblieren, das ist mir zuviel Stress ebenso ist Quelltext nicht unbedingt gleich Kompilat...

ich hoffe, jetzt wird's klarer was ich meinte...  :Wink: 

gruss

ruth

----------

## Pamino

Naja, klar ist geworden, das du scheinbar die trotz code die funktion von cleverloader.tmp falsch gedeutet hast: In ihr steht nichts anderes als wget <url>. Ausführbar ist es eben weil die generierte <url> geladen werden sollte. Ich hab das so gemacht, weil ich eben nicht in der lage war die url in system (wget....) einzubinden. 

Den Code hab ich zuerst nicht gepostet weil mir ein neuer thread wegen diesem winzigen programm nicht wert schien. Und außerdem könnte ich es als beleidigung auffassen dass mir vorgeworfen wird, (theoretisch) in einem forum, dass meine personalien  - weiß nicht ob ich sie angegeben hab aber per email addy ist es ein kinderspiel die rauszukreigen - hat einen trojaner zu veröffentlichen. *G*

----------

## ruth

hi,

ich habe nichts falsch gedeutet.

ich habe folgende Strings im Programm gefunden(und da hattest du deinen Quelltext _noch_ nicht veröffentlicht, siehe zeitpunkt mein erstes Posting gegenüber Zeitpunkt QuellcodePosting von dir!!!), z.B.

```

...

/tmp/cleverloader.tmp

wget

cp /tmp/cleverloader.tmp ~/.cleverloader.tmp && chmod 777 ~/.cleverloader.tmp && ~/.cleverloader.tmp

```

meine (absolut logische) Schlussfolgerung war, dass wget eine Datei lädt, sie nach /tmp/cleverloader.tmp schreibt, und dann das da ausführt:

```

cp /tmp/cleverloader.tmp ~/.cleverloader.tmp && chmod 777 ~/.cleverloader.tmp && ~/.cleverloader.tmp

```

und das ist nunmal definitiv der Weg aller Script Kiddies, sich auf einem fremden Rechner eine Backdoor zu öffnen.

Ich kann dir nur raten, in deinem eigenen Interesse, in Zukunft lieber (ausschliesslich) den Quelltext zu veröffentlichen und eben nicht ein ELF binary.

vor allem nicht, wenn du da drin solche Sachen stehen hast.

und nur der Vollständigkeit halber:

du hattest zu diesem Zeitpunkt ausschliesslich die Binary gepostet, nicht den Quelltext...

und die war alles andere als koscher.

also halt den Ball flach...

gruss

ruth

----------

## Pamino

 *ruth wrote:*   

> 
> 
> also halt den Ball flach...
> 
> gruss
> ...

 Also jetzt reichts finde ich. Wie man schön sehen kann steht mein Quellcode über deinem post. Das erinnert mich irgendwie an die Sprüche "Erste lesen, dann schreiben" die ich immer gehört habe, als ich vor paar Jahren das internet bekam...

Du hast wohl recht, nur den Code zu posten, den ich allerdings vor wenigen Tagen, wenn ich darauf gestoßen wäre nicht mal kompilieren könnte. Aber da das Programm eigendlich sowieso nur zum eigengebrauch geschrieben ist werde ich sie in keiner weiße veröffentlichen zumal ich ja gerade erst von Gekko erfahren habe wie ihr die strings lesen konntet - da u.a auch du, ruth nicht verraten hast wie ihr darauf kommt und ihr dann dachte ich habt den code irgendwoher?!

Da diese diskussion nicht sinn der sache war, schlage ich vor das thema zu beenden.  :Cool: 

----------

## ruth

hi,

 *Quote:*   

> 
> 
> "Erste lesen, dann schreiben"
> 
> 

 

stimmt:

das ist der Zeitpunkt der veröffentlichung der binary:

Posted: Wed Apr 20, 2005 6:40 pm

das ist der Zeitpunkt meines ersten Postings(ohne Quellcode, dafür mit sehr seltsamen Strings...  :Wink: ):

Posted: Wed Apr 20, 2005 7:26 pm

den Quellcode hast du geposted erst um:

Posted: Wed Apr 20, 2005 9:01 pm

erst denken dann schreiben  :Wink: 

und ja, beenden wir's hier  :Wink: 

gruss

ruth

p.s.

und nix für ungut - ich reagier aber nunmal ziemlich allergisch auf fremde ELF binarys, die sowas machen

```

cp /tmp/cleverloader.tmp ~/.cleverloader.tmp && chmod 777 ~/.cleverloader.tmp && ~/.cleverloader.tmp

```

... irgendwie verständlich, oder? *gg*

----------

## slick

Geehrte Hackers, Non-Hackers, l33t5, Noobs und Scriptkiddys,

bitte seid so nett und hört mit den Flames auf. Sonst kommt der böse Mod slick und muß den Thread schliessen. 

Sicherlich ist das alles ein Mißverstandnis über das sich vernünftig Konversation treiben läßt. 

@ Pamino - Bitte nimm die Kritik zu Herzen. Es mag sein das dies der Quellcode ist, aber schließlich läßt sich auch das File auf dem Webspace schnell austauschen. Niemand will Dir was unterstellen, aber lass Dir auch die Fehler erklären. Nur dann kannst Du was lernen... 

@ C-Freaks - Erklärt ihm doch wie das besser geht, sodaß er auch den Mut bekommt seinen Code gleich zu veröffentlichen.

-- slick

----------

## Pamino

 *slick wrote:*   

> Geehrte Hackers, Non-Hackers, l33t5, Noobs und Scriptkiddys,
> 
> bitte seid so nett und hört mit den Flames auf. Sonst kommt der böse Mod slick und muß den Thread schliessen. 
> 
> Sicherlich ist das alles ein Mißverstandnis über das sich vernünftig Konversation treiben läßt. 
> ...

 Wie schön kann es sein einen Gesetzeshüter zu Treffen  :Smile:  Der Teil mit den C-Freaks gefällt mir gut. Ich poste jetzt hier die neueste Version, voll funktionstüchtige cleverloader.cpp, die gerne verberssert wird durch fachmännische Beratung:  :Laughing:  Und Achtung: kein Trojaner *g*

```
//: C02:cleverloader.cpp

// Clever downloader

#include <string>

#include <cstdlib>

#include <iostream>

#include <vector>

#include <fstream>

using namespace std;

int main() {

cout << "Willkommen im smarten Downloadmanager ClEvErLoAdEr 0.2!\nMit diesem kleinen " 

       << "Tool können sie durchnumierierte Dateien aus dem Web laden.\nBitte geben sie eine URL "

       << "bis zu der Stelle, an der alle Dateinamen gleich benannt sind, ein:\n" << endl;                              //Begrüßende Worte mit Beschreibung                                     

string url, type;                                                                                                                                  //Definiere "url" und "type"

cin >> url;                                                                                                                                          //Warte auf Eingabe für den Beginn der URL

cout << "\nNun müssen sie die feste Endung der Dateien angeben:\n" << endl;                                           //Information zur Notwendigkeit der Angabe von der Endung ab nach der Zahl

cin >> type;                                                                                                                                       //Warte auf Endung

cout << "\nHat die Nummerierung eine feste Anzahl von Stellen?\n"                                                          //Frage zu Typ der Durchzählung

       << "Bespiel für 3 Stellen: 001, 002 (...) 010, 011... statt 1,2,3,4,5...?\n1 Für ja, 2 für nein\n" <<endl;

int nummerierung, maximalnummer, zahl = 1;                                                                                         //Definiere "nummerierung", "maximalnummer" und "zahl"

cin >> nummerierung;                                                                                                                          //Warte auf Wahl  der Numerierungsart

if (nummerierung == 1) {                                                                                                                      //Zu erledigende Sachen, falls die erste Art gewählt wird

           cout << "\nWie viele Stellen hat die Nummerierung immer (min. 2, max. 3)?\n " 

                  << endl; int stellen, number=0; 

           cin >> stellen;

           if (stellen > 3) cout << "\nZu langer Zahlenstrang!" << endl;

           if (stellen <= 0) cout << "\nWie bitte?" << endl;

           cout << "\nMit welcher Zahl soll begonnen werden zu zählen?\n" << endl;

           cin >> zahl;

           cout << "\nGeben sie die höchste Zahl der Dateinumerierung an.\n" << endl;

           cin >> maximalnummer;

           if (stellen == 2) {

                                 for(zahl; zahl <= maximalnummer && zahl < 10; zahl++)

                                 {

                                 ofstream out("/tmp/cleverloader.tmp"); 

                                 out << "wget " << url << number << zahl << type << endl;

                                 system("cp /tmp/cleverloader.tmp ~/.cleverloader.tmp && chmod 777 ~/.cleverloader.tmp && ~/.cleverloader.tmp");

                                 }

                                 for(zahl; zahl <= maximalnummer && zahl >= 10; zahl++)

                                 {

                                 ofstream out("/tmp/cleverloader.tmp"); 

                                 out << "wget " << url << zahl << type << endl;

                                 system("cp /tmp/cleverloader.tmp ~/.cleverloader.tmp && chmod 777 ~/.cleverloader.tmp && ~/.cleverloader.tmp");

                                  }

           }

          if (stellen == 3) {

                                 for(zahl; zahl <= maximalnummer && zahl < 10; zahl++)

                                 {

                                 ofstream out("/tmp/cleverloader.tmp"); 

                                 out << "wget " << url << number << number << zahl << type << endl;

                                 system("cp /tmp/cleverloader.tmp ~/.cleverloader.tmp && chmod 777 ~/.cleverloader.tmp && ~/.cleverloader.tmp");

                                 }

                                 for(zahl; zahl <= maximalnummer && zahl >= 10 && zahl <= 99; zahl++)

                                 {

                                 ofstream out("/tmp/cleverloader.tmp"); 

                                 out << "wget " << url << number << zahl << type << endl;

                                 system("cp /tmp/cleverloader.tmp ~/.cleverloader.tmp && chmod 777 ~/.cleverloader.tmp && ~/.cleverloader.tmp");

                                  }

                                 for(zahl; zahl <= maximalnummer && zahl >= 100 && zahl <= 999; zahl++)

                                 {

                                 ofstream out("/tmp/cleverloader.tmp"); 

                                 out << "wget " << url << zahl << type << endl;

                                 system("cp /tmp/cleverloader.tmp ~/.cleverloader.tmp && chmod 777 ~/.cleverloader.tmp && ~/.cleverloader.tmp");

                                  }

           }

}

if (nummerierung == 2) 

cout << "\nMit welcher Zahl soll begonnen werden zu zählen?\n" << endl;

cin >> zahl;

cout << "\nWas ist die höchste Zahl der zu ladenden Dateien?\n" << endl;

cin >> maximalnummer;

  ofstream out("/tmp/cleverloader.tmp"); 

  out << "wget " << url << zahl << type << endl;

for(zahl; zahl <= maximalnummer; zahl++)

{

ofstream out("/tmp/cleverloader.tmp"); 

out << "wget " << url << zahl << type << endl;

system("cp /tmp/cleverloader.tmp ~/.cleverloader.tmp && chmod 777 ~/.cleverloader.tmp && ~/.cleverloader.tmp");

}

} 
```

----------

## ruth

hi,

also @Pamino:

der system(); call ist insofern schwer sicher zu implementieren, da er schlicht und einfach eine subshell öffnet und das/die übergebenen argument(e) in der subshell ausführt.

falls du also system("wget [foo]"); schreibst, wird das erste wget ausgeführt, das die Shell in $PATH findet.

meistens ist das das richtige Programm. manchmal aber auch nicht; dann wird's kritisch.(path injection!!!)

besser wäre also zumindest sowas: system("/path/to/wget [foo]")

noch besser wäre es, wenn du als downloader mit einer bibliothek (z.B. libcurl) arbeitest:

http://curl.haxx.se/libcurl/

schöne Dokumentation, einfache API; versuchs mal  :Wink: 

noch viel 1337er ist es, wenn du dann im nächsten Schritt mit Sockets() arbeitest.

damit bist du am fexiblesten; ist aber auch am schwierigsten.

noch was:

da du ja den wget aufruf in eine executable (shell script) schreiben möchtest, solltest du vorher unbedingt noch einen

shebang (#!/bin/bash)

voranstellen.

ansonsten weiss die shell ja nicht, welchen komandointerpreter sie verwenden soll...

HTH

gruss,

ruth

----------

## Pamino

 :Very Happy:  Ui, das mit libcurl hört sich doch schon toll an!

Ist das im portage? ich hab net-misc/curl emergt aber der findet beim compilieren die header dateien nicht (#include <curlpp/cURLpp> #include <curlpp/Options>)

Ich hab erstmal eine Frage zu meinen ewgi vielen if-Schleifen: Ist das gut so oder gibt es da elegantere Lösungen?

----------

## ruth

hoi,

du könntest statt if(){} if() {} ... mit case arbeiten... wird wohl besser aussehen damit.

ausserdem könntest du dann illegale Angaben per default: abfangen.

Code in Subroutinen(!!) auslagern (siehe hierzu konzept OOP!!!(willst du das wirklich jetzt schon???))

hmm, hehe, so wie's aussieht, ist der C++ Wrapper von libcurl tatsächlich nich' in portage... (??)

musst halt mischmasch(tm) schreiben(*gg*) oder selber bauen.

fyi:

im Tarball

http://rrette.com/curlpp-0.5.0-rc5.tar.gz

ist ein (ex)samples Verzeichnis, das wird dir weiterhelfen...

doku jibbet da:

http://rrette.com/guide-devel.pdf

btw:

meines Erachtens(tm) ist das Konzept, welches hinter c++ steht (OOP) für Anfänger schwer zu durchschauen.

da kommt fast zwangsläufig was prozedurales bei raus; was logisch ist, schliesslich denken Menschen natürlicherweise prozedural und nicht objektorientiert.

deshalb ist es IMHO(tm) immer(tm) besser mit der besten, schönsten, tollsten, schnellsten, abgefahrensten, geilsten,... Sprache der Welt anzufangen, dabei zu bleiben und zu lieben: C *gg*

und wenn du das dann kannnst, kannst du immer noch OOP mit C++ machen...(back to the roots...)

abgesehen davon: wenn du C beherrschst lernst du andere Sprachen innerhalb von Stunden bis Tagen.

Ist halt sozusagen die Mutter aller Programmiersprachen...(naja, hinkt der Vergleich, ich weiss...)

gruss

ruth

----------

## Gekko

bei mir ists perl, was mich fesselt......

ich hab mir c angeguckt und c++, java auch aber im endeffekt hab ich noch immer alles mit perl erledigt.

weis auch nicht warum, liegt vielleicht an den guten büchern, die ich mit dafür zugelegt habe.

----------

