чанк, выделенный HeapAlloc, не находится ни в одном сегменте кучи - PullRequest
0 голосов
/ 05 мая 2018

следующая разборка является частью функции msvcrt! _Heap_alloc, которая вызывается 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)]

приведенная выше разборка показывает, что msvcrt! _Heap_alloc вызывает HeapAlloc (hHeap, dwFlags, dwBytes) с hHeap, установленным в кучу времени выполнения C (0x1ea0000), dwFags, установленным в 0, и dwBytes в 0x964. 1004 *

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

сразу после вызова HeapAlloc eax имеет значение 3b8c8698, которое должно быть адресом выделенного чанка:

0:008> r eax
eax=3b8c8698

однако порция не находится ни в одном диапазоне сегмента кучи:

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)

в какой куче выделен кусок? спасибо за ответ.

1 Ответ

0 голосов
/ 06 мая 2018

то, что вы цитируете, не представляется возможным ИМХО

но если вы уверены, что находитесь в нужном месте и eax действительно указывает на какой-то выделенный адрес

вы можете попросить windbg сказать, что этот регион адресов использует ! Address command

разберите назад, чтобы показать, кто был

0:000> ub . l5
malloc!_malloc_base+0x27 [minkernel\crts\ucrt\src\appcrt\heap\malloc_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)]

дизассемблирование вперед, чтобы показать адрес, на который возвращается вызов (1230c5a)

0:000> u . l1
malloc!_malloc_base+0x38 [minkernel\crts\ucrt\src\appcrt\heap\malloc_base.cpp @ 34]:
01230c5a 85c0            test    eax,eax

подтвердите, что мы находимся по адресу возврата, так что eax фактически указывает на выделенную память
уведомление (1230c5a) в 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

давайте посмотрим, что это за область памяти и где она принадлежит

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
...