[Main] [Docs] [Installs] [Search] [Team] [Guestbook] [Links]

Χρησιμοποιώντας τις resload_Protect#?

Θεωρία

Υπάρχουν διάφορες περιπτώσεις στις οποίες ίσως είναι πολύ χρήσιμο να πληροφορείστε όταν το εγκατεστημένο πρόγραμμα έχει προσβάσεις σε συγκεκριμένες περιοχές μνήμης. Με τις συναρτήσεις resload_Protect#? είναι δυνατόν να προστατευτούν μερικές περιοχές μνήμης από ανάγνωση και/ή εγγραφή από τον επεξεργαστή. Προστασία σημαίνει ότι κάθε πρόσβαση σε τέτοια προστατευόμενη περιοχή θα δημιουργήσει μια εξαίρεση Access Fault που θα έχει σας αποτέλεσμα έναν αντίστοιχο επιλογέα από το WHDLoad. Αν ορίσετε μια περιοχή μνήμης ως προστατευόμενη χρησιμοποιώντας τη συνάρτηση resload_Protect#? το WHDLoad θα τροποποιήσει τις περιγραφές των επηρεαζόμενων σελίδων στο δέντρο μετάφρασης του MMU. Τώρα κάθε πρόσβαση στη προστατευόμενη σελίδα από το CPU θα δημιουργήσει μια εξαίρεση Access Fault. Ο χειριστής εξαιρέσεων μέσα στο WHDLoad θα επιβεβαιώσει το λόγο για την εξαίρεση. Αν ο λόγος ήταν μια πρόσβαση σε προστατευμένη σελίδα αλλά η πρόσβαση δεν ταιριάζει με την προστατευόμενη περιοχή η πρόσβαση θα εξομοιωθεί, και θα συνεχιστεί η κανονική εκτέλεση του προγράμματος. Διαφορετικά το WHDLoad θα τερματιστεί με έναν κατάλληλο επιλογέα. Αν η πρόσβαση ήταν μια πρόσβαση στη ροή εντολών (π.χ. η CPU προσπαθεί να φορτώσει κώδικα) θα εξομοιωθεί πάντα, ή με άλλα λόγια οι συναρτήσεις resload_Protect#? επηρεάζουν μόνο ανάγνωση και εγγραφή δεδομένων. Το γεγονός ότι κάθε πρόσβαση σε προστατευόμενη σελίδα (το μέγεθος σελίδας προς το παρόν είναι 4096 bytes) θα δημιουργήσει ένα σφάλμα πρόσβασης, ακόμα και αν η προστατευόμενη περιοχή έχει μήκος μόνο 1 byte, έχει ως αποτέλεσμα μια σημαντική καθυστέρηση της ταχύτητας εκτέλεσης του προγράμματος. Ειδικά αν κομμάτια του κώδικα βρίσκονται στην ίδια σελίδα. Αν το πρόγραμμα εξαρτάται από την ταχύτητα εκτέλεσης, είναι πιθανές οι διαφορές στην εκτέλεση. Οπότε είναι πιθανόν μερικά προγράμματα να μην λειτουργήσουν με το χαρακτηριστικό προστασίας resload_Protect.

Παράδειγμα: checksums πάνω σε κώδικα

Αν εγκαταστήσετε ένα παιχνίδι χρησιμοποιώντας το WHDLoad πρέπει να διορθώσετε τις αρχικές ρουτίνες του loader στο παιχνίδι με τέτοιο τρόπο ώστε αυτές να χρησιμοποιούν το WHDLoad για να φορτώσουν τα δεδομένα του παιχνιδιού. Μερικά παιχνίδια πραγματοποιούν checksums πάνω σε συγκεκριμένες περιοχές κώδικα για να ανακαλύψουν αν ο αυθεντικός κώδικας έχει αλλαχθεί. Αυτές οι ρουτίνες ελέγχου μπορεί μερικές φορές να είναι δυσεύρετες. Αλλά χρησιμοποιώντας τις συναρτήσεις resload_Protect#? στο WHDLoad θα είναι εύκολο. Το μόνο που πρέπει να κάνετε είναι να προστατέψετε τα bytes που αλλάξατε στο κώδικα του παιχνιδιού από ανάγνωση. Τώρα κάθε ρουτίνα που προσπαθεί να κάνει ένα checksum και να διαβάσει το διορθωμένο κώδικά σας θα προκαλέσει ένα σφάλμα πρόσβασης. Και θα ξέρετε που βρίσκεται η ρουτίνα.

Περιορισμοί

Δεν πρέπει να προστατέψετε τη σελίδα μνήμης στην οποία δείχνει το SSP. Αν το κάνετε και παρουσιαστεί μια εξαίρεση, θα έχει ως αποτέλεσμα ένα Double Bus Fault διότι η CPU δεν θα μπορεί να γράψει το πλαίσιο στοίβας (stackframe) εξαιρέσεων. Μετά από ένα Double Bus Fault μόνο μια επανεκκίνηση μπορεί να συνεχίσει την εκτέλεση. Το WHDLoad ελέγχει για σύγκρουση των προστατευόμενων περιοχών με το SSP και τερματίζεται αν υπάρξει. Αλλά αυτό δεν θα βοηθήσει αν το SSP αλλάξει μετά.

Για περισσότερους περιορισμούς και πληροφορίες παρακαλώ ελέγξτε τις καταχωρήσεις Autodoc για τα διάφορα χαρακτηριστικά του resload_Protect:


[Main] [Docs] [Installs] [Search] [Team] [Guestbook] [Links]