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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2010, 07:21   #1
zotox
Форумчанин
 
Регистрация: 09.09.2008
Сообщений: 395
По умолчанию Поиск в памяти

Как найти в памяти где встречается dword определенного значения.
Мой код (но он почему то выводит совершенно не те адреса (сравниваю с результатами cheat engine, при просмотре памяти - те адреса которая моя программа нашла - там присутствуют нули)):
Код:
#include <windows.h>
#include <stdio.h>

int main()
{
	DWORD aaaa = 5652, value = 43910045;
	//aaaa - pid
	//value - значение которое ищем
	HANDLE process_h;
	process_h = OpenProcess(PROCESS_ALL_ACCESS, 0, aaaa);

	if (process_h != 0)
	{
		DWORD* addr;
		MEMORY_BASIC_INFORMATION mbi;
		addr = 0;

		while (VirtualQueryEx(process_h, addr, &mbi, sizeof(mbi)))
		{
			if ((mbi.State == MEM_COMMIT) && (mbi.Protect == PAGE_READWRITE))
			{
				DWORD bytesread;
				DWORD* buf = new DWORD[mbi.RegionSize];

				if (ReadProcessMemory(process_h, mbi.BaseAddress, buf, mbi.RegionSize, &bytesread))
				{
					//Ищу значение
					for (int i = 0; i < mbi.RegionSize; i++)
					{
						if (buf[i] == value)
						{
							printf("%08x\n", i + (int)mbi.BaseAddress);//Вывожу
						}
					}

				}

				delete[] buf;
			}

			addr += mbi.RegionSize;
		}
	}
	Sleep(100000);

	return 0;
}
zotox вне форума Ответить с цитированием
Старый 17.12.2010, 11:43   #2
SnX
Форумчанин
 
Регистрация: 30.10.2009
Сообщений: 114
По умолчанию

DWORD* buf = new DWORD[mbi.RegionSize]; -> char* buf;
память только не забудь выделить.

if (buf[i] == value) -> if ((DWORD)&buf[i] == value)

Последний раз редактировалось SnX; 17.12.2010 в 22:22.
SnX вне форума Ответить с цитированием
Старый 18.12.2010, 09:18   #3
zotox
Форумчанин
 
Регистрация: 09.09.2008
Сообщений: 395
По умолчанию

Цитата:
Сообщение от SnX Посмотреть сообщение
DWORD* buf = new DWORD[mbi.RegionSize]; -> char* buf;
память только не забудь выделить.

if (buf[i] == value) -> if ((DWORD)&buf[i] == value)
Спасибо за помощь.
Теперь следующая проблема:
Проблема заключается в том что OpenProcess не может нормально выполнится, в GetLastError -> 87 or 5. Почитал в интернете что нужны привилегии.
Я привилегии присоединил так (но ошибка (87 or 5) все равно остается):
Код:
#include <windows.h>
#include <stdio.h>

BOOL AdjustProcessPrivilege(HANDLE hProcess, char Privilege[32], BOOL bEnable) {
    HANDLE hToken;
    TOKEN_PRIVILEGES tkp;

    // получаем токен процесса

    if (!OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
        return FALSE; 

    // получаем LUID для указаной привилегии
    LookupPrivilegeValue(NULL, Privilege, &tkp.Privileges[0].Luid); 

    tkp.PrivilegeCount = 1;  //кол-во привилегий
    tkp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0; //значение привилегии

    // Установка указаной привилегии для процесса
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

    CloseHandle(hToken);

    return GetLastError() == ERROR_SUCCESS;
}

int main()
{
	DWORD aaaa = 2312, value = 43910045;
	HANDLE process_h;

	AdjustProcessPrivilege(GetCurrentProcess(), "SeDebugPrivilege", TRUE);//Возвращается true
	process_h = OpenProcess(PROCESS_ALL_ACCESS, 0, aaaa);

	if (process_h != 0)
	{
		DWORD* addr;
		MEMORY_BASIC_INFORMATION mbi;
		addr = 0;

		while (VirtualQueryEx(process_h, addr, &mbi, sizeof(mbi)))
		{
			//if ((mbi.State == MEM_COMMIT) && (mbi.Protect == PAGE_READWRITE))
			//if ((mbi.State == MEM_COMMIT) || !((mbi.Protect && PAGE_GUARD) == PAGE_GUARD))
			try
			{

			if ((mbi.State == MEM_COMMIT) && (mbi.Protect == PAGE_READWRITE))
			{
				DWORD bytesread;
				DWORD* buf = new DWORD[mbi.RegionSize];

				if (ReadProcessMemory(process_h, mbi.BaseAddress, buf, mbi.RegionSize, &bytesread))
				{

					for (int i = 0; i < mbi.RegionSize; i++)
					{
						if (buf[i] == value)
						{
							printf("%08x\n", i * 4 + (int)mbi.BaseAddress);
						}
					}

				}

				delete[] buf;
			}

			}
			catch (...)
			{

			}

			addr += mbi.RegionSize;
		}
	}
	aaaa = GetLastError();
	//aaaa++;
	printf("End");
	Sleep(9999999);

	return 0;
}
Функцию AdjustProcessPrivilege взял из интернета.
zotox вне форума Ответить с цитированием
Старый 18.12.2010, 12:23   #4
SnX
Форумчанин
 
Регистрация: 30.10.2009
Сообщений: 114
По умолчанию

Статей на подобную тему полно:
http://habrahabr.ru/blogs/cpp/93437/
http://www.chemax.ru/articles_r.php
SnX вне форума Ответить с цитированием
Старый 18.12.2010, 13:45   #5
zotox
Форумчанин
 
Регистрация: 09.09.2008
Сообщений: 395
По умолчанию

Цитата:
Сообщение от SnX Посмотреть сообщение
Статей на подобную тему полно:
http://habrahabr.ru/blogs/cpp/93437/
http://www.chemax.ru/articles_r.php
Смотрел я их, проблему они не решили.
zotox вне форума Ответить с цитированием
Старый 18.12.2010, 18:55   #6
SnX
Форумчанин
 
Регистрация: 30.10.2009
Сообщений: 114
По умолчанию

Цитата:
Смотрел я их, проблему они не решили.
Думаю стоит посмотреть еще раз.

RtlAdjustPrivilege пробовали?

GetLastError 87 = ERROR_INVALID_PARAMETER
SnX вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
(Asm) Поиск символьной цепочки в памяти Lawliet32 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 19.05.2012 13:20
(BC 3.1) Распределение памяти! Lawliet32 Помощь студентам 8 28.12.2009 23:49
Поддержка памяти в ХР uraura Windows 1 31.03.2009 10:46
Освобождение Памяти в Си volotsky Помощь студентам 2 16.12.2008 22:36
Очистка памяти Senator Общие вопросы Delphi 1 28.06.2008 19:39