Coder Battle: Me vs. That VNC Guy

В αυτό το blog Αρκετές ιστορίες προγραμματιστών έχουν δημοσιευτεί. Μου αρέσει να αναπολώ τα παλιά μου ανόητα πράγματα. Λοιπόν, εδώ είναι μια άλλη τέτοια ιστορία.

Πρωτοκίνησα να ενδιαφέρομαι για τους υπολογιστές, ειδικά τον προγραμματισμό, όταν ήμουν περίπου 11 ετών. Στην αρχή του Λυκείου βоΠέρασα τον περισσότερο ελεύθερο χρόνο μου κάνοντας το C64 μου και γράφοντας το BASIC και μετά κόβοντας τον κακό κώδικα με το ψαλίδι. Δεν κάνω πλάκα, ψαλίδι.

Μετά το σχολείο (περίπου στην ηλικία των 16 ετών), τα βρετανικά παιδιά πηγαίνουν συνήθως στο κολέγιο, όπου επιλέγουν να σπουδάσουν τρία ή τέσσερα μαθήματα πριν πάνε στο πανεπιστήμιο. Δεδομένης της αγάπης μου για το μπεζ κουτί και το μαγνητόφωνο στο σπίτι, αποφάσισα ότι το να σπουδάσω «επιστήμη υπολογιστών» στο κολέγιο ήταν η σωστή επιλογή.

Απόλαυσα το μάθημα περισσότερο από όσο περίμενα. εκεί πρωτογνώρισα τον Πασκάλ και τους Δελφούς.

Στα διαλείμματα μεταξύ των μαθημάτων, οι μαθητές μπορούσαν να εργαστούν σε οποιοδήποτε ελεύθερο μηχάνημα στην αίθουσα υπολογιστών. Φανταστείτε: ένα τεράστιο δωμάτιο, σχεδιασμένο για περίπου εκατό άτομα, με σειρές τραπεζιών γεμάτες με μηχανήματα, όπως εκείνα όπου η οθόνη βρίσκεται στη μονάδα συστήματος. Οι θαυμαστές βουίζουν συνεχώς, οι μπάλες του ποντικιού βουίζουν στα τραπέζια, δεν σταματούν ούτε λεπτό. Υπάρχει μια περίεργη μυρωδιά στον αέρα, σαν 50-100 ορμονικοί έφηβοι να αλλάζουν περιοδικά για να κρυώσουν εκατοντάδες τσιπ Pentium III.

Παρά τους κινδύνους για την υγεία, μου άρεσε να κάθομαι στον υπολογιστή όταν είχα ένα ελεύθερο λεπτό.

Ο διαχειριστής στο δωμάτιο ήταν ένας κοντός, μεσήλικας που επιλέχθηκε για αυτόν τον ρόλο λόγω της ακόρεστης επιθυμίας του να γίνει κακός δικτάτορας. Ετσι νομίζω. Η υπηρεσία είναι μια υποτίμηση· ο τύπος αγαπούσε πραγματικά τη δουλειά του. Του ανατέθηκε να τηρεί την τάξη έτσι ώστε κανείς να μην χρησιμοποιεί τον υπολογιστή του σχολείου για οτιδήποτε ακατάλληλο.

Μέχρι σήμερα, η διαίσθησή μου μού λέει ότι το μπόνους του διαχειριστή εξαρτιόταν άμεσα από τον αριθμό των μαθητών που έπιανε από το χέρι και συνόδευε έξω από την αίθουσα υπολογιστών. Είμαι σίγουρος ότι αυτός ο τύπος εξόφλησε νωρίς την υποθήκη του.

Κάθισε στη μακρινή γωνία της αίθουσας υπολογιστών σε ένα γωνιακό τραπέζι. Και ήταν ασφαλές να υποθέσουμε ότι τα όργανα ελέγχου γονιμότητας του είχαν βρει έναν τρόπο αναπαραγωγής με μια εντυπωσιακά σύντομη περίοδο κύησης, ήταν τόσοι πολλοί. Θα μπορούσε μόνο να αναρωτηθεί αν είχε πραγματικά χρόνο να τα παρακολουθήσει όλα. Φυσικά, αστειεύομαι... ανέφερα ότι έπαιρνε πολύ σοβαρά τη δουλειά του;

Εκείνη την εποχή, το δίκτυο υπολογιστών εκτελούσε Windows 2000. Σύντομα ανακάλυψα ότι κάθε φορά που συνδέομαι στο σύστημα, εκκινούσε ένα σενάριο που καθόριζε την εκκίνηση του διακομιστή VNC από τον λογαριασμό διαχειριστή για απομακρυσμένη πρόσβαση στην επιφάνεια εργασίας. Όποτε αυτός ο τύπος ήθελε να σας κατασκοπεύσει, συνδέθηκε απευθείας στο μηχάνημά σας και το ρολόι σας. Ήταν ανατριχιαστικό, και τώρα που το σκέφτομαι, μάλλον παράνομο.

