Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение виртуальной памяти процесса 
:(
    Опции темы
tambel
Дата 23.11.2013, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 23.11.2013

Репутация: нет
Всего: нет



Здравствуйте, пишу программу читающую виртуальную память какого нибудь процесса
Прочитал кучу документаций, и примеров, однако что то не клеится. 

Код

#include <Windows.h>
#include <stdio.h>
int main()
{
 
    SIZE_T nb;
    BYTE buff[1000000];
    
    UINT adr=0x00000001;
    char errorStr[128];
    int error;
 
    HWND window=FindWindow("ConsoleWindowClass","file:///c:/users/артур/documents/visual studio 2010/Projects/ConsoleApplication1/ConsoleApplication1/bin/Debug/ConsoleApplication1.EXE");
    if (window==NULL)
    {
        sprintf(errorStr, "%d",GetLastError());

        MessageBoxA(NULL,errorStr,"FindWindow",MB_OK);
    }
    DWORD procID;
    GetWindowThreadProcessId(window,&procID);
    if (procID==NULL)
    {
        sprintf(errorStr, "%d",GetLastError());
    MessageBoxA(NULL,errorStr,"GetWindowThreadProcessId",MB_OK);
    }
    HANDLE handle;
    handle =    OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION,1,(DWORD)procID);
    if (handle==NULL)
    {
        sprintf(errorStr, "%d",GetLastError());
        MessageBoxA(NULL,errorStr,"OpenProcess",MB_OK);
    }
    MEMORY_BASIC_INFORMATION inf;
 
    while(adr<0xFFFFFFFF)
    {
        
        ZeroMemory(&buff,sizeof(buff));
        ZeroMemory(&inf,sizeof(inf));
        if(VirtualQueryEx(handle,&adr,&inf,sizeof(inf))==0)
        {
            sprintf(errorStr, "%d",GetLastError());
        MessageBoxA(NULL,errorStr,"VirtualQueryEx",MB_OK);
        }
 
        if(  inf.State==MEM_COMMIT)
        {
           if ( ReadProcessMemory(handle,inf.BaseAddress,&buff,inf.RegionSize,&nb)==0)
           {
               sprintf(errorStr, "%d",GetLastError());
             MessageBoxA(NULL,errorStr,"ReadProcessMemory",MB_OK);
           }

        }
        adr=adr+inf.RegionSize;
    
    }
}



Во первых временами за все время перебора блоков памяти не разу не обнаруживает, блок с

 inf.State==MEM_COMMIT

а после перезапуска уже может и обнаружить.
Во 2 буфер в который записывается прочитанная память всегда пуста.

Пожалуйста помогите. 

Это сообщение отредактировал(а) tambel - 23.11.2013, 13:08
PM MAIL   Вверх
feodorv
Дата 24.11.2013, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Вот это зачем:
Цитата(tambel @  23.11.2013,  12:08 Найти цитируемый пост)
    UINT adr=0x00000001;

Почему не 0? А если не 0, то тогда:
Цитата
lpAddress
Pointer to the base address of the region of pages to be queried. This value is rounded down to the next page boundary.



Цитата(tambel @  23.11.2013,  12:08 Найти цитируемый пост)
    BYTE buff[1000000];

Это вообще глупость, если ниже Вы не проверяете размер региона (он вполне может быть больше 1000000 байт).


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
DarthTon
Дата 25.11.2013, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: 5
Всего: 6



Код

SYSTEM_INFO sysInfo = { 0 };
MEMORY_BASIC_INFORMATION mbi = { 0 };
size_t bufsize = 1 * 1024 * 1024;      // 1 MB
uint8_t *buf = (uint8_t*)VirtualAlloc( 0, bufsize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE );

GetSystemInfo( &sysInfo );

for (void* memptr = sysInfo.lpMinimumApplicationAddress;
        memptr < sysInfo.lpMaximumApplicationAddress;
        memptr = (uint8_t*)mbi.BaseAddress + mbi.RegionSize)
{
    // Handle error if required
    if (VirtualQueryEx( handle, (size_t*)memptr, &mbi, sizeof(mbi) ) != sizeof(mbi))
        continue;

    // Filter regions
    if (mbi.State != MEM_COMMIT || mbi.Protect == PAGE_NOACCESS)
        continue;

    // Reallocate buffer
    if (mbi.RegionSize > bufsize)
    {
        bufsize = mbi.RegionSize;
        VirtualFree( buf, 0, MEM_RELEASE );
        buf = (uint8_t*)VirtualAlloc( 0, bufsize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE );
    }

    // Handle error if required
    if (ReadProcessMemory( handle, memptr, buf, mbi.RegionSize, NULL ) == FALSE)
        continue;
}

VirtualFree( buf, 0, MEM_RELEASE );

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0432 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.