Veröffentlicht 24. Juli 200520 j 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
25. Juli 200520 j 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
25. Juli 200520 j 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
25. Juli 200520 j 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
25. Juli 200520 j 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?
25. Juli 200520 j 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.
27. Juli 200520 j 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?
27. Juli 200520 j 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.
27. Juli 200520 j 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?
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.