Expi Geschrieben 24. Juli 2005 Geschrieben 24. Juli 2005 Hy, hat mir jemand nen Link zu ner Page die erklärt wie man nen Scanner mit C baut ? Soll bloß ein Konsolenapp sein, keine Gui. Hab viele Beispiele für C++ gefunden, aber nichts für C. Die Sourcen von IpcScan oder ScanSql wären genial, die 2 Scanner sind echt fein. Thanks
Expi Geschrieben 25. Juli 2005 Autor Geschrieben 25. Juli 2005 Ich will verstehen wie genau das funktioniert. Vorallem die SQL/NT Anmelderoutine interessiert mich. Aber genauso das Threaden und das aufsplitten der Range, in einzelne IP's, mit der man das Prog startet. Greets Ex
Expi Geschrieben 25. Juli 2005 Autor Geschrieben 25. Juli 2005 Weil ich in C Programmiere und nicht in C++. Dass kommt noch.
Goos Geschrieben 25. Juli 2005 Geschrieben 25. Juli 2005 Ich wuerde sagen, dann hast du jetzt ein Problem. Der Datenbankzugriff und auch die NT Anmeldung sind meines Erachtens nicht unter ANSI C moeglich. Die einzige Alternative sind vielleicht C++ Dlls in denen der Zugriff gehandlet wird und die du dann auch unter ANSI C ansprechen kannst. Ich halte dein Anliegen sogesehen fuer nicht allzu sinnvoll Goos
Expi Geschrieben 25. Juli 2005 Autor Geschrieben 25. Juli 2005 Das Problem ist, dass ich den Scanner in ein bereits vorhandenes C Programm integrieren will. Das umschreiben des Progs würde viel zu viel Zeit beanspruchen. Du magst recht haben über den Sinn dieses Vorhabens, aber mir bietet sich leider keine andere Möglichkeit. Kannst du (oder jemand anders) mir trotzdem helfen das ganze ans laufen zu bringen? Fangen wir mit dem Pingen (mit Threads) an und arbeiten uns zum Anmelden an SQL/NT heran. Sagen wir mal, ich möchte das der Scanner unendlich lange läuft, also ohne Range starten, und maximal 20 Threads erzeugt. Dann müsste das doch ungefähr so aussehen. (Garantiert Fehler drin, da ich noch nie was derartiges geschrieben habe) struct sockaddr_in scan; int maxNtThread = 20; // maximal Anzahl von Threads int curNtThread = 0; // Derzeitige Anzahl von Threads int ntPort = 139; // NT Port int TermNtThread = 0; // Falls auf 1 gesetzt werden alle Threads beendet void *scannerNT(void *addr) { int s; if(TermNtThread == 1) { pthread_exit( NULL ); } s = socket(AF_INET, SOCK_STREAM, 0); if (s == -1) { curNtThread--; return NULL; } // jetzt zu der Ip Connecten scan.sin_family = AF_INET; /* inet_addr() wandelt einen String mit einer IPAdresse in 'dotted' Schreibweise in eine vom Rechner lesbare Form um */ scan.sin_addr.s_addr = inet_addr(addr); scan.sin_port = htons(ntPort); if(connect(s, (struct sockaddr *)&scan, sizeof(scan)) == -1) { close(s); } else { printf("Port offen!"); close(s); } curNtThread--; return NULL; } void *ntscaninit(void *arg) { int a,b,c,d; char destaddr[20]; pthread_t p1[maxNtThread]; while(1) { for(a = 70; a < 255; a++) { // Mit Blacklist-IP's abgleichen if(((a >= 127) && (a <= 170)) || ((a >= 192) && (a <= 217))) { continue; } for(b = 0; b < 255; b++) { for(c = 0; c < 255; c++) { for(d = 1; d < 255; d++) { wsprintf(destaddr,"%i.%i.%i.%i", a, b, c, d); // Falls TermNtThread == 1 Thread beenden if(TermNtThread == 1) { pthread_exit( NULL ); } // Falls derzeitige Threads größer oder gleich maxNtThread ist, diese While Schleife wiederholen while(curNtThread >= maxNtThread) { printf(""); // ohne dieses printf funzt die Schleife nicht, k.a. wieso continue; } curNtThread++; pthread_create(&p1[curNtThread], NULL, scannerNT, &destaddr); pthread_detach(p1[curNtThread]); } } } } return NULL; } Was kann man da verbessern? Bzw das mit den Threads besser regeln. Und wenn ich den Scanner so starte, dann pingt er manche IP's doppelt. Also eigentlich müsste er so pingen: 70.0.0.1, 70.0.0.2, 70.0.0.3 usw Aber er macht meistens: 70.0.0.1, 70.0.0.2, 70.0.0.2, 70.0.0.3, 70.0.0.3 usw Woran liegt das ? Und wieso spielt die while anweisung ohne das printf nicht mit? Fragen über Fragen. Bin dankbar für jede Hilfe. Thx
Klotzkopp Geschrieben 25. Juli 2005 Geschrieben 25. Juli 2005 Bzw das mit den Threads besser regeln. Und wenn ich den Scanner so starte, dann pingt er manche IP's doppelt.Das wundert mich nicht. Du übergibst jedem Thread die Adresse desselben char-Arrays (destaddr). Wie willst du sicherstellen, dass der Thread den Inhalt ausgewertet hast, bevor du ihn in der Schleife wieder änderst?
Klotzkopp Geschrieben 25. Juli 2005 Geschrieben 25. Juli 2005 Indem du entweder für jeden Thread ein eigenes Array benutzt oder durch Synchronisationsobjekte (Events o.ä.) sicherstellst, dass die Schleife erst dann weiterläuft, wenn der Thread das Array ausgewertet oder kopiert hat.
Expi Geschrieben 27. Juli 2005 Autor Geschrieben 27. Juli 2005 würde es reichen wenn ich es so mache? void *scannerNT(void *addr) { char destaddr[20]; strcpy(destaddr, addr); ..... scan.sin_addr.s_addr = inet_addr(destaddr); ..... } oder war das jetzt ein Denkfehler?
Klotzkopp Geschrieben 27. Juli 2005 Geschrieben 27. Juli 2005 würde es reichen wenn ich es so mache?Nein. Der Fehler würde seltener auftreten, aber er ist immer noch da. Wirklich sicher geht es nur so, wie ich es beschrieben habe.
Expi Geschrieben 27. Juli 2005 Autor Geschrieben 27. Juli 2005 Nein. Der Fehler würde seltener auftreten, aber er ist immer noch da. Wirklich sicher geht es nur so, wie ich es beschrieben habe. Kannst mir da ein Beispiel für geben?
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden