Форум программистов, компьютерный форум CyberForum.ru

VirtualQueryEx - дампим - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.76
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
22.03.2012, 17:19     VirtualQueryEx - дампим #1
Пытаюсь написать код для снятия дампа с регионов памяти процесса. Все вроде замечательно, но не получается реализовать переход от одного региона к другому...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
MEMORY_BASIC_INFORMATION    mbi;
    /* Get maximum address range from system info */
    SYSTEM_INFO si;
    GetSystemInfo(&si);
    /* walk process addresses */
                        LPVOID lpMem = 0;
                        LPCVOID hMod = 0;
                        DWORD lpList = 0;
    while (lpMem < si.lpMaximumApplicationAddress) {
            VirtualQueryEx(hProc, (LPCVOID)hMod, &mbi, sizeof(MEMORY_BASIC_INFORMATION));
 
            PBYTE pBuffer = new BYTE[mbi.RegionSize];
            ReadProcessMemory(hProc, mbi.BaseAddress, pBuffer, mbi.RegionSize, 0);
 
            /* increment lpMem to next region of memory */
            lpMem = (LPVOID)((DWORD)lpList->mbi.BaseAddress + (DWORD)lpList->mbi.RegionSize);
    }
Компилятор ругается на последнюю строку и говорит
1> type is 'DWORD'
1>c:\users\1\documents\visual studio 2010\projects\test\1.cpp(50): error C2228: left of '.BaseAddress' must have class/struct/union
1>c:\users\1\documents\visual studio 2010\projects\test\1.cpp(50): error C2227: left of '->mbi' must point to class/struct/union/generic type
1> type is 'DWORD'
1>c:\users\1\documents\visual studio 2010\projects\test\1.cpp(50): error C2228: left of '.RegionSize' must have class/struct/union
Подправьте плз!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2012, 17:19     VirtualQueryEx - дампим
Посмотрите здесь:

C++ WinAPI Функция VirtualQueryEx проблема с параметрами

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nxnx
Формучанин
361 / 292 / 16
Регистрация: 02.11.2010
Сообщений: 1,226
22.03.2012, 19:12     VirtualQueryEx - дампим #2
C++
1
lpMem = (LPVOID)((DWORD)mbi.BaseAddress + (DWORD)mbi.RegionSize);
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
23.03.2012, 11:17  [ТС]     VirtualQueryEx - дампим #3
Цикл работает хорошо. Стыдно, что сам не сделал... Но я что-то никак не соображу, как прочитанный регион скопировать в выделенную память и получить с него массив?
Тут код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
while (lpMem < si.lpMaximumApplicationAddress) {
 
  VirtualQueryEx(phandle, lpMem, &mbi, sizeof(MEMORY_BASIC_INFORMATION));   // Узнаем о текущем регионе памяти.
 
     if((mbi.Protect & PAGE_READWRITE) || (mbi.Protect & PAGE_WRITECOPY)){    
                                                
        LPVOID p = VirtualAlloc(NULL,mbi.RegionSize,MEM_RESERVE,PAGE_READWRITE); // Выделяем память 
 
        PBYTE pBuffer = new BYTE[mbi.RegionSize];        // Буфер под считываемый регион
 
        ReadProcessMemory(phandle, mbi.BaseAddress, pBuffer, mbi.RegionSize, 0); // Считываю весь найденный регион  
 
        memcpy (p, pBuffer, mbi.RegionSize);    // Вот тут я допускаю ошибку
 
        cerr << "Начальный адрес просматриваемого региона" << hex << mbi.BaseAddress << endl;
 
        cerr << "Aдрес выделенного региона" << hex << p << endl;
                                    
        }
 
    lpMem = (LPVOID)((DWORD)mbi.BaseAddress + (DWORD)mbi.RegionSize);
                            
}


Правильно я понимаю, что VirtualAlloc возвращает начальный адрес выделенной памяти? Если нет, то как его получить?
lpAddress - задает начальный адрес. При этом адрес округляется до ближайшей границы блока размером 64 Кбайт.
Но мне нужен точный начальный адрес выделенной памяти. Буду благодарен за подсказки.
nxnx
Формучанин
361 / 292 / 16
Регистрация: 02.11.2010
Сообщений: 1,226
23.03.2012, 11:30     VirtualQueryEx - дампим #4
Цитата Сообщение от Битл Посмотреть сообщение
Правильно я понимаю, что VirtualAlloc возвращает начальный адрес выделенной памяти? Если нет, то как его получить?
Правильно, но чтобы использовать память нужно флаги правильно использовать. например:
C++
1
VirtualAlloc(NULL,mbi.RegionSize,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
Цитата Сообщение от Битл Посмотреть сообщение
Но мне нужен точный начальный адрес выделенной памяти. Буду благодарен за подсказки.
не использовать начало памяти, а записывать данные с нужного момента.
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
23.03.2012, 16:18  [ТС]     VirtualQueryEx - дампим #5
Цитата Сообщение от nxnx Посмотреть сообщение
Правильно, но чтобы использовать память нужно флаги правильно использовать. например:
C++
1
VirtualAlloc(NULL,mbi.RegionSize,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
Т.е. в этом случае я получу начальный адрес выделенной памяти?

не использовать начало памяти, а записывать данные с нужного момента.
Не совсем понял.

Я не могу решить задачу копирования считанного региона в выделенную память.
C++
1
2
3
4
5
    LPVOID p = VirtualAlloc(NULL,mbi.RegionSize,MEM_RESERVE,PAGE_READWRITE); // Выделяем память 
  PBYTE pBuffer = new BYTE[mbi.RegionSize];          // Буфер под считываемый регион
  ReadProcessMemory(phandle, mbi.BaseAddress, pBuffer, mbi.RegionSize, 0); // Считываю весь найденный регион  
 
  memcpy (p, pBuffer, mbi.RegionSize);    // Вот тут я допускаю ошибку
Как правильно считать регион памяти чужого процесса и поместить в выделенную память. Желательно при этом получив массив байт? Я чета запутался... Первый раз с таким столкнулся...
Yandex
Объявления
23.03.2012, 16:18     VirtualQueryEx - дампим
Ответ Создать тему
Опции темы

Текущее время: 21:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru