Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2013, 11:41   #1
Tambel
 
Регистрация: 09.06.2013
Сообщений: 6
По умолчанию Чтение виртуальной памяти процесса

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

Код:
#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 буфер в который записывается прочитанная память всегда пуста.

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

Последний раз редактировалось Stilet; 23.11.2013 в 16:13.
Tambel вне форума Ответить с цитированием
Старый 23.11.2013, 13:16   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Все твои функции возвращают результат, говорящий о том нормально ли они отработали. Код результата потом получается функцией GetLastError()
Используй ее после каждой функции, и если ее результат не 0 ищи в MSDN описание ошибки по коду, который возвращается:
Код:
SetLastError(0);
    HANDLE handle;
    handle =    OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION,1,(DWORD)procID);
if(!handle) {выводим результат GetLasterror() и ждем реакции юзера.}
И так везде. Это для начала.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.11.2013, 14:04   #3
Tambel
 
Регистрация: 09.06.2013
Сообщений: 6
По умолчанию

Вроде сделал, ошибок не выдает, вот только все равно условие

if( inf.State==MEM_COMMIT)

всегда выполняется по разному.
Tambel вне форума Ответить с цитированием
Старый 23.11.2013, 16:15   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
всегда выполняется по разному.
Если я не ошибаюсь это состояние говорит о работе с файлом подкачки. Понятно что это не постоянное хранилище памяти.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.11.2013, 23:46   #5
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Убери & со второго параметра VirtualQueryEx, для начала )
Son Of Pain вне форума Ответить с цитированием
Старый 24.11.2013, 17:51   #6
Tambel
 
Регистрация: 09.06.2013
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Если я не ошибаюсь это состояние говорит о работе с файлом подкачки. Понятно что это не постоянное хранилище памяти.
Насколько я понял, это состояние страниц памяти с которым работает приложение, то есть то что как раз нам нужно.
Tambel вне форума Ответить с цитированием
Старый 24.11.2013, 17:52   #7
Tambel
 
Регистрация: 09.06.2013
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
Убери & со второго параметра VirtualQueryEx, для начала )
Да я тоже потом заметил, но исправить тут забыл=)
Tambel вне форума Ответить с цитированием
Старый 24.11.2013, 21:19   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Tambel Посмотреть сообщение
Вроде сделал, ошибок не выдает, вот только все равно условие

if( inf.State==MEM_COMMIT)

всегда выполняется по разному.
всмысле по разному?
там три типа значений может быть, вы проверяете на нужное вам, но не все же страницы размечены.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.11.2013, 06:49   #9
Tambel
 
Регистрация: 09.06.2013
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
всмысле по разному?
там три типа значений может быть, вы проверяете на нужное вам, но не все же страницы размечены.
я наверно плохо изъясняюсь, извините.
я имел в виду, что ели например поставить

Код:
if( inf.State==MEM_COMMIT)
{
      count++;
}
то при каждом новой запуске программы, значение count будет всегда разным, даже если в программу, чью память мы читаем, не вносились никакие изменения
Tambel вне форума Ответить с цитированием
Старый 25.11.2013, 12:58   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Tambel Посмотреть сообщение
я наверно плохо изъясняюсь, извините.
я имел в виду, что ели например поставить

Код:
if( inf.State==MEM_COMMIT)
{
      count++;
}
то при каждом новой запуске программы, значение count будет всегда разным, даже если в программу, чью память мы читаем, не вносились никакие изменения
причин может быть масса.
программа в работе то берет то отдает страницы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение памяти процесса Maincore Win Api 12 14.08.2012 22:34
Чтение значения из памяти запущенного процесса padsyukin Помощь студентам 2 09.03.2012 15:39
Запуск приложения с виртуальной памяти PVD Общие вопросы Delphi 1 03.09.2010 23:09
Чтение данных из памяти процесса (need help) lexastik Win Api 10 26.02.2009 20:50