msvcrt!malloc - где выделяется память?

Тема в разделе "WASM.BEGINNERS", создана пользователем wasmer, 30 май 2008.

  1. wasmer

    wasmer New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2007
    Сообщения:
    104
    в WinDbg вхожу в msvcrt!malloc, останавливаюсь на адресе 77c2c40c и вижу:

    msvcrt!malloc:
    77c2c407 8bff mov edi,edi
    77c2c409 55 push ebp
    77c2c40a 8bec mov ebp,esp
    77c2c40c 833d1824c67700 cmp dword ptr [msvcrt!_crtheap (77c62418)],0 ds:0023:77c62418=003f0000
    77c2c413 750b jne msvcrt!malloc+0x19 (77c2c420)
    77c2c415 e81e2bffff call msvcrt!_core_crt_dll_init (77c1ef38)
    77c2c41a 85c0 test eax,eax
    77c2c41c 7502 jne msvcrt!malloc+0x19 (77c2c420)
    77c2c41e 5d pop ebp
    77c2c41f c3 ret
    77c2c420 ff350818c677 push dword ptr [msvcrt!_newmode (77c61808)]
    77c2c426 ff7508 push dword ptr [ebp+8]
    77c2c429 e8a6ffffff call msvcrt!_nh_malloc (77c2c3d4)
    77c2c42f 59 pop ecx
    77c2c430 5d pop ebp
    77c2c431 c3 ret

    то есть переменная _crtheap равна 003f0000
    казалось бы, отсюда и выделится память - аннет, после прохождения msvcrt!_nh_malloc eax=00850d50, откуда он берётся?
    !heap даёт:

    0:000> !heap
    NtGlobalFlag enables following debugging aids for new heaps: tail checking
    free checking
    validate parameters
    Index Address Name Debugging options enabled
    1: 00140000 tail checking free checking validate parameters
    2: 00240000 tail checking free checking validate parameters
    3: 00250000 tail checking free checking validate parameters
    4: 003f0000 tail checking free checking validate parameters

    в списке адреса 850000 нет
    ставлю бряк на VirtualAlloc и перезапускаю программу
    запускаю, бряк срабатывает и после call VirtualAlloc eax=850000
    то есть память выделяется в виртуалке, но как узнать что она там выделяется не ставля breakpoint?
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Не знаю с какой кучей msvcrt работает, но в стандартной виндовой куче
    1) Блоки размером более ~512К выделяются через VirtualAlloc, а в самой куче лишь ведется список таких блоков
    2) Блоки меньшего размера выделяются в самой куче, но если не хватает дефолтного 1Мб, то выделяется новый сегмент кучи, не обязательно "примыкающий" к предыдущему сегменту
     
  3. wasmer

    wasmer New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2007
    Сообщения:
    104
    default heap моего процесса находится по адресу 140000, но сразу после выполнения функции VirtualAllocEx, которая возвращает в eax адрес 850000 - адрес выделенного блока виртуальной памяти - я этого адреса в дефолтовой куче не нахожу:

    Код (Text):
    1. 0:000> dt 140000 _HEAP
    2. ntdll!_HEAP
    3.    +0x000 Entry            : _HEAP_ENTRY
    4.    +0x008 Signature        : 0xeeffeeff
    5.    +0x00c Flags            : 0x50000062
    6.    +0x010 ForceFlags       : 0x40000060
    7.    +0x014 VirtualMemoryThreshold : 0xfe00
    8.    +0x018 SegmentReserve   : 0x100000
    9.    +0x01c SegmentCommit    : 0x2000
    10.    +0x020 DeCommitFreeBlockThreshold : 0x200
    11.    +0x024 DeCommitTotalFreeThreshold : 0x2000
    12.    +0x028 TotalFreeSize    : 0x28a
    13.    +0x02c MaximumAllocationSize : 0x7ffdefff
    14.    +0x030 ProcessHeapsListIndex : 1
    15.    +0x032 HeaderValidateLength : 0x608
    16.    +0x034 HeaderValidateCopy : (null)
    17.    +0x038 NextAvailableTagIndex : 0
    18.    +0x03a MaximumTagIndex  : 0
    19.    +0x03c TagEntries       : (null)
    20.    +0x040 UCRSegments      : (null)
    21.    +0x044 UnusedUnCommittedRanges : 0x00140598 _HEAP_UNCOMMMTTED_RANGE
    22.    +0x048 AlignRound       : 0x17
    23.    +0x04c AlignMask        : 0xfffffff8
    24.    +0x050 VirtualAllocdBlocks : _LIST_ENTRY [ 0x140050 - 0x140050 ]
    25.    +0x058 Segments         : [64] 0x00140640 _HEAP_SEGMENT
    26.    +0x158 u                : __unnamed
    27.    +0x168 u2               : __unnamed
    28.    +0x16a AllocatorBackTraceIndex : 0
    29.    +0x16c NonDedicatedListLength : 1
    30.    +0x170 LargeBlocksIndex : (null)
    31.    +0x174 PseudoTagEntries : (null)
    32.    +0x178 FreeLists        : [128] _LIST_ENTRY [ 0x142d18 - 0x142d18 ]
    33.    +0x578 LockVariable     : 0x00140608 _HEAP_LOCK
    34.    +0x57c CommitRoutine    : (null)
    35.    +0x580 FrontEndHeap     : 0x00140688
    36.    +0x584 FrontHeapLockCount : 0
    37.    +0x586 FrontEndHeapType : 0x1 ''
    38.    +0x587 LastSegmentIndex : 0 ''
    39. 0:000> dt 140000+0x50 _LIST_ENTRY
    40. ntdll!_LIST_ENTRY
    41.  [ 0x140050 - 0x140050 ]
    42.    +0x000 Flink            : 0x00140050 _LIST_ENTRY [ 0x140050 - 0x140050 ]
    43.    +0x004 Blink            : 0x00140050 _LIST_ENTRY [ 0x140050 - 0x140050 ]
    44.  
    45. то есть список VirtualAllocdBlocks пуст
    46. пуст и список по адресу 3f0000+0x50 - для кучи msvcrt
    47. в структуре _PEB подобных списков нет
    48. есть ещё структура _EPROCESS, но она системная, поэтому
    49. запускаю новое окно WinDbg, выбираю file -> kernel debug -> local
    50. в командной строке kd пишу:
    51. lkd> !process 0 0
    52. **** NT ACTIVE PROCESS DUMP ****
    53. ...................................................
    54. PROCESS 812a7558  SessionId: 0  Cid: 00e0    Peb: 7ffdc000  ParentCid: 04b0
    55.     DirBase: 075cf000  ObjectTable: 00000000  HandleCount:   0.
    56.     Image: http_login9.exe
    57.  
    58. PROCESS 8123fda0  SessionId: 0  Cid: 0108    Peb: 7ffdc000  ParentCid: 04b0
    59.     DirBase: 0fd9a000  ObjectTable: e2437ba8  HandleCount:  13.
    60.     Image: http_login9.exe
    61.  
    62. то есть для моего отлаживаемого процесса http_login9.exe две записи, выбираю вторую:
    63.  
    64. lkd> dt 8123fda0 _EPROCESS
    65. ntdll!_EPROCESS
    66.    +0x000 Pcb              : _KPROCESS
    67.    +0x06c ProcessLock      : _EX_PUSH_LOCK
    68.    +0x070 CreateTime       : _LARGE_INTEGER 0x1c8c246`cc4229b0
    69.    +0x078 ExitTime         : _LARGE_INTEGER 0x0
    70.    +0x080 RundownProtect   : _EX_RUNDOWN_REF
    71.    +0x084 UniqueProcessId  : 0x00000108
    72.    +0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x812547e8 - 0x812a75e0 ]
    73.    +0x090 QuotaUsage       : [3] 0x5a0
    74.    +0x09c QuotaPeak        : [3] 0x5a0
    75.    +0x0a8 CommitCharge     : 0xc2
    76.    +0x0ac PeakVirtualSize  : 0x1a3a000
    77.    +0x0b0 VirtualSize      : 0x1a3a000
    78.    +0x0b4 SessionProcessLinks : _LIST_ENTRY [ 0x81254814 - 0xff84e0d4 ]
    79.    +0x0bc DebugPort        : 0x812cd2a8
    80.    +0x0c0 ExceptionPort    : 0xe146d178
    81.    +0x0c4 ObjectTable      : 0xe2437ba8 _HANDLE_TABLE
    82.    +0x0c8 Token            : _EX_FAST_REF
    83.    +0x0cc WorkingSetLock   : _FAST_MUTEX
    84.    +0x0ec WorkingSetPage   : 0x2005
    85.    +0x0f0 AddressCreationLock : _FAST_MUTEX
    86.    +0x110 HyperSpaceLock   : 0
    87.    +0x114 ForkInProgress   : (null)
    88.    +0x118 HardwareTrigger  : 0
    89.    +0x11c VadRoot          : 0x81286238
    90.    +0x120 VadHint          : 0x812828c0
    91.    +0x124 CloneRoot        : (null)
    92.    +0x128 NumberOfPrivatePages : 0x37
    93.    +0x12c NumberOfLockedPages : 0
    94.    +0x130 Win32Process     : 0xe2320b70
    95.    +0x134 Job              : (null)
    96.    +0x138 SectionObject    : 0xe10358d0
    97.    +0x13c SectionBaseAddress : 0x00400000
    98.    +0x140 QuotaBlock       : 0xffa938c8 _EPROCESS_QUOTA_BLOCK
    99.    +0x144 WorkingSetWatch  : (null)
    100.    +0x148 Win32WindowStation : 0x000007e0
    101.    +0x14c InheritedFromUniqueProcessId : 0x000004b0
    102.    +0x150 LdtInformation   : (null)
    103.    +0x154 VadFreeHint      : (null)
    104.    +0x158 VdmObjects       : (null)
    105.    +0x15c DeviceMap        : 0xe1626448
    106.    +0x160 PhysicalVadList  : _LIST_ENTRY [ 0x8123ff00 - 0x8123ff00 ]
    107.    +0x168 PageDirectoryPte : _HARDWARE_PTE_X86
    108.    +0x168 Filler           : 0
    109.    +0x170 Session          : 0xf97ad000
    110.    +0x174 ImageFileName    : [16]  "http_login9.exe"
    111.    +0x184 JobLinks         : _LIST_ENTRY [ 0x0 - 0x0 ]
    112.    +0x18c LockedPagesList  : (null)
    113.    +0x190 ThreadListHead   : _LIST_ENTRY [ 0x81239694 - 0x81239694 ]
    114.    +0x198 SecurityPort     : (null)
    115.    +0x19c PaeTop           : (null)
    116.    +0x1a0 ActiveThreads    : 1
    117.    +0x1a4 GrantedAccess    : 0x1f0fff
    118.    +0x1a8 DefaultHardErrorProcessing : 0
    119.    +0x1ac LastThreadExitStatus : 0
    120.    +0x1b0 Peb              : 0x7ffdc000 _PEB
    121.    +0x1b4 PrefetchTrace    : _EX_FAST_REF
    122.    +0x1b8 ReadOperationCount : _LARGE_INTEGER 0x1
    123.    +0x1c0 WriteOperationCount : _LARGE_INTEGER 0x0
    124.    +0x1c8 OtherOperationCount : _LARGE_INTEGER 0x96
    125.    +0x1d0 ReadTransferCount : _LARGE_INTEGER 0x119a
    126.    +0x1d8 WriteTransferCount : _LARGE_INTEGER 0x0
    127.    +0x1e0 OtherTransferCount : _LARGE_INTEGER 0x21f2a
    128.    +0x1e8 CommitChargeLimit : 0
    129.    +0x1ec CommitChargePeak : 0xc2
    130.    +0x1f0 AweInfo          : (null)
    131.    +0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO
    132.    +0x1f8 Vm               : _MMSUPPORT
    133.    +0x238 LastFaultCount   : 0
    134.    +0x23c ModifiedPageCount : 0x2e
    135.    +0x240 NumberOfVads     : 0x24
    136.    +0x244 JobStatus        : 0
    137.    +0x248 Flags            : 0xd0803
    138.    +0x248 CreateReported   : 0y1
    139.    +0x248 NoDebugInherit   : 0y1
    140.    +0x248 ProcessExiting   : 0y0
    141.    +0x248 ProcessDelete    : 0y0
    142.    +0x248 Wow64SplitPages  : 0y0
    143.    +0x248 VmDeleted        : 0y0
    144.    +0x248 OutswapEnabled   : 0y0
    145.    +0x248 Outswapped       : 0y0
    146.    +0x248 ForkFailed       : 0y0
    147.    +0x248 HasPhysicalVad   : 0y0
    148.    +0x248 AddressSpaceInitialized : 0y10
    149.    +0x248 SetTimerResolution : 0y0
    150.    +0x248 BreakOnTermination : 0y0
    151.    +0x248 SessionCreationUnderway : 0y0
    152.    +0x248 WriteWatch       : 0y0
    153.    +0x248 ProcessInSession : 0y1
    154.    +0x248 OverrideAddressSpace : 0y0
    155.    +0x248 HasAddressSpace  : 0y1
    156.    +0x248 LaunchPrefetched : 0y1
    157.    +0x248 InjectInpageErrors : 0y0
    158.    +0x248 VmTopDown        : 0y0
    159.    +0x248 Unused3          : 0y0
    160.    +0x248 Unused4          : 0y0
    161.    +0x248 VdmAllowed       : 0y0
    162.    +0x248 Unused           : 0y00000 (0)
    163.    +0x248 Unused1          : 0y0
    164.    +0x248 Unused2          : 0y0
    165.    +0x24c ExitStatus       : 259
    166.    +0x250 NextPageColor    : 0xe0cf
    167.    +0x252 SubSystemMinorVersion : 0 ''
    168.    +0x253 SubSystemMajorVersion : 0x4 ''
    169.    +0x252 SubSystemVersion : 0x400
    170.    +0x254 PriorityClass    : 0x2 ''
    171.    +0x255 WorkingSetAcquiredUnsafe : 0 ''
    172.    +0x258 Cookie           : 0xc9a18434
    список виртуальных блоков процесса находится в структуре
    +0x11c VadRoot : 0x81286238
    но вот как по ней гулять?
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Мда, то куча, то VirtualAlloc, то msvcrt, то ядро... Похоже, что "горе от ума" :lol:
    Определись чего ты хочешь и задай конкретный вопрос, иначе на ум песенка Цоя лезет "Я не знаю каков процент..." :)
     
  5. wasmer

    wasmer New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2007
    Сообщения:
    104
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    может стоит посмотреть сорцы crt?
     
  7. wasmer

    wasmer New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2007
    Сообщения:
    104
    уже смотрел, хотя у меня они довольно старые - ещё vc98
    кстати если у кого нить есть новей скиньте если не трудно ivan3191@gmail.com
    но память как я уже выяснил выделяется в виртуалке, неясно только как следить за выделением виртуальной памяти операционной системой - вот к чему свёлся вопрос
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    wasmer
    Например, перехватом Nt/ZwAllocateVirtualMemory.
    Только не понятно, зачем тебе все это нужно. Тебе конкретное выделение нужно выловить или все подряд ради спортивного интереса ?
     
  9. wasmer

    wasmer New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2007
    Сообщения:
    104
    я хочу используя WinDbg следить за выделением памяти моему процессу
    если память выделяется в heap то проблем нет
    но вот в модуле msvcrt как я только что выяснил для выделения памяти вызывается функция VirtualAlloc, то есть выделяется виртуальная память
    и вот используя команды WinDbg я пока не знаю как следить за выделением виртуальной памяти, я пока могу это делать только ставя бряк на VirtualAlloc
     
  10. wasmer

    wasmer New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2007
    Сообщения:
    104
    кажется для этого используется команда !vad, вот что она выводит для адреса VadRoot моего процесса:

    lkd> !vad 81286238
    VAD level start end commit
    811f8b30 ( 1) 10 10 1 Private READWRITE
    811fd9d8 ( 2) 20 20 1 Private READWRITE
    ff8817e0 ( 3) 30 12f 26 Private READWRITE
    8121eec0 ( 4) 130 132 0 Mapped READONLY
    ffaf2870 ( 5) 140 23f 4 Private READWRITE
    81233648 ( 6) 240 24f 6 Private READWRITE
    812828c0 ( 7) 250 25f 0 Mapped READWRITE
    811c9110 ( 8) 260 275 0 Mapped READONLY
    ff959e20 ( 9) 280 2bc 0 Mapped READONLY
    ffaa5678 (10) 2c0 300 0 Mapped READONLY
    ff85e2d0 (11) 310 315 0 Mapped READONLY
    81284008 (12) 320 3e7 0 Mapped EXECUTE_READ
    81208380 (13) 3f0 3ff 3 Private READWRITE
    81286238 ( 0) 400 43a 55 Mapped Exe EXECUTE_WRITECOPY
    ff881388 ( 7) 440 542 0 Mapped READONLY
    8120fa88 ( 8) 550 84f 0 Mapped EXECUTE_READ
    8123d578 (10) 850 c4f 0 Private READWRITE
    811ca210 ( 9) 629c0 629c8 1 Mapped Exe EXECUTE_WRITECOPY
    ffab0588 ( 6) 71aa0 71aa7 1 Mapped Exe EXECUTE_WRITECOPY
    ffaeed58 ( 5) 71ab0 71ac6 2 Mapped Exe EXECUTE_WRITECOPY
    ff8fb060 ( 4) 71ad0 71ad8 1 Mapped Exe EXECUTE_WRITECOPY
    ff8564d0 ( 7) 74d90 74dfa 17 Mapped Exe EXECUTE_WRITECOPY
    812482f8 ( 6) 76390 763ac 1 Mapped Exe EXECUTE_WRITECOPY
    8128e800 ( 5) 77c10 77c67 7 Mapped Exe EXECUTE_WRITECOPY
    812cedb8 ( 3) 77d40 77dcf 2 Mapped Exe EXECUTE_WRITECOPY
    ffaed7e8 ( 5) 77dd0 77e6a 5 Mapped Exe EXECUTE_WRITECOPY
    812bba50 ( 6) 77e70 77f00 1 Mapped Exe EXECUTE_WRITECOPY
    81282800 ( 4) 77f10 77f55 1 Mapped Exe EXECUTE_WRITECOPY
    812c4dd8 ( 5) 77f60 77fd5 2 Mapped Exe EXECUTE_WRITECOPY
    8124c810 ( 2) 7c800 7c8f3 6 Mapped Exe EXECUTE_WRITECOPY
    811cee30 ( 1) 7c900 7c9af 5 Mapped Exe EXECUTE_WRITECOPY
    812866b8 ( 4) 7c9c0 7d1d3 30 Mapped Exe EXECUTE_WRITECOPY
    ff84a288 ( 3) 7f6f0 7f7ef 0 Mapped EXECUTE_READ
    8134e558 ( 2) 7ffb0 7ffd3 0 Mapped READONLY
    ff8dd9c0 ( 3) 7ffdc 7ffdc 1 Private READWRITE
    ff8892f8 ( 4) 7ffdf 7ffdf 1 Private READWRITE

    Total VADs: 36 average level: 6 maximum depth: 13

    жирным шрифтом я пометил адрес, который скорее всего соответствует памяти выделенной вызовом VirtualAlloc из модуля msvcrt
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    wasmer
    Так бы сразу и сказал ;)

    PS: И все равно не пойму какую ты цель преследуешь 1) какая тебе разница, где выделяется память в куче или в виртуале, 2) и так ясно, что большие блоки выделяются виртуалом (в твоем сл.64Мб) + адрес тебе известен - так зачем лезть в VAD ? Если просто карту распределения памяти посмотреть, тогда понятно, иначе не очень :)