Έχοντας κόψει τα δόντια μου σε BASIC και C64, έγραψα τώρα σε C και έστω και λίγο C++. Τότε, με ενδιέφερε ακόμη πολύ η γλώσσα D, η οποία διόρθωσε κάποιες από τις ελλείψεις της C++, όπως την είδα τότε.

Πήγαινα στην αίθουσα υπολογιστών για να διαβάσω κάτι νέο στο D ή να παίξω με τον μεταγλωττιστή Digital Mars D. Μερικές φορές, ενώ αποσπούσα την προσοχή από το να σκεφτώ το μεγάλο μέλλον του D, έγραφα κώδικα C για να χακάρω άλλα προγράμματα Win32 από το παράθυρό τους λαβές.

Στις παλιές καλές μέρες του προγραμματισμού Win32, η εύρεση μιας λαβής παραθύρου ήταν ο ευκολότερος τρόπος για να χακάρετε άλλα προγράμματα. Προφανώς, όλα τα προγράμματα GUI στα Windows είχαν παράθυρο, ακόμα κι αν δεν εμφανιζόταν στην οθόνη. Γράφοντας ένα πρόγραμμα για την ανάκτηση μιας λαβής σε μια άλλη διαδικασία (ουσιαστικά έναν σύνδεσμο προς αυτήν), θα μπορούσατε να της στείλετε μηνύματα. Αυτό επέτρεψε ορισμένες βασικές λειτουργίες όπως η απόκρυψη/εμφάνιση ενός παραθύρου προγράμματος, καθώς και πολύ ευχάριστα πράγματα όπως ο εξαναγκασμός μιας διαδικασίας να φορτώσει ένα αυθαίρετο DLL στο χώρο της μνήμης και να ξεκινήσει την εκτέλεση κώδικα. Μετά την ένεση DLL, άρχισε η διασκέδαση.

Τον πρώτο ενάμιση μήνα, αυτός ο ντετέκτιβ δεν με ενόχλησε πολύ· συνδέθηκε στον διακομιστή VNC στο μηχάνημά μου μόνο μία ή δύο φορές. Αλλά μια συγκεκριμένη συνεδρία μπορεί να του κέντρισε το ενδιαφέρον. Έγραφα κάποιον κώδικα C για να κρύψω τα παράθυρα του Minesweeper (χωρίς να τα κλείσω) για να διευκολύνω την αναπαραγωγή στην τάξη, όταν παρατήρησα ότι το λευκό εικονίδιο VNC στο δίσκο συστήματος είχε γίνει μαύρο. Αυτό σήμαινε ότι τώρα με παρακολουθούσε.

Συνέχισα την κωδικοποίηση ως συνήθως, προσπαθώντας να τον αγνοήσω. Εν τω μεταξύ, το μηχάνημα άρχισε να επιβραδύνει, προσπαθώντας να μεταδώσει τον μέγιστο ρυθμό καρέ σε μια από τις αμέτρητες οθόνες στη γωνία του δωματίου. Τα Windows σχεδόν σταμάτησαν να ανταποκρίνονται, όταν η υπομονή μου εξαντλήθηκε, αποσυνδέθηκα και τελείωσα για την ημέρα.

Σε επόμενες επισκέψεις στην αίθουσα υπολογιστών, ο Κολόμπο έδειξε έντονο ενδιαφέρον για αυτό που έκανα σχεδόν κάθε φορά. Μετά από περίπου την τέταρτη φορά, αποφάσισα: Πρέπει να κάνω κάτι για αυτό.

Παραδέχομαι ότι ένας λογικός, λογικός άνθρωπος θα μπορούσε απλώς να είχε θέσει αυτό το θέμα απευθείας σε αυτόν ή στο αφεντικό του. Ωστόσο, πάντα έδινα στον πειρασμό και ζήτησα γρήγορα να υιοθετήσω μια εντελώς διαφορετική στρατηγική.

- Δεν μπορείτε να κάνετε τίποτα χωρίς αυτόν τον διακομιστή VNC! — είπα ήρεμα και αποφασιστικά πολλές φορές στον εαυτό μου.

Ήταν απαραίτητο να σκοτωθεί ο VNC.

Άρχισα να μπαίνω στην αίθουσα υπολογιστών με μεγάλες ομάδες μαθητών και να κάθομαι όσο πιο μακριά από τη γωνία με τις οθόνες. Αυτό λειτούργησε για λίγο και μου έδωσε λίγο χρόνο να δοκιμάσω ιδέες.

