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

Utilisation de resload_Protect#?

Théorie

Dans certaines situations, il est très utile d'être informé quand le programme installé accède à certaines zones de la mémoire. Avec la fonction resload_Protect#?, il est possible de protéger certaines parties de la mémoire contre la lecture et/ou l'écriture du processeur. "Protéger" veut dire que chaque accès à une région de la mémoire protégée créera un Access Fault exception avec comme résultat un message approprié généré par WHDLoad. Si vous déclarez une partie de la mémoire comme protégée en utilisant la fonction resload_Protect#? WHDLoad modifiera les "affected page descriptor" dans l'arbre de traduction MMU. Maintenant chaque accès à cette page protégée, le CPU provoquera un Access Fault exception. Cette exception est traitée dans WHDLoad qui en vérifiera la raison. Si c'était un accès à une page protégée mais que l'accès ne touche pas à la mémoire protégée, cet accès sera émulé, et le programme continuera à fonctionner normalement. Autrement, WHDLoad quittera avec un message approprié. Si l'accès était un accès à des "instructions stream" (par ex. le CPU essaye de charger le code), ce sera toujours émulé, en d'autres termes, les fonctions resload_Protect#? affecteront seulement la lecture et l'écriture des données. Le fait est que chaque accès à une page protégée (actuellement la taille de la page est de 4096 octets) produira un Access Fault, même si la partie protégée n'est que de 1 octet, en conséquence la vitesse d'exécution du programme pourra ralentir énormément. Spécialement si une partie du code se trouve dans la même page. Si le programme dépend de la vitesse d'exécution, il se peut que le programme ne fontionnera pas avec les fonctions resload_Protect.

Exemple: checksums en dehors du code

Si vous installez un jeu en utilisant WHDLoad, vous devez patcher les routines originales du loader dans le jeu, dans un même temps, elles utiliseront WHDLoad pour charger les données du jeu. Quelques jeux exécutent des sommes de contrôle en dehors du code pour détecter si le code original a été modifié. Ces détections peuvent être difficiles à trouver. Cela sera plus facile en utilisant les fonctions resload_Protect#? dans WHDLoad. Ce que devez faire n'est d'autre que de protéger en lecture les octets que vous avez changés dans le code du jeu. Maintenant chaque routine qui essayera de calculer un checksum et lira votre code patché, provoquera un Access Fault. Vous saurez donc où la routine se trouve.

Limitations

Vous ne devez pas protéger une page de mémoire où le pointeur de pile superviseur (SSP) se trouve. Si vous faites cela, et qu'une exception se produit, il y aura un "Double Bus Fault" car le CPU sera incapable d'écrire le stackframe de l'exception. Après un Double Bus Fault, un reset de l'ordinateur doit être effectué pour pouvoir continuer. WHDLoad s'assure qu'il n'y pas de conflit entre la zone protégée et le SSP pour quitter. Mais ceci n'aide pas si le changement de SSP se fait par la suite.

Pour plus de limitations et d'informations, veuillez s'il vous plait vérifier la documantation Autodoc des différentes fonctions resload_Protect:


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