в 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?
Не знаю с какой кучей msvcrt работает, но в стандартной виндовой куче 1) Блоки размером более ~512К выделяются через VirtualAlloc, а в самой куче лишь ведется список таких блоков 2) Блоки меньшего размера выделяются в самой куче, но если не хватает дефолтного 1Мб, то выделяется новый сегмент кучи, не обязательно "примыкающий" к предыдущему сегменту
default heap моего процесса находится по адресу 140000, но сразу после выполнения функции VirtualAllocEx, которая возвращает в eax адрес 850000 - адрес выделенного блока виртуальной памяти - я этого адреса в дефолтовой куче не нахожу: Код (Text): 0:000> dt 140000 _HEAP ntdll!_HEAP +0x000 Entry : _HEAP_ENTRY +0x008 Signature : 0xeeffeeff +0x00c Flags : 0x50000062 +0x010 ForceFlags : 0x40000060 +0x014 VirtualMemoryThreshold : 0xfe00 +0x018 SegmentReserve : 0x100000 +0x01c SegmentCommit : 0x2000 +0x020 DeCommitFreeBlockThreshold : 0x200 +0x024 DeCommitTotalFreeThreshold : 0x2000 +0x028 TotalFreeSize : 0x28a +0x02c MaximumAllocationSize : 0x7ffdefff +0x030 ProcessHeapsListIndex : 1 +0x032 HeaderValidateLength : 0x608 +0x034 HeaderValidateCopy : (null) +0x038 NextAvailableTagIndex : 0 +0x03a MaximumTagIndex : 0 +0x03c TagEntries : (null) +0x040 UCRSegments : (null) +0x044 UnusedUnCommittedRanges : 0x00140598 _HEAP_UNCOMMMTTED_RANGE +0x048 AlignRound : 0x17 +0x04c AlignMask : 0xfffffff8 +0x050 VirtualAllocdBlocks : _LIST_ENTRY [ 0x140050 - 0x140050 ] +0x058 Segments : [64] 0x00140640 _HEAP_SEGMENT +0x158 u : __unnamed +0x168 u2 : __unnamed +0x16a AllocatorBackTraceIndex : 0 +0x16c NonDedicatedListLength : 1 +0x170 LargeBlocksIndex : (null) +0x174 PseudoTagEntries : (null) +0x178 FreeLists : [128] _LIST_ENTRY [ 0x142d18 - 0x142d18 ] +0x578 LockVariable : 0x00140608 _HEAP_LOCK +0x57c CommitRoutine : (null) +0x580 FrontEndHeap : 0x00140688 +0x584 FrontHeapLockCount : 0 +0x586 FrontEndHeapType : 0x1 '' +0x587 LastSegmentIndex : 0 '' 0:000> dt 140000+0x50 _LIST_ENTRY ntdll!_LIST_ENTRY [ 0x140050 - 0x140050 ] +0x000 Flink : 0x00140050 _LIST_ENTRY [ 0x140050 - 0x140050 ] +0x004 Blink : 0x00140050 _LIST_ENTRY [ 0x140050 - 0x140050 ] то есть список VirtualAllocdBlocks пуст пуст и список по адресу 3f0000+0x50 - для кучи msvcrt в структуре _PEB подобных списков нет есть ещё структура _EPROCESS, но она системная, поэтому запускаю новое окно WinDbg, выбираю file -> kernel debug -> local в командной строке kd пишу: lkd> !process 0 0 **** NT ACTIVE PROCESS DUMP **** ................................................... PROCESS 812a7558 SessionId: 0 Cid: 00e0 Peb: 7ffdc000 ParentCid: 04b0 DirBase: 075cf000 ObjectTable: 00000000 HandleCount: 0. Image: http_login9.exe PROCESS 8123fda0 SessionId: 0 Cid: 0108 Peb: 7ffdc000 ParentCid: 04b0 DirBase: 0fd9a000 ObjectTable: e2437ba8 HandleCount: 13. Image: http_login9.exe то есть для моего отлаживаемого процесса http_login9.exe две записи, выбираю вторую: lkd> dt 8123fda0 _EPROCESS ntdll!_EPROCESS +0x000 Pcb : _KPROCESS +0x06c ProcessLock : _EX_PUSH_LOCK +0x070 CreateTime : _LARGE_INTEGER 0x1c8c246`cc4229b0 +0x078 ExitTime : _LARGE_INTEGER 0x0 +0x080 RundownProtect : _EX_RUNDOWN_REF +0x084 UniqueProcessId : 0x00000108 +0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x812547e8 - 0x812a75e0 ] +0x090 QuotaUsage : [3] 0x5a0 +0x09c QuotaPeak : [3] 0x5a0 +0x0a8 CommitCharge : 0xc2 +0x0ac PeakVirtualSize : 0x1a3a000 +0x0b0 VirtualSize : 0x1a3a000 +0x0b4 SessionProcessLinks : _LIST_ENTRY [ 0x81254814 - 0xff84e0d4 ] +0x0bc DebugPort : 0x812cd2a8 +0x0c0 ExceptionPort : 0xe146d178 +0x0c4 ObjectTable : 0xe2437ba8 _HANDLE_TABLE +0x0c8 Token : _EX_FAST_REF +0x0cc WorkingSetLock : _FAST_MUTEX +0x0ec WorkingSetPage : 0x2005 +0x0f0 AddressCreationLock : _FAST_MUTEX +0x110 HyperSpaceLock : 0 +0x114 ForkInProgress : (null) +0x118 HardwareTrigger : 0 +0x11c VadRoot : 0x81286238 +0x120 VadHint : 0x812828c0 +0x124 CloneRoot : (null) +0x128 NumberOfPrivatePages : 0x37 +0x12c NumberOfLockedPages : 0 +0x130 Win32Process : 0xe2320b70 +0x134 Job : (null) +0x138 SectionObject : 0xe10358d0 +0x13c SectionBaseAddress : 0x00400000 +0x140 QuotaBlock : 0xffa938c8 _EPROCESS_QUOTA_BLOCK +0x144 WorkingSetWatch : (null) +0x148 Win32WindowStation : 0x000007e0 +0x14c InheritedFromUniqueProcessId : 0x000004b0 +0x150 LdtInformation : (null) +0x154 VadFreeHint : (null) +0x158 VdmObjects : (null) +0x15c DeviceMap : 0xe1626448 +0x160 PhysicalVadList : _LIST_ENTRY [ 0x8123ff00 - 0x8123ff00 ] +0x168 PageDirectoryPte : _HARDWARE_PTE_X86 +0x168 Filler : 0 +0x170 Session : 0xf97ad000 +0x174 ImageFileName : [16] "http_login9.exe" +0x184 JobLinks : _LIST_ENTRY [ 0x0 - 0x0 ] +0x18c LockedPagesList : (null) +0x190 ThreadListHead : _LIST_ENTRY [ 0x81239694 - 0x81239694 ] +0x198 SecurityPort : (null) +0x19c PaeTop : (null) +0x1a0 ActiveThreads : 1 +0x1a4 GrantedAccess : 0x1f0fff +0x1a8 DefaultHardErrorProcessing : 0 +0x1ac LastThreadExitStatus : 0 +0x1b0 Peb : 0x7ffdc000 _PEB +0x1b4 PrefetchTrace : _EX_FAST_REF +0x1b8 ReadOperationCount : _LARGE_INTEGER 0x1 +0x1c0 WriteOperationCount : _LARGE_INTEGER 0x0 +0x1c8 OtherOperationCount : _LARGE_INTEGER 0x96 +0x1d0 ReadTransferCount : _LARGE_INTEGER 0x119a +0x1d8 WriteTransferCount : _LARGE_INTEGER 0x0 +0x1e0 OtherTransferCount : _LARGE_INTEGER 0x21f2a +0x1e8 CommitChargeLimit : 0 +0x1ec CommitChargePeak : 0xc2 +0x1f0 AweInfo : (null) +0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO +0x1f8 Vm : _MMSUPPORT +0x238 LastFaultCount : 0 +0x23c ModifiedPageCount : 0x2e +0x240 NumberOfVads : 0x24 +0x244 JobStatus : 0 +0x248 Flags : 0xd0803 +0x248 CreateReported : 0y1 +0x248 NoDebugInherit : 0y1 +0x248 ProcessExiting : 0y0 +0x248 ProcessDelete : 0y0 +0x248 Wow64SplitPages : 0y0 +0x248 VmDeleted : 0y0 +0x248 OutswapEnabled : 0y0 +0x248 Outswapped : 0y0 +0x248 ForkFailed : 0y0 +0x248 HasPhysicalVad : 0y0 +0x248 AddressSpaceInitialized : 0y10 +0x248 SetTimerResolution : 0y0 +0x248 BreakOnTermination : 0y0 +0x248 SessionCreationUnderway : 0y0 +0x248 WriteWatch : 0y0 +0x248 ProcessInSession : 0y1 +0x248 OverrideAddressSpace : 0y0 +0x248 HasAddressSpace : 0y1 +0x248 LaunchPrefetched : 0y1 +0x248 InjectInpageErrors : 0y0 +0x248 VmTopDown : 0y0 +0x248 Unused3 : 0y0 +0x248 Unused4 : 0y0 +0x248 VdmAllowed : 0y0 +0x248 Unused : 0y00000 (0) +0x248 Unused1 : 0y0 +0x248 Unused2 : 0y0 +0x24c ExitStatus : 259 +0x250 NextPageColor : 0xe0cf +0x252 SubSystemMinorVersion : 0 '' +0x253 SubSystemMajorVersion : 0x4 '' +0x252 SubSystemVersion : 0x400 +0x254 PriorityClass : 0x2 '' +0x255 WorkingSetAcquiredUnsafe : 0 '' +0x258 Cookie : 0xc9a18434 список виртуальных блоков процесса находится в структуре +0x11c VadRoot : 0x81286238 но вот как по ней гулять?
Мда, то куча, то VirtualAlloc, то msvcrt, то ядро... Похоже, что "горе от ума" Определись чего ты хочешь и задай конкретный вопрос, иначе на ум песенка Цоя лезет "Я не знаю каков процент..."
уже смотрел, хотя у меня они довольно старые - ещё vc98 кстати если у кого нить есть новей скиньте если не трудно ivan3191@gmail.com но память как я уже выяснил выделяется в виртуалке, неясно только как следить за выделением виртуальной памяти операционной системой - вот к чему свёлся вопрос
wasmer Например, перехватом Nt/ZwAllocateVirtualMemory. Только не понятно, зачем тебе все это нужно. Тебе конкретное выделение нужно выловить или все подряд ради спортивного интереса ?
я хочу используя WinDbg следить за выделением памяти моему процессу если память выделяется в heap то проблем нет но вот в модуле msvcrt как я только что выяснил для выделения памяти вызывается функция VirtualAlloc, то есть выделяется виртуальная память и вот используя команды WinDbg я пока не знаю как следить за выделением виртуальной памяти, я пока могу это делать только ставя бряк на VirtualAlloc
кажется для этого используется команда !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
wasmer Так бы сразу и сказал PS: И все равно не пойму какую ты цель преследуешь 1) какая тебе разница, где выделяется память в куче или в виртуале, 2) и так ясно, что большие блоки выделяются виртуалом (в твоем сл.64Мб) + адрес тебе известен - так зачем лезть в VAD ? Если просто карту распределения памяти посмотреть, тогда понятно, иначе не очень