windows - den del, der er tildelt af HeapAlloc, er ikke i nogen heapsegment

Indlæg af Hanne Mølgaard Plasc

Problem



Følgende demontering er en del af msvcrt! \_heap\_alloc funktionen som kaldes af msvcrt! malloc:


msvcrt!\_heap\_alloc+0xd1:
77c2c3ba 56              push    esi
77c2c3bb 6a00            push    0
77c2c3bd ff351824c677    push    dword ptr [msvcrt!\_crtheap (77c62418)]
77c2c3c3 ff15f410c177    call    dword ptr [msvcrt!\_imp\_\_HeapAlloc (77c110f4)]


over demontering viser, at msvcrt! \_heap\_alloc kalder HeapAlloc (hHeap, dwFlags, dwBytes) med hHeap sat til C runtime heap (0x1ea0000), dwFags sat til 0 og dwBytes til 0x964.det er også tydeligt fra følgende debugger output:


eax=00000001 ebx=00000000 ecx=5384f625 edx=00000964 esi=00000964 edi=0336cd5c
eip=77c2c3c3 esp=0336ccc8 ebp=0336cd00 iopl=0 nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000 efl=00000246
msvcrt!\_heap\_alloc+0xda:
77c2c3c3 ff15f410c177    call    dword ptr [msvcrt!\_imp\_\_HeapAlloc (77c110f4)] ds:0023:77c110f4={ntdll!RtlAllocateHeap (7c9100c4)}
0:008> r esi
esi=00000964
0:008> dd msvcrt!\_crtheap
77c62418  01ea0000 00000001 00000020 00000000


umiddelbart efter opkaldet til HeapAlloc eax har værdi 3b8c8698 som skal være adressen til chunk allokeret:


0:008> r eax
eax=3b8c8698


dog chunk er ikke i nogen heap segment rækkevidde:


0:008> !heap -a 
Index   Address  Name      Debugging options enabled
1:   00250000 
 Segment at 00250000 to 00350000 (00003000 bytes committed)
2:   00360000 
 Segment at 00360000 to 00370000 (00006000 bytes committed)
3:   00370000 
 Segment at 00370000 to 00380000 (00003000 bytes committed)
4:   01820000 
 Segment at 01820000 to 01830000 (00002000 bytes committed)
5:   01930000 
 Segment at 01930000 to 01940000 (00003000 bytes committed)
6:   01a50000 
 Segment at 01a50000 to 01a90000 (00003000 bytes committed)
7:   016d0000 
 Segment at 016d0000 to 016e0000 (00003000 bytes committed)
8:   01710000 
 Segment at 01710000 to 01720000 (00003000 bytes committed)
9:   020b0000 
 Segment at 020b0000 to 020c0000 (00003000 bytes committed)
10:   02450000 
 Segment at 02450000 to 02550000 (00003000 bytes committed)
11:   03d70000 
 Segment at 03d70000 to 03db0000 (00003000 bytes committed)
12:   047b0000 
 Segment at 047b0000 to 047f0000 (00003000 bytes committed)
13:   048f0000 
 Segment at 048f0000 to 04900000 (00003000 bytes committed)
14:   04a40000 
 Segment at 04a40000 to 04a50000 (00003000 bytes committed)
15:   053a0000 
 Segment at 053a0000 to 053b0000 (00003000 bytes committed)
16:   154b0000 
 Segment at 154b0000 to 155b0000 (00100000 bytes committed)
17:   38170000 
 Segment at 38170000 to 38180000 (00008000 bytes committed)


i hvilken bunke er det tildelt chunk?
tak for svar.

Bedste reference


Hvad du citerer synes ikke at være muligt IMHO


men hvis du er sikker på at du er på det rigtige sted, og eax faktisk peger på en bestemt adresse


du kan bede windbg om at sige, hvilken adresse adresse bruger ! adresse kommando


Demonter baglæns for at vise, hvem der var den, der ringer


0:000> ub . l5
malloc!\_malloc\_base+0x27 [minkernelcrtsucrtsrcappcrtheapmalloc\_base.cpp @ 39]:
01230c49 7415            je      malloc!\_malloc\_base+0x3e (01230c60)
01230c4b 56              push    esi
01230c4c 6a00            push    0
01230c4e ff3504ab2501    push    dword ptr [malloc!\_\_acrt\_heap (0125ab04)]
01230c54 ff15b0002501    call    dword ptr [malloc!\_imp\_\_HeapAlloc (012500b0)]


Demonter fremad for at vise adressen, hvor opkaldet returnerer (1230c5a)


0:000> u . l1
malloc!\_malloc\_base+0x38 [minkernelcrtsucrtsrcappcrtheapmalloc\_base.cpp @ 34]:
01230c5a 85c0            test    eax,eax


Bekræft, at vi er på returadressen, så eax faktisk peger på den tildelte hukommelse

læg mærke til (1230c5a) på eip


0:000> r
eax=002cb958 ebx=7ffdd000 ecx=77545dd3 edx=002cb953 esi=00000984 edi=0012fa54
**eip=01230c5a** esp=0012fa08 ebp=0012fa0c iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
malloc!\_malloc\_base+0x38:
01230c5a 85c0            test    eax,eax


Lad os se, hvad denne hukommelsesområde er, og hvor den tilhører


0:000> !address @eax

Usage:                  Heap
Base Address:           002c0000
End Address:            002cf000
Region Size:            0000f000 (  60.000 kB)
State:                  00001000          MEM\_COMMIT
Protect:                00000004          PAGE\_READWRITE
Type:                   00020000          MEM\_PRIVATE
Allocation Base:        002c0000
Allocation Protect:     00000004          PAGE\_READWRITE
More info:              heap owning the address: !heap 0x2c0000
More info:              heap segment
More info:              heap entry containing the address: !heap -x 0x2cb958


Content source: 1 (target), length: 36a8