Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
1

Дамп динамической памяти (Heap)

14.05.2014, 09:35. Просмотров 3451. Ответов 24
Метки нет (Все метки)

Подскажите, как можно получить дамп пользовательского Heap. С помощью каких средств?
Heap создается в программе и надо получить его дамп. Heap я создал, а вот получить дамп не выходит.

Добавлено через 23 часа 8 минут
Если кто-нибудь знает подскажите, пожалуйста. Нужно получить дамп, а сделать это не выходит, поиск ничего не дал.

Добавлено через 15 часов 48 минут
Можно ли при помощи Toolhelp32ReadProcessMemory вывести дамп?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2014, 09:35
Ответы с готовыми решениями:

Оператор delete[]. Как исправить ошибку: Error HEAP CORRUPTED. Откуда утечка памяти?
Код функции: void SeeAllTimesAllProcs() { HANDLE SnapHNDL =...

Найти сигнатуру в динамической памяти
Доброго времени суток, есть код трейнера с поиском сигнатур, но проблема в том, что ищет сигнатуры...

Определение размера динамической памяти, используемой процессом
Доброго всем времени суток! В общем задача следующая... Я, с помощь функции CreateProcess() создаю...

Инспектор динамической памяти процессов
Здравствуйте! Помогите пожалуйста. Нужно сделать "Инспектор динамической памяти процессов". Может у...

24
Заблокирован
14.05.2014, 11:09 2
а вот по этому поводу моя же тема в этой ветке, там есть ответ Как получить дамп памяти программы, чтоб потом можно было его сохранить и проанализировать?
0
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
14.05.2014, 11:23  [ТС] 3
Спасибо, видел просто с минидампом не большие проблемы, выводит состояние регистров и не более, и пока пытаюсь решить, хотел поинтерисоватся есть ли другие способы
0
Заблокирован
14.05.2014, 11:28 4
Цитата Сообщение от DEMONICK Посмотреть сообщение
хотел поинтерисоватся есть ли другие способы
ну это к Убеждённому
0
Maniac
Эксперт С++
1446 / 948 / 158
Регистрация: 02.01.2009
Сообщений: 2,813
Записей в блоге: 1
14.05.2014, 17:08 5
Не совсем понял.. это нужно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream>
#include <Windows.h>
 
bool  DumpMemoryA(HANDLE hProcess, LPVOID MemoryStart, ULONG_PTR MemorySize, char* szDumpFileName);
 
int main() {
 
 
#ifdef _WIN64
    MEMORY_BASIC_INFORMATION64 info;
#else
    MEMORY_BASIC_INFORMATION32 info;
#endif
 
    VirtualQueryEx(GetCurrentProcess(), GetProcessHeap(), reinterpret_cast<PMEMORY_BASIC_INFORMATION>(&info), sizeof(info) );
 
    char buff[256];
 
    printf("[%016X - %016X]\n", info.BaseAddress, (info.BaseAddress + info.RegionSize));
    sprintf(buff, "%016X_%016X.dmp", info.BaseAddress, info.BaseAddress + info.RegionSize);
    DumpMemoryA(GetCurrentProcess(), reinterpret_cast<LPVOID>(info.BaseAddress), info.RegionSize, buff);
 
    return 0;
}
 
bool  DumpMemoryA(HANDLE hProcess, LPVOID MemoryStart, ULONG_PTR MemorySize, char* szDumpFileName)
{
 
    ULONG_PTR ueNumberOfBytesRead = 0;
    DWORD uedNumberOfBytesRead = 0;
    HANDLE hFile = 0;
    LPVOID ReadBase = MemoryStart;
    ULONG_PTR ProcReadBase = (ULONG_PTR)ReadBase;
    LPVOID ueCopyBuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
 
#ifdef _WIN64
    MEMORY_BASIC_INFORMATION64 MemInfo;
#else
    MEMORY_BASIC_INFORMATION32 MemInfo;
#endif
 
    hFile = CreateFileA(szDumpFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
 
    if( hFile != INVALID_HANDLE_VALUE )
    {
        while( MemorySize > NULL )
        {
            ReadBase = (LPVOID)ProcReadBase;
 
            RtlZeroMemory(ueCopyBuffer,0x1000);    
 
            if( MemorySize >= 0x1000 )
            { 
 
                if( !ReadProcessMemory(hProcess, ReadBase, ueCopyBuffer, 0x1000, &ueNumberOfBytesRead) )
                {
                    VirtualQueryEx(hProcess, ReadBase,  reinterpret_cast<PMEMORY_BASIC_INFORMATION>(&MemInfo), sizeof MemInfo);
                    VirtualProtectEx(hProcess, ReadBase, 0x1000, PAGE_EXECUTE_READWRITE, &MemInfo.Protect);
                    ReadProcessMemory(hProcess, ReadBase, ueCopyBuffer, 0x1000, &ueNumberOfBytesRead);
                    VirtualProtectEx(hProcess, ReadBase, 0x1000, MemInfo.Protect, &MemInfo.Protect);
                }
 
                WriteFile(hFile,ueCopyBuffer, 0x1000, &uedNumberOfBytesRead, NULL);
                MemorySize = MemorySize - 0x1000;
 
            }
            else
            {
                
                if( !ReadProcessMemory(hProcess, ReadBase, ueCopyBuffer, MemorySize, &ueNumberOfBytesRead) )
                {
                    VirtualQueryEx(hProcess, ReadBase,  reinterpret_cast<PMEMORY_BASIC_INFORMATION>(&MemInfo), sizeof MemInfo);
                    VirtualProtectEx(hProcess, ReadBase, 0x1000, PAGE_EXECUTE_READWRITE, &MemInfo.Protect);
                    ReadProcessMemory(hProcess, ReadBase, ueCopyBuffer, 0x1000, &ueNumberOfBytesRead);
                    VirtualProtectEx(hProcess, ReadBase, 0x1000, MemInfo.Protect, &MemInfo.Protect);
                }
 
                WriteFile(hFile, ueCopyBuffer, (DWORD)MemorySize, &uedNumberOfBytesRead, NULL);
                MemorySize = NULL;
            }
 
            ProcReadBase = (ULONG_PTR)ReadBase + 0x1000;
        }
 
        CloseHandle(hFile);
        VirtualFree(ueCopyBuffer, NULL, MEM_RELEASE);
 
        return true;
    }
    else
    {
        VirtualFree(ueCopyBuffer, NULL, MEM_RELEASE);
 
        return false;
    }
 
    return true;
}
0
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
14.05.2014, 17:42  [ТС] 6
Не совсем, MEMORY_BASIC_INFORMATION использует же только виртуальную память, которая выделяется через VirtualAlloc, а мне бы как-то вывести именно heap. Тоесть я создаю его HeaCreate, выделяю память HeapAlloc и надо чтобы в этом дампе была вот эта куча, под которую я выделил память
0
145 / 140 / 20
Регистрация: 23.01.2011
Сообщений: 289
14.05.2014, 18:16 7
Попробуй воспользоватся HeapWalk http://msdn.microsoft.com/en-u... s.85).aspx
0
Maniac
Эксперт С++
1446 / 948 / 158
Регистрация: 02.01.2009
Сообщений: 2,813
Записей в блоге: 1
14.05.2014, 18:21 8
Не совсем, MEMORY_BASIC_INFORMATION использует же только виртуальную память, которая выделяется через VirtualAlloc, а мне бы как-то вывести именно heap. Тоесть я создаю его HeaCreate, выделяю память HeapAlloc и надо чтобы в этом дампе была вот эта куча, под которую я выделил память
А где HeapCreate память берет? так или иначе выделит виртуальную память тем же VirtualAlloc (или ZwAllocateVirtualMemory)..
Дамп динамической памяти (Heap)
1
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
14.05.2014, 18:59  [ТС] 9
Celly, Пользовался, но это не дамп
ISergey, ну а вроде же MEMORY_BASIC_INFORMATION не видит страницы выделенной под heap
Я создал heap размером 1024 байта, но такого размера я не нашел в выводе
0
Миниатюры
Дамп динамической памяти (Heap)  
145 / 140 / 20
Регистрация: 23.01.2011
Сообщений: 289
14.05.2014, 19:07 10
Я создал heap размером 1024 байта, но такого размера я не нашел в выводе
Память выделяется постранично. Размер страницы 4096 байт.
Узнать размер страницы можно функцией GetSystemInfo
1
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
15.05.2014, 12:04  [ТС] 11
Мне нужно отобразить дамп такого вида, возможно ли это сделать?
0
Миниатюры
Дамп динамической памяти (Heap)  
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
16.05.2014, 10:16  [ТС] 12
Если это осуществимо то хоть примерно, какими функциями нужно воспользоватся?

Добавлено через 15 часов 25 минут
Помогите, пожалуйста, задача следующая: я ввожу адрес и с этого адреса выводится дамп. Такое возможно сделать?
0
Заблокирован
16.05.2014, 10:57 13
Цитата Сообщение от DEMONICK Посмотреть сообщение
я ввожу адрес и с этого адреса выводится дамп
ну вводишь адрес, а длину чтения памяти не забыл указать?
Используй ReadProcessMemory, указывай хэндл собственного процесса, указывай адрес и размер и читай чё хочешь, если конечно у тебя есть доступ к памяти процесса (PROCESS_VM_READ)
0
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
16.05.2014, 14:18  [ТС] 14
Читаю память собственного процесса по адресу выделенной памяти. Так?
C++
1
2
3
ReadProcessMemory(GetCurrentProcess(),pMemHeap,bufff,sizeof(bufff),NULL);
            
                SendDlgItemMessageA(hDlg,IDC_HEAP,LB_ADDSTRING,0,(LPARAM)bufff);
0
Заблокирован
16.05.2014, 14:21 15
Цитата Сообщение от DEMONICK Посмотреть сообщение
sizeof(bufff)
это вернёт ровно 4, т.к. ты узнаешь размер указателся
Цитата Сообщение от DEMONICK Посмотреть сообщение
Так?
ну вроде так, а что, не получается?
0
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
16.05.2014, 14:50  [ТС] 16
Буфер этот у меня объявлен как LPVOID bufff[256]
В него ничего больше не записывается, а ниже у меня обработчик кнопки которая освобождает выделеную память, и после того как читаю память мне почему то выводит сообщение что выделенная память освобождена хотя там и тут 2 разных буфера(код чуть позже приведу, если надо)
0
Заблокирован
16.05.2014, 15:59 17
код покажи

Добавлено через 1 час 1 минуту
Ладно, накатал тебе пример, в нём читаются из памяти процесса переменные, записанные туда в статике (в динами будет тоже самое, это просто что б тебе понятней было), хотя основные приёмы и функции тебе уже показал в 5-м посте ISergey, в том числе показал и то, что делать, если ReadProcessMemory не читает память, в общем вот - запускай, смотри и изучай. (когда будешь копировать в новый проект, не забудь отключить прекомпайл хедеры )

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <tchar.h>
#include <windows.h>
#include <iostream>
#include <vector>
#include <string>
 
int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << "-=Initial Data=-" << std::endl;
 
    const SIZE_T checkSize = 3; 
    int checkData[checkSize];
 
    for(int i = 0; i < checkSize; i++)
    {
        checkData[i] = i + 1;       
        std::cout << "checkData[" << i << "] = " << checkData[i] << std::endl;
    }
 
    std::cout << std::endl;
 
    LPVOID resultData = new LPVOID[checkSize * sizeof(int)];    
 
    HANDLE hCurrentProc = GetCurrentProcess();
    if(hCurrentProc)
    {
        std::cout << "-=Result Data=-" << std::endl;
        SIZE_T bytesRead;       
        BOOL retVal = ReadProcessMemory(hCurrentProc, checkData, resultData, checkSize * sizeof(int), &bytesRead);
        if(retVal && bytesRead == checkSize * sizeof(int))
        {
            int *resultInts = new int[checkSize];
            int *workPointer = resultInts;
            memcpy_s(resultInts, checkSize * sizeof(int), checkData, checkSize * sizeof(int));
            for(int i = 0; i < checkSize; i++)                      
                std::cout << "resultData[" << i << "] = " << *workPointer++ << std::endl;
            
            delete[] resultInts;
        }
    }
    else
        std::cout << "Memory read error!" << std::endl;
 
    delete[] resultData;
 
    system("pause");
    
    return 0;
}
0
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
16.05.2014, 20:37  [ТС] 18
Блин я все равно не очень понял, я считываю 20 байт, они считались, судя по тому что мне вывело 20 строк в листбоксе. Но строки пустые т.е мне вывело 20 пустых строк
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
case IDC_BUTTON1:
                    if (hCurProc)
                    {
                         VirtualQueryEx(hCurProc,pMemHeap,&memBasicInfo,sizeof(MEMORY_BASIC_INFORMATION));
                        pBuffer = new BYTE[20];
                        ReadProcessMemory(hCurProc,pMemHeap,pBuffer,20,&bytesRead);
                    }   
                    
                    if(bytesRead == 20)
        {
            for(int i = 0; i < 20; i++) 
            {
               SendDlgItemMessageA(hDlg, IDC_HEAP, LB_ADDSTRING, NULL, (LPARAM)pBuffer); 
            
             }
             }
0
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 53
17.05.2014, 00:13  [ТС] 19
Если сделать с начального адреса региона то вроде бы выводит, но выводит одно и тоже значение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
сase IDC_BUTTON1:
                    if (hCurProc)
                    {
                         VirtualQueryEx(hCurProc,pMemHeap,&memBasicInfo,sizeof(MEMORY_BASIC_INFORMATION));
                         pBuffer = new BYTE[memBasicInfo.RegionSize];
                         ReadProcessMemory(hCurProc,memBasicInfo.BaseAddress,pBuffer,memBasicInfo.RegionSize,&bytesRead);
                        
                    
                        if(bytesRead == si.dwPageSize)
        {
            for(int i = 0; i < 30; i++) 
            {
                sprintf (buff,"Буфер %lx\r\n",pBuffer);
               SendDlgItemMessageA(hDlg, IDC_HEAP, LB_ADDSTRING, NULL, (LPARAM)buff); 
            
             }
             }
                    }
0
Миниатюры
Дамп динамической памяти (Heap)  
Заблокирован
17.05.2014, 06:49 20
Я уже устал тут многим повторять, ты что, секретарша? Я даже ну беду вчитываться в твой код, тебе уже всё тут пояснили... Мне просто лень. Ты слыхал о таком понятие как минимальный вопрос на форуме? А о таком, который тут все используют активно в разделе С++ для начинающих - напиши код за меня ))) ?

Если ты такой не проницаемый и у тебя остались вопросы, ну тогда уж я не знаю - прикрепляй сюда проект в архиве - так и быть - гляну за тебя нубарь (хотя ник у меня такой же ) и ГЛАВНОЕ - не забудь указать, что конкретно тебя не устраивает или что у тебя не получается - твой проект посмотрю в понедельнеГ Г Г Г )))))) (а пока что - )
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2014, 06:49

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Распределение памяти под Stack и Heap
Подскажите пожалуйста, правильно ли я понимаю что при использовании функций malloc или calloc...

Должен ли общий объем графической памяти складываться из зарезервированной (фиксированной) памяти и динамической (DVMT)?
Здравствуйте. Скажите, должен ли общий объем графической памяти складываться из зарезервированной...

Хранение переменных в HEAP (устройство Stack и Heap)
Добрый день. Проблемы с устройством памяти стека и кучи: если я создаю объект vanya класса Person,...

Выделение памяти и ошибка Heap block at 00B515A0 modified at 00B515B9 past requested size of 11
Доброго времени суток! есть такой кусок кода: size_t read_lines(char ***lines) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.