Skip to content
Anti-analysebeginner

FindWindow Debugger Detection

Le malware énumère les fenêtres de premier niveau à la recherche des noms de classe d'outils d'analyse connus comme OllyDbg, x64dbg, WinDbg et Process Monitor pour détecter un environnement d'analyse.

Les outils de rétro-ingénierie enregistrent des fenêtres avec des noms de classe bien connus. Le malware utilise FindWindowW/FindWindowExW (une recherche directe par classe) ou EnumWindows (parcourir chaque fenêtre de premier niveau et comparer) pour repérer ces noms de classe. Si une fenêtre de débogueur, de désassembleur ou d'outil de surveillance existe, l'échantillon suppose qu'il est analysé et refuse de s'exécuter ou modifie son comportement.

C'est une vérification basée sur l'interface graphique de niveau débutant qui ne requiert aucun privilège particulier et est triviale à ajouter à n'importe quel échantillon.

Fonctionnement

Le malware interroge chaque nom de classe connu ; un handle non NULL signifie que l'outil est en cours d'exécution.

c
#include <windows.h>

const wchar_t *kToolClasses[] = {
    L"OLLYDBG",               // OllyDbg
    L"WinDbgFrameClass",      // WinDbg
    L"x64dbg",                // x64dbg / x32dbg
    L"ID",                    // Immunity Debugger
    L"PROCMON_WINDOW_CLASS",  // Process Monitor
};

BOOL AnalysisToolPresent(void)
{
    for (int i = 0; i < 5; i++)
        if (FindWindowW(kToolClasses[i], NULL) != NULL)
            return TRUE;
    return FALSE;
}

La variante EnumWindows passe un callback qui appelle GetClassNameW sur chaque fenêtre et compare les chaînes à la même liste, ce qui évite d'importer directement FindWindowW et est plus difficile à repérer statiquement.

Détection & contournement

  • Statique — Recherchez dans IDA/Ghidra les imports de FindWindowW/FindWindowExW/EnumWindows/GetClassNameW, et les chaînes littérales de classe OLLYDBG, WinDbgFrameClass, x64dbg, ID, PROCMON_WINDOW_CLASS. Ces chaînes sont souvent obfusquées : vérifiez aussi la construction de chaînes sur la pile près des appels FindWindow.
  • Dynamique — Dans x64dbg, posez un point d'arrêt sur user32!FindWindowW et user32!EnumWindows ; inspectez l'argument du nom de classe pour savoir exactement ce que cherche l'échantillon. La valeur de retour (rax) révèle si une correspondance a été trouvée.
  • Patch / contournement — Renommez la fenêtre/classe du débogueur pour que la recherche échoue (x64dbg permet de changer son titre/classe de fenêtre via des plugins), ou hookez FindWindowW/EnumWindows/GetClassNameW pour renvoyer NULL/aucune correspondance. Le plus simple : NOP ou inversez le saut conditionnel qui agit sur le résultat.
  • Outils — ScyllaHide et les plugins x64dbg de type HideWindow qui masquent ou renomment la fenêtre du débogueur ; Interceptor Frida sur FindWindowW/EnumWindows ; exécution des outils d'analyse sous des classes de fenêtre renommées.
Votes

Commentaires(0)