Détection de SoftICE
Le logiciel SoftICE est un débogueur ring0 ne pouvant pas être détecté à l'aide des techniques de détection de débogueur standard. Le débogueur SoftICE de Numega est un débogueur en mode noyau destiné au débogage des pilotes de périphériques et de Windows lui-même. Il est favorisé par les hackers de protection logicielle en raison de sa puissance. Il existe tout de même quatre méthodes bien connues pour détecter la présence de logiciel SoftICE.
La technique «Meltice» est l'une des plus anciennes méthodes de détection de SoftICE. Il tente d'ouvrir les périphériques virtuels créés par SoftICE ; si l'un de ces périphériques existe, le débogueur est présent à l'aide du code source Visual C++ suivant :
- #include <windows.h>
-
- BOOL IsSoftICEMeltice(void) {
- HANDLE hFile = CreateFile(TEXT("\\.\\SICE"), GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
- if(hFile == INVALID_HANDLE_VALUE) hFile = CreateFile(TEXT("\\.\\NTICE"), GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
- if(hFile == INVALID_HANDLE_VALUE) hFile = CreateFile(TEXT("\\.\\SIWDEBUG"), GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
- if(hFile == INVALID_HANDLE_VALUE) hFile = CreateFile(TEXT("\\.\\SIWVID"), GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
- if(hFile == INVALID_HANDLE_VALUE) return FALSE;
- CloseHandle(hFile);
- return TRUE;
- }
Le logiciel SoftICE fournit une interface via l'instruction de point d'arrêt de débogage (int3) permettant à un processus de communiquer avec le débogueur. En chargeant une valeur magique ("BCHK") dans le registre EBP et en exécutant un int3, l'interface Boundschecker (à l'origine l'utilitaire Numega Boundschecker) est accessible. La fonction à appeler est chargée dans le registre EAX; la fonction 4 mettra le registre AL à 0 si SoftICE est présent.
- #include <windows.h>
-
- __declspec(naked) BOOL IsSoftICEBoundschecker(void) {
- __asm {
- PUSH EBP
- MOV EBP, 0x4243484B /* "BCHK" */
- MOV EAX, 4 /* Fonction 4: Interface boundschecker */
- INT 3
- TEST AL, AL /* Test pour zéro */
- JNZ debuggerNotPresent
- MOV EAX, 1 /* Fixe le retourner sur la valeur 1 */
- POP EBP
- RET
- debuggerNotPresent:
- XOR EAX, EAX /* Fixe le retourner sur la valeur 0 */
- POP EBP
- RET
- }
- }
L'interface int3 peut également être utilisée pour envoyer des commandes à SoftICE en définissant les registres ESI et EDI sur des valeurs magiques, puis en appelant la fonction 0x911 :
- #include <windows.h>
-
- char *sice_cmd = "hboot";
-
- BOOL IsSoftIceCommand(char *cmd) {
- __asm {
- PUSH ESI
- MOV ESI, 0x4647 /* "FG" */
- PUSH EDI
- MOV EDI, 0x4A4D /* "JM" */
- PUSH EDX
- MOV EDX, [cmd] /* Commande (chaîne de caractères) à exécuter */
- MOV AX, 0x0911 /* Fonction 911: Exécute la commande SOFTICE */
- INT 3
- POP EDX
- POP EDI
- POP ESI
- }
- }
Enfin, la présence de SoftICE peut être détectée en appelant la fonction 0x43 de l'interruption 0x68 :