Section courante

A propos

Section administrative du site

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 :

  1. #include <windows.h>
  2.    
  3. BOOL IsSoftICEMeltice(void) {
  4.  HANDLE hFile = CreateFile(TEXT("\\.\\SICE"), GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
  5.  if(hFile == INVALID_HANDLE_VALUE) hFile = CreateFile(TEXT("\\.\\NTICE"), GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
  6.  if(hFile == INVALID_HANDLE_VALUE) hFile = CreateFile(TEXT("\\.\\SIWDEBUG"), GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
  7.  if(hFile == INVALID_HANDLE_VALUE) hFile = CreateFile(TEXT("\\.\\SIWVID"), GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
  8.  if(hFile == INVALID_HANDLE_VALUE) return FALSE;
  9.  CloseHandle(hFile);
  10.  return TRUE;
  11. }

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.

  1. #include <windows.h>
  2.    
  3. __declspec(naked) BOOL IsSoftICEBoundschecker(void) {
  4.  __asm {
  5.     PUSH EBP
  6.     MOV  EBP, 0x4243484B       /* "BCHK" */
  7.     MOV  EAX, 4                /* Fonction 4: Interface boundschecker */
  8.     INT 3
  9.     TEST AL, AL                /* Test pour zéro */
  10.     JNZ  debuggerNotPresent
  11.     MOV  EAX, 1                /* Fixe le retourner sur la valeur 1 */
  12.     POP  EBP
  13.     RET
  14. debuggerNotPresent:
  15.     XOR  EAX, EAX              /* Fixe le retourner sur la valeur 0 */
  16.     POP  EBP
  17.     RET
  18.   }
  19. }

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 :

  1. #include <windows.h>
  2.    
  3. char *sice_cmd = "hboot";
  4.    
  5. BOOL IsSoftIceCommand(char *cmd) {
  6.   __asm {
  7.    PUSH ESI
  8.    MOV  ESI, 0x4647     /* "FG" */
  9.    PUSH EDI
  10.    MOV  EDI, 0x4A4D     /* "JM" */
  11.    PUSH EDX
  12.    MOV  EDX, [cmd]      /* Commande (chaîne de caractères) à exécuter */
  13.    MOV  AX, 0x0911      /* Fonction 911: Exécute la commande SOFTICE */
  14.    INT 3
  15.    POP  EDX
  16.    POP  EDI
  17.    POP  ESI
  18.   }
  19. }

Enfin, la présence de SoftICE peut être détectée en appelant la fonction 0x43 de l'interruption 0x68 :

  1. #include <windows.h>
  2.    
  3. __declspec(naked) BOOL SoftICEIsPresent(void) {
  4.   __asm {
  5.    MOV AH, 0x43
  6.    INT 0x68
  7.    CMP AX, 0xF386
  8.    JNZ debuggerNotPresent
  9.    MOV EAX, 1
  10.    RET
  11. debuggerNotPresent:
  12.    XOR EAX, EAX
  13.    RET
  14.   }
  15. }


Dernière mise à jour : Dimanche, le 3 octobre 2021