Maison  >  Article  >  tutoriels informatiques  >  Parlons de l'utilisation du mécanisme de protection des pages Windows pour l'accrochage de fonctions

Parlons de l'utilisation du mécanisme de protection des pages Windows pour l'accrochage de fonctions

WBOY
WBOYavant
2024-03-26 09:40:47820parcourir

Résumé

Guard Pages est un mécanisme de protection de la mémoire dans le système d'exploitation, utilisé pour détecter et empêcher tout accès illégal à la mémoire. Dans les systèmes d'exploitation Windows, les pages de garde sont généralement situées à la fin des pages mémoire, qui sont généralement non allouées ou inaccessibles. La fonction principale des pages de garde est d'améliorer la sécurité du système et d'empêcher les programmes malveillants ou les erreurs d'accéder à la mémoire, protégeant ainsi le système des risques potentiels et des vulnérabilités de sécurité. En utilisant Guard Pages, le système d'exploitation peut détecter et empêcher rapidement les opérations illégales sur la mémoire, garantissant ainsi la stabilité et la sécurité du système.

Lorsqu'un programme tente d'accéder à la page de garde, le système d'exploitation reconnaît et déclenche immédiatement une exception, généralement une exception de violation d'accès. La génération de cette exception aide le programme à détecter les erreurs d'accès à la mémoire à temps, puis à prendre les mesures appropriées, telles que l'arrêt du programme ou l'enregistrement des informations sur les erreurs, pour empêcher l'exploitation de failles de sécurité potentielles. De cette manière, le système peut garder le contrôle de l'accès à la mémoire et assurer la stabilité et la sécurité du fonctionnement du programme. Le paramètre Guard Page fournit au système un mécanisme efficace pour surveiller et protéger l'accès à la mémoire, afin que tout problème potentiel puisse être découvert et traité à temps, améliorant ainsi la stabilité et la sécurité du système. Grâce au déclenchement d'exceptions, le programme peut réagir rapidement lorsqu'une erreur se produit, empêchant ainsi efficacement les problèmes d'accès à la mémoire pouvant entraîner de graves conséquences.

Les pages de garde sont largement utilisées dans Windows Hooking pour surveiller et intercepter l'accès à des zones de mémoire spécifiques. Grâce à cette technologie, les fonctions du système peuvent être modifiées ou surveillées, offrant ainsi un soutien solide dans des domaines tels que le débogage de logiciels, la recherche sur la sécurité et l'analyse des logiciels malveillants. Les pages de garde ont la capacité de détecter l'accès à la mémoire protégée et de déclencher les gestionnaires appropriés lorsque l'accès se produit. Ce mécanisme est utile pour protéger les données ou le code critiques contre les accès non autorisés et les vulnérabilités de sécurité potentielles. En configurant correctement les pages de garde, vous pouvez améliorer la sécurité et la stabilité du système et garantir que le système

Processus de mise en œuvre

Le code global est le suivant :

#include 
#include 

// Hook函数功能
HANDLE hook(LPSECURITY_ATTRIBUTES rcx, SIZE_T rdx, LPTHREAD_START_ROUTINE r8, LPVOID r9, DWORD stck1, LPDWORD stck2) {
MessageBoxA(0, "CreateThread() was called!", "YAY!", 0);
MessageBoxA(0, "Hooked CreateThread", "YAY!", 0);
// 这里调用原始CreateThread函数
//return CreateThread(rcx, rdx, r8, r9, stck1, stck2);
 return NULL;
}

LONG WINAPI handler(EXCEPTION_POINTERS * ExceptionInfo) {
 if (ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_GUARD_PAGE_VIOLATION) {
if (ExceptionInfo->ContextRecord->Rip == (DWORD64) &CreateThread) {
 printf("[!] Exception (%#llx)!" , ExceptionInfo->ExceptionRecord->ExceptionAddress);
printf("nClick a key to continue...n");
 getchar();
 ExceptionInfo->ContextRecord->Rip = (DWORD64) &hook;
printf("Modified RIP Points to: %#llxn", ExceptionInfo->ContextRecord->Rip);
printf("Hook Function = %#llxn", (DWORD64) &hook);
}
return EXCEPTION_CONTINUE_EXECUTION;
 }
 return EXCEPTION_CONTINUE_SEARCH;
}

int main() {
 DWORD old = 0;
DWORD param = 5000;
 AddVectoredExceptionHandler(1, &handler);
 VirtualProtect(&CreateThread, 1, PAGE_EXECUTE_READ | PAGE_GUARD, &old);
 printf("CreateThread addr = %#pn", &CreateThread);
 
 HANDLE hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) &Sleep, ¶m, 0, 0);
 WaitForSingleObject(hThread, param);
 printf("YEP!n");

 return 0;
}

Partie du fichier d'en-tête :

Le code commence par inclure les fichiers d'en-tête nécessaires, notamment et , qui fournissent respectivement des fonctions et des définitions pour l'API Windows et les opérations d'E/S standard.

Fonction crochet :

Ce code définit un hook de fonction hook, qui est utilisé pour intercepter la fonction API CreateThread qui crée des threads dans les applications Windows. À l'intérieur de la fonction hook, deux boîtes de message s'affichent pour inviter l'appel de la fonction CreateThread et indiquer qu'elle a été accrochée. Il convient de noter que dans ce code, la fonction CreateThread d'origine n'est pas réellement appelée, mais est interceptée.

Gestion des exceptions

Définissez une fonction de gestionnaire et définissez-la comme gestionnaire d'exceptions à l'aide de AddVectoredExceptionHandler. Cette fonction est conçue pour gérer les exceptions, en particulier STATUS_GUARD_PAGE_VIOLATION, qui est une exception qui se produit lors de la tentative d'exécution de code sur une page mémoire protégée. Si le code d'exception est STATUS_GUARD_PAGE_VIOLATION et que le pointeur d'instruction (Rip) pointe vers la fonction CreateThread, il affichera un message et modifiera le Rip pour pointer vers la fonction hook. Toute tentative d'appel de la fonction CreateThread sera redirigée vers la fonction hook.

Fonction principale

Dans la fonction principale, une variable old est déclarée mais n'est pas utilisée. Une variable param est définie sur 5 000 et la fonction AddVectoredExceptionHandler est appelée pour enregistrer la fonction de gestionnaire en tant que gestionnaire d'exceptions. Utilisez VirtualProtect pour configurer une page de garde sur la fonction CreateThread. Cela déclenchera la fonction de gestionnaire si vous essayez de l'exécuter. L'utilisation de printf affiche l'adresse de la fonction CreateThread. Un nouveau thread est créé à l'aide de CreateThread, mais cela ne semble pas avoir d'utilité réelle car le thread ne dort que pendant 5 000 millisecondes. Après avoir attendu la fin du fil de discussion, imprimez "YEP!".

Test

Compilez le code et exécutez-le, l'effet est le suivant :

Parlons de lutilisation du mécanisme de protection des pages Windows pour laccrochage de fonctions

Photos

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer