2017-06-03 8 views

Antwort

1

Während keine definitive Antwort, können Sie HeapQueryInformation(HeapCompatibilityInformation) anrufen und wenn es 2 kehrt dann ist es serialisiert, weil MSDN dies über HEAP_NO_SERIALIZE sagt:

Die Low-Fragmentierung Heap (LFH) für einen Heap nicht aktiviert werden mit dieser Option erstellt

ich weiß nicht, ob es noch eine nicht dokumentierte API ist die Flaggen zu bekommen, aber für Debugging-Zwecke können Sie die interne Heap-Struktur direkt zugreifen:

void DumpHeapType_Win8_x86(HANDLE hHeap) 
{ 
    typedef struct { 
     UINT32 Unknown1[2]; 
     UINT32 Sig; 
     UINT32 Unknown2[1]; 
     void*Unknown3[2]; //LIST_ENTRY? 
     void*Unknown4[1+1+1+1+2]; 
     UINT32 Unknown5[1+1+1+1]; 
     UINT32 Flags; 
    } HEAP_HDR; 
    typedef struct { 
     UINT32 Unknown1[2]; 
     UINT32 Sig; 
     UINT32 Unknown2[1]; 
     void*Unknown3[2]; //LIST_ENTRY? 
     HEAP_HDR*pHdr; 
    } HEAP_THING; 
    HEAP_THING *pThing = (HEAP_THING*) hHeap; 
    if (hHeap && pThing->Sig == 0xffeeffee) 
    { 
     HEAP_HDR *pHdr = (HEAP_HDR*) pThing->pHdr; 
     if (pHdr->Sig == 0xffeeffee) 
     { 
      printf("Flags=%#x Serialized=%d\n", pHdr->Flags, !(pHdr->Flags & HEAP_NO_SERIALIZE)); 
     } 
    } 
} 

void playwithheaps() 
{ 
    HANDLE hHeap; 
    DumpHeapType_Win8_x86(hHeap = GetProcessHeap()); 
    DumpHeapType_Win8_x86(hHeap = HeapCreate(0, 0, 0)); if (hHeap) HeapDestroy(hHeap); 
    DumpHeapType_Win8_x86(hHeap = HeapCreate(HEAP_NO_SERIALIZE, 0, 0)); if (hHeap) HeapDestroy(hHeap); 
    DumpHeapType_Win8_x86(hHeap = HeapCreate(HEAP_NO_SERIALIZE|HEAP_GENERATE_EXCEPTIONS, 0, 0)); if (hHeap) HeapDestroy(hHeap); 
} 

Auf meinem Windows 8 Maschine das gibt mir die folgende Ausgabe:

Flags=0x2 Serialized=1 
Flags=0x1002 Serialized=1 
Flags=0x1003 Serialized=0 
Flags=0x1007 Serialized=0 

aber die Haufen Struktur Layout könnte auf andere Versionen unterschiedlich sein, so dass Sie würde nur sorgfältig prüfen müssen ...

+0

Danke für den Versuch zu helfen, aber das ist kaum eine Lösung. Was ist, wenn der Heap nicht niedrigfragmentiert ist? – c00000fd

+0

Hmm. Interessant. Haben Sie die Umkehrung der Heap-APIs selbst durchgeführt? – c00000fd

+0

@ c00000fd Ich habe nicht wirklich viel von der API umgekehrt. Einige Windows-Versionen haben öffentliche Symbole für die HEAP-Struktur und den Rest können Sie wahrscheinlich herausfinden, indem Sie einfach den Handle-Speicher in DWORD-Chunks ablegen und nach Dingen suchen, die wie Zeiger und/oder Flags aussehen. – Anders

Verwandte Themen