<?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>Απ: Deface σε managed κώδικα...</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/40283.aspx</link><pubDate>Mon, 18 Feb 2008 20:13:31 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:40283</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/40283.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=40283</wfw:commentRss><description>&lt;P&gt;Όπως ανέφερα, &lt;/P&gt;
&lt;P&gt;&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://www.dotnetzone.gr/cs/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;KelMan:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt; &lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;O μηχανισμός των strong names δεν είναι τόσο πολύ για security όσο για versioning. Προστατεύει ως έναν βαθμό αλλά για να γίνει ισχυρός μηχανισμός θα πρέπει&amp;nbsp;το&amp;nbsp;assenbly να σχετιστεί με ένα certificate&amp;nbsp;γιατί διαφορετικά έχουμε "μισό" μηχανισμό προστασίας. Το certificate είναι που δίνει trusted assemblies τα οποία μέσω .ΝΕΤ framework security policies (τα οποία παίζουν σε επίπεδο enterprise, machine ή user) μπορούν να οριοθετήσουν τα δικαιώματα που έχει το assembly. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;/P&gt;
&lt;P&gt;Που σημαίνει, αν έστω χρησιμοποιήσεις το εργαλείο που αναφέρεις, δεν θα έχεις πλέον trusted assemblies οπότε δεν θα μπορούν να τρέξουν λόγω policies. &lt;/P&gt;</description></item><item><title>Απ: Deface σε managed κώδικα...</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/40281.aspx</link><pubDate>Mon, 18 Feb 2008 20:01:23 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:40281</guid><dc:creator>plasmatek</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/40281.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=40281</wfw:commentRss><description>&lt;P&gt;μια μικρή επισήμανση μόνο όσον αφορά τα strong names.&lt;/P&gt;
&lt;P&gt;δυστυχώς δεν προσφέρουν απολύτως τίποτε. υπάρχουν εργαλεία με τα οποία απλά τα αφαιρείς, καθώς και τα references&amp;nbsp;τους στα υπόλοιπα assemblies.&lt;/P&gt;
&lt;P&gt;ένα τέτοιο εργαλείο είναι και &lt;A href="http://www.andreabertolotto.net/Articles/StrongNameRemove20.aspx"&gt;αυτό.&lt;/A&gt;&lt;/P&gt;</description></item><item><title>Απ: Deface σε managed κώδικα...</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/32644.aspx</link><pubDate>Wed, 06 Jun 2007 08:28:16 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:32644</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/32644.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=32644</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;Ναι, γενικά η φιλοσοφία που θα πρέπει να διέπει την προστασία των εφαρμογών θα πρέπει να είναι "λογικά αντίμετρα για λογικούς κινδύνους". Όπως τα αυτοκίνητα. Αν έχεις ένα μικρό αυτοκίνητο των 10.000€ θα βάλεις ανάλογο απλό συναγερμό που δεν έχει καμία σχέση με τον συναγερμό που θα έβαζες σε ένα αυτοκίνητο των 200.000€. Αν βγάλω μία εφαρμογή shareware, θα βολευτώ με τον comunity edition obfuscator που σε συνδυασμό με ένα strong named assenbly θα δυσκολέψει αρκετά αυτούς που θα ασχοληθούν με την εφαρμογή μου. Αν θέλω κάτι παραπάνω, μπορώ και να προσθέσω σύστημα προστασίας με activation over internet. Είναι σχετικά απλό, αλλά έχει κι αυτό τα μειονεκτήματά του, βλ. διαχειριστικό κόστος από πλευράς μου και ανάγκη να έχει internet connection o πελάτης. Τα πάντα έχουν μειονεκτήματα και πλεονεκτήματα. Το θέμα είναι να τα ξέρεις και να παίρνεις τη σωστότερη απάντηση κάτω από δεδομένες συνθήκες.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;Τώρα, ως προς τα strong named assemblies. O μηχανισμός των strong names δεν είναι τόσο πολύ για security όσο για versioning. Προστατεύει ως έναν βαθμό αλλά για να γίνει ισχυρός μηχανισμός θα πρέπει&amp;nbsp;το&amp;nbsp;assenbly να σχετιστεί με ένα certificate&amp;nbsp;γιατί διαφορετικά έχουμε "μισό" μηχανισμό προστασίας. Το certificate είναι που δίνει trusted assemblies τα οποία μέσω .ΝΕΤ framework security policies (τα οποία παίζουν σε επίπεδο enterprise, machine ή user) μπορούν να οριοθετήσουν τα δικαιώματα που έχει το assembly. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;Τέλος, ως προς το ότι αποτελεί πρόβλημα να χάσεις το private key, ε τώρα τι να πω... Σαφώς, υπάρχουν κάποιες δυνάμεις στις οποίες υποκύπτουν ακόμα και τα ισχυρότερα συστήματα ασφάλειας. Τέτοιες είναι οι δυνάμεις της χαζομάρας και της βλακείας (πάνω στις οποίες στηρίζεται το social engineering) καθώς και η δύναμη "έχω χάσει το μυαλό μου και δεν θυμάμαι που παράτησα το flash disk με το private key" &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-2.gif" alt="Big Smile" /&gt;&lt;/FONT&gt;&lt;/P&gt;</description></item><item><title>Απ: Deface σε managed κώδικα...</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/32643.aspx</link><pubDate>Wed, 06 Jun 2007 06:42:05 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:32643</guid><dc:creator>Mitsaras</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/32643.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=32643</wfw:commentRss><description>&lt;font face="Arial" size="2"&gt;Εκεί όπου σταματάνε οι obfuscators, ξεκινούν οι protectors. Το μειονέκτημα είναι η δυσκαμψία που προσθέτουν στο τελικό σύνολο.&lt;br&gt;&lt;br&gt;Πάντως, σε αυτά που αναφέρει ο Μάνος, συμπληρώνω ότι η νοοτροπία των χρηστών διαφέρει αρκετά από αυτήν που νομίζουμε. Πειρατές θα υπάρχουν πάντα, καθώς ό,τι κλειδώνει, ξεκλειδώνει. Το λάθος είναι να θεωρούμε μία πειρατική κόπια ως μία χαμένη κόπια. Ωστόσο οι legitimate χρήστες που θα πληρώσουν κάτι που τους χρησίμεψε σε μια λογική τιμή κατά τη γνώμη μου αποτελούν πλειοψηφία. Οι σχεδόν παρανοϊκές απόπειρες κλειδώματος (πχ με dongles) συνήθως οδηγούν στην απομάκρυνση όχι μόνο των πειρατών, αλλά και των legitimate χρηστών! Παραδείγματα υπάρχουν πολλά, στα παιχνίδια (starforce), στη δημιουργία μουσικής (iLok dongles) κοκ τα οποία αποδεικνύουν το παραπάνω.&lt;br&gt;&lt;/font&gt;</description></item><item><title>Απ: Deface σε managed κώδικα...</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/32641.aspx</link><pubDate>Wed, 06 Jun 2007 06:03:55 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:32641</guid><dc:creator>Thiseas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/32641.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=32641</wfw:commentRss><description>&lt;P&gt;Σ' ευχαριστώ Μάνο για την απάντηση σου.&lt;/P&gt;
&lt;P&gt;Πρέπει να συμφωνήσω μαζί σου και να πω οτι πράγματι το obfuscation είναι ένας καλός αν και όχι 100% (όπως είπες κι εσύ) ασφαλής τρόπος για να κρύψουμε των κώδικα μας από αδιάκριτα μάτια.&lt;/P&gt;
&lt;P&gt;Τώρα, για τα strong names... χρειάζομαι λίγο διάβασμα ακόμα για να αποφανθώ με κάποιο δικό μου παράδειγμα... πρέπει όμως&amp;nbsp;να σου αναφέρω όμως οτι υπάρχουν σοβαρές αντιρήσεις από &lt;STRONG&gt;&lt;U&gt;&lt;A href="http://www.codeproject.com/dotnet/StrongNameExplained.asp"&gt;κάποιους&lt;/A&gt;&lt;/U&gt;&lt;/STRONG&gt;... &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-4.gif" alt="Stick out tongue" /&gt;&lt;/P&gt;</description></item><item><title>Απ: Deface σε managed κώδικα...</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/32635.aspx</link><pubDate>Wed, 06 Jun 2007 00:24:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:32635</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/32635.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=32635</wfw:commentRss><description>&lt;P&gt;Πολύ σωστά όλα τα παραπάνω που αναφέρεις, ωστόσο υπάρχουν counter-measures για τα δύο βασικά προβλήματα, τη δυνατότητα του να βλέπεις τον κώδικα του άλλου καθώς και τη δυνατότητα να τον πειράζεις.&lt;/P&gt;
&lt;P&gt;Ως προς τη …«δημόσια θέα» του κώδικα, η λύση είναι το obfuscation. Ακόμα και με την community έκδοση του obfuscator που έρχεται μαζί με το Visual Studio μπορεί να γίνει σωστή δουλειά. Από εκεί και πέρα, αν θέλουμε κάτι ακόμα πιο δυνατό, αγοράζουμε το κάποιο εργαλείο με ακόμα περισσότερες δυνατότητες (στο θέμα του obfuscation). Πάντως γενικότερα το θέμα του δημόσιου κώδικα δε με απασχολεί. Θεωρώ ότι το σύγχρονο business model είναι περισσότερο θέμα υπηρεσιών και λιγότερο προϊόντων. Σκέφτομαι ότι, σε καμία εφαρμογή που έχω γράψει δεν έχω κάνει κάτι πραγματικά πρωτοποριακό που να αξίζει να κλειδωθεί. Το μεγαλύτερο ποσοστό της κάθε μου εφαρμογής είναι implementation πάνω σε κοινή γνώση που μπορεί να βρει κανείς ακόμα και στο MSDN. Περισσότερο ανησυχώ μην αποκαλυφθεί ότι χρησιμοποιώ GOTO &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-2.gif" alt="Big Smile" /&gt;&lt;/P&gt;
&lt;P&gt;Τώρα, ως προς το deface, εδώ η λύση είναι τα «strong names». Πέρα από το θέμα του versioning, τα strong-named assemblies δεν επιτρέπουν την αλλαγή του κώδικα σε binary επίπεδο. O μηχανισμός είναι πολύ απλός και δεν χρειάζεται να πληρώσουμε λεφτά σε VeriSign, κλπ. Αρχικά παράγουμε ένα public/private key ζευγάρι&amp;nbsp;με το sn tool. Κατά το build κάνουμε sign το assembly μας με το private key. Κατά τη διαδικασία του signing δημιουργείται ένα hash value από ολόκληρο το assembly που αποτελεί τη ψηφιακή υπογραφή του assembly. Κατόπιν, αυτό το hash value κρυπτογραφείται με to private key. Τώρα, κατά τη στιγμή που το CLR φορτώνει το assembly, το κάνει hash και με το public key κάνει&amp;nbsp; decrypt το hash value που είχε το assembly όταν έγινε signed. Μόνο αν ταιριάζουν αυτά τα δύο εκτελείται το assembly.&lt;BR&gt;&lt;/P&gt;</description></item><item><title>Deface σε managed κώδικα...</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/32633.aspx</link><pubDate>Tue, 05 Jun 2007 23:32:03 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:32633</guid><dc:creator>Thiseas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/32633.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=139&amp;PostID=32633</wfw:commentRss><description>&lt;P&gt;To deface είναι μια "διαδικασία" κατά την οποία "χαλάμε" ή αλλάζουμε προς το συμφέρον μας κάποιο αντικείμενο, όπως μια &lt;BR&gt;εικόνα, ένα πρόγραμμα ακόμα κι ένα web site. Η διαδικασία του deface δεν δηλώνει (σχέδον ποτέ) ικανότητα και μαγκιά! &lt;BR&gt;Συνήθως πραγματοποιείται από πιτσιρικάδες που έχουν βρεί 2,3 έτοιμα προγράμματα και εφαρμόζουν τις "ικανότητες" τους σε &lt;BR&gt;αθώους στόχους. Οι λόγοι που κάποιος κάνει ένα deface σε ένα πραγματικό περιβάλλον και όχι για εκπαιδευτικούς σκοπούς &lt;BR&gt;είναι πολλοί... βασικά όμως είναι η επίδειξη που συνεπάγεται μετριότητα και βλακεία!&lt;/P&gt;
&lt;P&gt;Αυτό που θέλω να πω με αυτό το post, συνδέοντάς το με κάποιο τρόπο με ένα &lt;A href="http://www.dotnetzone.gr/cs/forums/thread/32481.aspx"&gt;προηγούμενο&lt;/A&gt; μου... που ίσως θεωρήθηκε &lt;BR&gt;αναχρονιστικό, είναι πως η λογική assembler και stack processing είναι αναπόσπαστο κομμάτι όχι μόνο των εφαρμογών του &lt;BR&gt;1980, 1990 αλλά και του 2000+. &lt;BR&gt;Κοινώς ... "τα ίδια παλιά καλά κρασιά σε νέα μπουκάλια".&lt;/P&gt;
&lt;P&gt;Ο στόχος δεν είναι να αποδείξω το προφανές ούτε βέβαια να δείξω οτι λέω κάτι καινούριο (μιας και στο internet υπάρχουν &lt;BR&gt;πολλές αναφορές πολύ πιο advanced). Ο στόχος είναι να γίνει μια επικοδομιτική συζήτηση για το τι υπάρχει πίσω από τις &lt;BR&gt;νέες τεχνολογίες, πόσο έχουμε εξελιχθεί και μήπως τελικά είμαστε δέσμιοι των αρχικών μας προσεγγίσεων... και στην ουσία &lt;BR&gt;δεν έχει γίνει καμιά τεράστια αλλαγή...&lt;/P&gt;
&lt;P&gt;Επιτρέψτε μου να το εξηγήσω με ένα πάρα πολύ απλό παράδειγμα: Το παράδειγμα μου θα ακολουθεί επίτηδες τον παραδοσιακό &lt;BR&gt;τρόπο προγραμματισμού (από command line) πιο πολύ για να δείξω οτι υποστηρίζεται ακόμα (μετά από 10+ χρόνια windows &lt;BR&gt;domination).&lt;/P&gt;
&lt;P&gt;Πολοί είναι αυτοί που υποστηρίζουν οτι τα καλύτερα "κόλπα" γίνονται από command line... και δεν μιλώ μόνο για τους &lt;BR&gt;linuxάδες (που ίσχύει 100%) αλλά κ για τους win32...!&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Έστω οτι γράφουμε ένα πρόγραμμα το ίδιο χαζό με αυτό που είχαμε γράψει όταν κάναμε το παράδειγμα στο post για το "&lt;A href="http://www.dotnetzone.gr/cs/forums/thread/32481.aspx"&gt;Πως &lt;BR&gt;λειτουργεί ένα πρόγραμμα....&lt;/A&gt;"&lt;/P&gt;
&lt;P&gt;Αυτή τη φορά θα γράψουμε σε C# και managed κώδικα:&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;// Test3.cs&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;class&lt;/SPAN&gt; test3&lt;BR&gt;{&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;void&lt;/SPAN&gt; Main()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function1 (10, 20, 30);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;void&lt;/SPAN&gt; function1 (&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;int&lt;/SPAN&gt; a, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;int&lt;/SPAN&gt; b, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;int&lt;/SPAN&gt; c)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&lt;/SPAN&gt; s;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"Hello World!"&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Console.WriteLine(s);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;BR&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;/SPAN&gt;Κάνουμε compile από command line:&lt;BR&gt;&lt;FONT face="Courier New"&gt;&lt;STRONG&gt;c:\&amp;gt;csc test3.cs&lt;BR&gt;Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.42&lt;BR&gt;for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727&lt;BR&gt;Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;STRONG&gt;c:\&amp;gt;_&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Έχει δημιουργηθεί το test3.exe. Αυτό το 'exe' δεν ακολουθεί την δομή των "κλασικών" PE executables αλλά έχει πληροφορίες &lt;BR&gt;για τα περιεχόμενα του σε επίπεδο κλάσεων, μεταβλητών, members κλπ... &lt;/P&gt;
&lt;P&gt;Θα μπορούσαμε να φτιάξουμε έυκολα ένα πρόγραμμα που να τις διαβάζει αυτές τις πληροφορίες, αλλά δεν χρειάζεται γιατι το &lt;BR&gt;έχει κάνει η Microsoft για εμάς.&lt;BR&gt;Είναι το&lt;STRONG&gt; ildasm.exe&lt;/STRONG&gt; (intermidiate language disassembler &amp;lt;- μάλλον )&lt;/P&gt;
&lt;P&gt;Καλώντας λοιπόν :&lt;BR&gt;&lt;STRONG&gt;&lt;FONT face="Courier New"&gt;c:\&amp;gt;ildasm test3.exe /all=test.il&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;θα δημιουργήσει&amp;nbsp;το αρχείο&amp;nbsp;&lt;STRONG&gt;test.il&lt;/STRONG&gt;&amp;nbsp;με τον κώδικα σε CIL (common intermidiate language). Αυτός ο κώδικας μοιάζει πάρα πολύ με την &lt;BR&gt;assembly και αποτελείται από assembly-like intructions. Ο assembler αυτός δεν διαφέρει από τον assembler της "μηχανής" &lt;BR&gt;(π.x. τον περίφημο macro-assembler) και μαλιστα είναι stack oriented όπως θα δούμε παρακάτω.&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Πέρα από σημαντικά και ενδιαφέροντα στοιχεία για το πρόγραμμα μας που αναφέρονται μέσα στο test.il, για τις παραπάνω &lt;BR&gt;member functions θα δούμε:&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;.class public auto ansi beforefieldinit test3&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; extends [mscorlib]System.Object&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; .method public hidebysig static void&amp;nbsp; Main() cil managed&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .entrypoint&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Code size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 11 (0xb)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .maxstack&amp;nbsp; 8&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0000:&amp;nbsp; nop&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;STRONG&gt;--&amp;gt; Mην κάνεις τίποτε (no operation).&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0001:&amp;nbsp; ldc.i4.10&amp;nbsp;&amp;nbsp;--&amp;gt; &lt;STRONG&gt;LDC (load numeric constant) φόρτωσε από την μνήμη στο stack την τιμή 10&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0002:&amp;nbsp; ldc.i4.20&amp;nbsp;&amp;nbsp;--&amp;gt; &lt;STRONG&gt;LDC (load numeric constant) φόρτωσε από την μνήμη στο stack την τιμή 20&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0003:&amp;nbsp; ldc.i4.30&amp;nbsp; --&amp;gt; &lt;STRONG&gt;LDC (load numeric constant) φόρτωσε από την μνήμη στο stack την τιμή 30&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0004:&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void test3::function1(int32,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int32,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int32)&amp;nbsp;&amp;nbsp; &amp;nbsp;--&amp;gt; &lt;STRONG&gt;Kάλεσε την function1 με παραμέτρους 3 intergers 32bits&lt;/STRONG&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt; &lt;STRONG&gt;από το stack.&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0009:&amp;nbsp; nop&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt; &lt;STRONG&gt;μην κάνεις τίποτε (no operation).&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_000a:&amp;nbsp; ret&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt; &lt;STRONG&gt;επέστρεψε στο λειτουργικό.&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp; } // end of method test3::Main&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;Ομοίως για την function1 έχουμε:&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; .method public hidebysig static void&amp;nbsp; function1(int32 a,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int32 b,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int32 c) cil managed&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Code size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 15 (0xf)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .maxstack&amp;nbsp; 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .locals init ([0] string s)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt; &lt;STRONG&gt;Kαθορισμός της σχετικής address 0-&amp;gt;μεταβλητής για την αποθήκευση της s.&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0000:&amp;nbsp; nop&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0001:&amp;nbsp; ldstr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Hello World!"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt; &lt;STRONG&gt;Φορτώνεται η σταθερά στο stack.&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0006:&amp;nbsp; stloc.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt; &lt;STRONG&gt;Καταχωρείται στην μνήμη στη θέση 0 η μεταβλητή που&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt;&amp;nbsp;&lt;STRONG&gt;τα περιεχόμενά της είναι ήδη στο stack (από την προηγ. εντολή).&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0007:&amp;nbsp; ldloc.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt; &lt;STRONG&gt;Καταχωρείται από την μνήμη (θέση 0) στο stack.&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0008:&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void [mscorlib]System.Console::WriteLine(string) --&amp;gt; &lt;STRONG&gt;Εμφάνισε στην οθόνη οτι έχεις στο stack&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_000d:&amp;nbsp; nop&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_000e:&amp;nbsp; ret&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt; &lt;STRONG&gt;Eπέστρεψε απο όπου εκεί που κλήθηκες.&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp; } // end of method test3::function1&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;Άν τρέξω το πρόγραμμα μου θα δω το εξής:&lt;BR&gt;&lt;FONT face="Courier New" color=#000000&gt;&lt;STRONG&gt;c:\&amp;gt;test3&lt;BR&gt;Hello World!&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;Τρομερό πρόγραμμα ε?&lt;BR&gt;Χμ...&lt;/P&gt;
&lt;P&gt;Έστω τώρα οτι εγώ έκανα deploy αυτό το πρόγραμμα και έβαζα κάπου μόνο το test3.exe.&lt;BR&gt;Κάποιος μπορούσε να παράξει τον intermidiate κωδικα του, δίνοντας όπως είπαμε:&lt;BR&gt;&lt;STRONG&gt;&lt;FONT face="Courier New"&gt;c:&amp;gt; ildasm test3.exe /out=test3.il&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Μετά θα μπορούσε να μπεί μέσα στον intermidiate κώδικα και να τον αλλάξει αλλάζοντας π.χ. τα λεκτικά ή καλύτερα βάζοντας &lt;BR&gt;δικά του.&lt;BR&gt;Στην συγκεκριμένη περίπτωση θα αλλάξει την function 'funtion1' ως εξής&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; .method public hidebysig static void&amp;nbsp; function1(int32 a,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int32 b,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int32 c) cil managed&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Code size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 15 (0xf)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .maxstack&amp;nbsp; 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .locals init ([0] string s)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt; καθορισμός της σχετικής address 0-&amp;gt;μεταβλητής για την αποθήκευση της s&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0000:&amp;nbsp; nop&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0001:&amp;nbsp; ldstr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Hello World!" &amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt; Φορτώνεται η σταθερά στο stack.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0006:&amp;nbsp; stloc.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt; Καταχωρείται στην μνήμη στη θέση 0 η μεταβλητή που&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt;&amp;nbsp;τα περιεχόμενά της είναι ήδη στο stack (από την προηγ. εντολή)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0007:&amp;nbsp; ldloc.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt; Καταχωρείται από την μνήμη (θέση 0) στο stack.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0008:&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void [mscorlib]System.Console::WriteLine(string) --&amp;gt; Εμφάνισε στην οθόνη οτι έχεις στο stack&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New" color=#ff0000&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_000100:&amp;nbsp; ldstr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Defaced by Thiseas!"&amp;nbsp;--&amp;gt; Φορτώνεται η σταθερά στο stack.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_000600:&amp;nbsp; stloc.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt; Καταχωρείται στην μνήμη στη θέση 0 η μεταβλητή που&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt;&amp;nbsp;τα περιεχόμενά της είναι ήδη στο stack (από την προηγ. εντολή)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_000700:&amp;nbsp; ldloc.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt; Καταχωρείται από την μνήμη (θέση 0) στο stack.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_000800:&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void [mscorlib]System.Console::WriteLine(string) --&amp;gt; Εμφάνισε στην οθόνη οτι έχεις στο stack.&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_000d:&amp;nbsp; nop&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_000e:&amp;nbsp; ret&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt; επέστρεψε απο όπου εκεί που κλήθηκες.&lt;BR&gt;&amp;nbsp; } // end of method test3::function1&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Μπορώ τώρα όμως να παράξω το test3.exe από τον παραπάνω αλλαγμένο intermidiate κώδικα?&lt;BR&gt;Φυσικά.&lt;BR&gt;Καλώντας τον assembler:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;STRONG&gt;c:\&amp;gt;ilasm test3.il&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;STRONG&gt;Microsoft (R) .NET Framework IL Assembler.&amp;nbsp; Version 2.0.50727.42&lt;BR&gt;Copyright (c) Microsoft Corporation.&amp;nbsp; All rights reserved.&lt;BR&gt;Assembling 'test3.il'&amp;nbsp; to EXE --&amp;gt; 'test3.exe'&lt;BR&gt;Source file is ANSI&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;STRONG&gt;Assembled method test3::Main&lt;BR&gt;Assembled method test3::function1&lt;BR&gt;Assembled method test3::.ctor&lt;BR&gt;Creating PE file&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;STRONG&gt;Emitting classes:&lt;BR&gt;Class 1:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test3&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;STRONG&gt;Emitting fields and methods:&lt;BR&gt;Global&lt;BR&gt;Class 1 Methods: 3;&lt;BR&gt;Resolving local member refs: 1 -&amp;gt; 1 defs, 0 refs, 0 unresolved&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;STRONG&gt;Emitting events and properties:&lt;BR&gt;Global&lt;BR&gt;Class 1&lt;BR&gt;Resolving local member refs: 0 -&amp;gt; 0 defs, 0 refs, 0 unresolved&lt;BR&gt;Writing PE file&lt;BR&gt;Operation completed successfully&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Άν τρέξω το πρόγραμμα μου θα δω το εξής:&lt;BR&gt;&lt;FONT face="Courier New"&gt;&lt;STRONG&gt;c:\&amp;gt;test3&lt;BR&gt;Hello World!&lt;BR&gt;Defaced by Thiseas&lt;/STRONG&gt;&lt;/FONT&gt;!&lt;/P&gt;
&lt;P&gt;Η διαδικασία ήταν πάρα πολύ απλή. Μάλιστα είναι πολύ πιο απλή από το όταν είχαμε traditional ΕΧΕs... που μπορούσανε &lt;BR&gt;βέβαια και αυτά να "πειραχτούν" υπο τις κατάλληλες προυποθέσεις&amp;nbsp;ή&amp;nbsp;με έναν απλό hex-editor. Για μεγάλες αλλάγες όμως &lt;BR&gt;συνήθως ήταν πιο δύσκολο.&lt;/P&gt;
&lt;P&gt;Συμπέρασμα:&lt;BR&gt;Παλαιότερα το πάρεις όλες τις πληροφορίες, την ονοματολογία, τα μεγέθοι, τις κλάσεις κλπ κλπ από ένα EXE ήτανε απλά αδύνατον.&lt;BR&gt;Τώρα είναι δυνατόν.&lt;BR&gt;Το θεωρείται καλύτερο ή χειρότερο?&lt;BR&gt;Ασφαλέστερο ή όχι?&lt;BR&gt;Να μπορεί ο καθένας να δει σχεδόν τον κώδικά σας...επεμβαίνοντας κατά βούληση?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;</description></item></channel></rss>