Η πρώτη μου προσπάθεια, νομίζω ότι θα συμφωνήσετε, ήταν αρκετά αδύναμη. Κάνοντας δεξί κλικ στο εικονίδιο VNC στο δίσκο συστήματος, είδα ένα μενού με τα μαγικά γράμματα EXIT. Δυστυχώς, τα γράμματα γράφτηκαν σε γκρι περίγραμμα. Ο διαχειριστής έχει απενεργοποιήσει το στοιχείο μενού "Έξοδος" μέσω του Επεξεργαστή πολιτικής ομάδας. Προσπάθησα να σκοτώσω τη διαδικασία από το Task Manager, αλλά φυσικά ήταν αόρατη για μένα επειδή εκτελούσε έναν διαφορετικό, πιο προνομιακό λογαριασμό. Δεν πέτυχε.

Ο διακομιστής VNC τρέχει στη θύρα TCP 5900, θυμήθηκα. Το επόμενο σχέδιό μου ήταν να στείλω κατεστραμμένα πακέτα σε αυτή τη θύρα για να την καταρρεύσω.

Πέρασα τουλάχιστον μερικές μέρες μπερδεύοντας το πρωτόκολλο, στέλνοντας διάφορες μορφές καλά δομημένης βλακείας στη θύρα 5900 και ελπίζοντας ότι θα σπάσει. Τελικά ούτε αυτό λειτούργησε.

Είχα ήδη αρχίσει να σκέφτομαι ότι δεν θα μπορούσα να απαλλαγώ από αυτό το πράγμα, όταν ξαφνικά με ξημέρωσε: πρέπει να υπάρχει ένα παράθυρο εκεί! Πρέπει να το εμφανίσουμε. Ίσως θα έχει ένα ωραίο ζουμερό κουμπί "Σίγαση" που μπορώ να το χρησιμοποιήσω πολύ!

Έτρεξα τον σχεδόν τέλειο κωδικό C για να βρω τη λαβή στο κύριο παράθυρο μιας άλλης διαδικασίας - και σίγουρα, το VNC βρέθηκε. Ένιωσα έμπνευση όταν πληκτρολογούσα τα δάχτυλά μου WM_SHOWWINDOW. Να προσπαθήσω να μαντέψω τι είδα μπροστά μου;

Τίποτα

Τώρα ήμουν περίεργος... είχε παράθυρο, αλλά αγνοούσε τα μηνύματά μου. Έλεγξα ξανά τον κωδικό μου για να βεβαιωθώ ότι λειτουργεί. Το δοκίμασα σε πολλές άλλες διαδικασίες και λειτούργησε τέλεια. Προσπάθησα να στείλω άλλα μηνύματα στο παράθυρο VNC, και πάλι τίποτα.

Και μετά με ξανανημέρωσε!

Χάρη στο πολύ χοντρό το βιβλίο Charles Petzold Μελέτησα προσεκτικά πώς λειτουργούν οι διαδικασίες Win32 μέσα στο σύστημα. Κάθε εφαρμογή Win32 έχει ένα παράθυρο καθώς και μια "ουρά μηνυμάτων". Τα μηνύματα που ενεργοποιούνται από την αλληλεπίδραση των χρηστών, καθώς και τα μηνύματα που αποστέλλονται από τα ίδια τα Windows, φτάνουν σε μια ουρά και η ίδια η εφαρμογή αποφασίζει πώς θα τα επεξεργαστεί.

Δεν είναι πολύ ενδιαφέρον από μόνο του. Αλλά όταν συνειδητοποίησα ότι μια αρκετά μεγάλη μη επεξεργασμένη ουρά μηνυμάτων λειτούργησε ως ευρετικό για το Window Process Manager για να παρέμβει σε μια διαδικασία κρεμασμένη, άρχισα να ιδρώνω καθαρή σεροτονίνη.

Χωρίς να χάσω δευτερόλεπτο, επέστρεψα στον κωδικό C μου, προετοιμαζόμενος να στείλω άλλο μήνυμα στο κύριο παράθυρο του VNC WM_SHOWWINDOW. Σε έναν κύκλο. Αιώνιος. Πολλά μηνύματα λοιπόν. WM_SHOWWINDOW, που τώρα ήξερα ότι η VNC θα προσπαθούσε να αγνοήσει εντελώς... με κίνδυνο.

Έκανα μεταγλώττιση και έτρεξα 4KB από τον πιο λατρευτικό κώδικα της ζωής μου. Μετά από περίπου τρία δευτερόλεπτα, τα Windows ανέφεραν ότι η διαδικασία vncserver.ехе δεν απαντά και έκανε μια προσφορά που απλά δεν μπορούσα να αρνηθώ:

Θέλετε να ολοκληρώσετε αυτή τη διαδικασία;

ΟΠΩΣΔΗΠΟΤΕ ΝΑΙ!

Επιτρέψτε μου να παραδεχτώ ότι την υπόλοιπη μέρα ήμουν αφόρητα ευχαριστημένος με τον εαυτό μου.

Μετά από μερικές ώρες που αφιέρωσα στη νέα μου υπερδύναμη, αποφάσισα πώς θα τη χρησιμοποιούσα. Ήταν πολύ εύκολο να σκοτώσει τη συνεδρία ακριβώς μπροστά του. Είχα μια καλύτερη ιδέα - να εξαφανιστώ εντελώς.

Μετά βάπτιση του πυρός με προγραμματισμό πρίζας Συνειδητοποίησα ότι μπορούσα να γράψω κώδικα που θα έκανε δύο πράγματα. Πρώτα θα καταλάβει τη θύρα TCP 5900 που μόλις ελευθερώθηκε, που προηγουμένως καταλαμβανόταν από την ανίδεη διαδικασία διακομιστή VNC. Στη συνέχεια, θα δημιουργήσει μια νέα σύνδεση TCP στον διακομιστή VNC του καθορισμένου μηχανήματος. Ο κώδικας απλώς θα μεταφέρει όλα τα δεδομένα μεταξύ των δύο υποδοχών και ο Columbo θα νομίζει ότι συνδέεται με εμένα, ενώ στην πραγματικότητα θα συνδέεται σε έναν εντελώς διαφορετικό διακομιστή VNC.

Ο κωδικός μου θα λειτουργήσει ως μυστική γέφυρα ανάμεσα σε εμένα και κάποια άλλη φτωχή ψυχή της επιλογής μου. Ήταν υπέροχα.

Άρχισα αμέσως να γράφω την ψεύτικη γέφυρα VNC μου. Ο Columbo συνδέθηκε μαζί μου αρκετές φορές, αλλά συνέχισα να προγραμματίζω μπροστά του. Κατέληξα στο συμπέρασμα ότι δεν είχε ιδέα τι έκανα, παρόλο που έγραψα προφανή πράγματα όπως αριθμούς θυρών και σχόλια όπως // Прощай, жуткий шпион VNC.

Μετά από μερικές μέρες δεν μπόρεσα να βάλω τον κωδικό να λειτουργήσει σωστά. Για να γίνουν τα πράγματα χειρότερα, βρέθηκα να δουλεύω με το μαύρο εικονίδιο VNC στο δίσκο συστήματος σχεδόν συνεχώς. Ενώ ήταν συνδεδεμένο, δεν μπορούσα να απελευθερώσω τη θύρα για να δοκιμάσω τον κωδικό μου.

Αν το ήξερα τότε netcat!

Στο τέλος τα νεύρα μου υποχώρησαν· στο κάτω-κάτω ήμουν ένας ανυπόμονος 17χρονος τύπος. Βλέποντας το λευκό εικονίδιο του διακομιστή VNC να γίνεται ξανά μαύρο, φρίκαρα, άνοιξα τον αρχικό κωδικό που συμπλήρωνε την ουρά μηνυμάτων και τον έτρεξα μπροστά στα μάτια του. Περίμενα μερικά δευτερόλεπτα πριν κάνω κλικ End Process, απλά για να βεβαιωθεί ότι το είδε.

Αν το πάτημα αυτού του κουμπιού δεν με έπεισε πλήρως ότι άξιζε τον κόπο, τότε πήδηξε πίσω από το φρούριο των οθονών του για να με πλησιάσει γρήγορα και να με βγάλει από το δωμάτιο σίγουρα το έκανε.

Ως αποτέλεσμα, μου απαγόρευσαν από το δίκτυο για δύο εβδομάδες. Μια δίκαιη τιμωρία, σκέφτηκα. Μετά από περίπου τρεις εβδομάδες, ο διακομιστής VNC εξαφανίστηκε από τα σενάρια εκκίνησης και δεν εμφανίστηκε ποτέ πουθενά αλλού. Ποτέ δεν ήξερα αν το περιστατικό μου έπαιξε κάποιο ρόλο σε αυτό ή όχι, αλλά κατέστρεψε τελείως το σχέδιό μου να γίνω υπέροχα πλούσιος πουλώντας το όπλο μου VNC σε καταθλιπτικούς φοιτητές σε αίθουσες υπολογιστών κολεγίων σε όλη τη χώρα.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο