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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2015, 09:51   #1
Кирилл Романов
Пользователь
 
Регистрация: 30.10.2013
Сообщений: 12
По умолчанию Оперативная память и WinAPI (поиск строки в памяти процесса)

Здравстуйте.
Работаю с оперативной памятью и WinApi. Пытаюсь найти строчку в памяти запущенного процесса.
Естественно не получается. Код скинул ниже.



Код:
#include <windows.h>
#include <iostream>
#include <psapi.h>//информация о памяти процесса
#include <fstream>//для вывода в документ адресов и значений по ним
using namespace std;
#pragma comment(lib, "psapi.lib")

//имя программы
#define PROGRAMM_NAME "jon@debian: ~"


//получить базовый адрес процесса
LPVOID GetBaseAddress(HANDLE hProc)
{
    //структура с информацией о процессе
    MODULEINFO miInfo;

    //получаем базовый адрес процесса
    if (GetModuleInformation(hProc, NULL, &miInfo, sizeof(miInfo)))
        return miInfo.EntryPoint;
    else
        return NULL;
}

//получить размер используемой памяти приложения(в байтах)
DWORD GetMemorySize(HANDLE hProc)
{
    //структура с информацией о процессе
    PROCESS_MEMORY_COUNTERS pmcInfo;

    //получаем информацию о процессе
    if (GetProcessMemoryInfo(hProc, &pmcInfo, sizeof(pmcInfo)))
        return (DWORD)pmcInfo.WorkingSetSize;
    else
        return 0;
}


void main()
{
    setlocale(LC_ALL, "Russian");//устанавливаем русский язык для вывода

    //ищем окно
    HWND hWnd = FindWindow(NULL, TEXT(PROGRAMM_NAME));
    if (!hWnd)
    {
        cout << "Программа не запущена.";
        return;
    }

    //получаем ID процесса
    DWORD dwPID;
    GetWindowThreadProcessId(hWnd, &dwPID);
    if (!dwPID)
    {
        cout << "Невозможно получить ID процесса.";
        return;
    }

    //получаем хэндл процесса
    HANDLE hProc;
    hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPID);
    if (!hProc)
    {
        cout << "Невозможно получить хэндл процесса.";
        return;
    }

    //получаем начальный адрес процесса
    LPVOID dwStart = GetBaseAddress(hProc);

    //получаем размер занимаемой памяти
    DWORD dwMemSize = GetMemorySize(hProc);
    if (!dwMemSize)
    {
        cout << "Невозможно получить размер памяти, занимаемой приложением.";
        return;
    }


    cout << "Программа: "                    << PROGRAMM_NAME        << "\n"        <<
            "Handle Window: "                << hWnd                    << "\n"        <<
            "ProcessId: "                    << dwPID                << "\n"        <<
            "Handle Process: "                << hProc                << "\n"        <<
            "Начальный адрес: "                << dwStart                << "\n"        <<
            "Размер занимаемой памяти: "    << (dwMemSize / 1024)    << " кБ\n"    <<
            "\n\n\n\n";

	const char * signature = "192.168.56.101";      // Последовательность которую будем искать
    size_t len_signature = strlen (signature); // Длина последовательности.
    DWORD start = (DWORD)dwStart;//счётчик для цикла
    SIZE_T lpRead = 0;

    while(start < ((DWORD)dwStart + dwMemSize))
     {
        MEMORY_BASIC_INFORMATION mbi;
        

        int sz = VirtualQueryEx(hProc, (void *)start, &mbi, sizeof(MEMORY_BASIC_INFORMATION));

        if(     (mbi.State == MEM_COMMIT)            //если регион в состоянии передачи памяти
                &&                                    //и
                (mbi.Protect != PAGE_READONLY)        //регион не только для чнения
                &&                                    //и
                (mbi.Protect != PAGE_EXECUTE_READ)    //регион не тролько с исполнением программного кода и чтением
                &&                                    //и
                (mbi.Protect != PAGE_GUARD)            //регион без сигнала доступа к странице
                &&                                    //и
                (mbi.Protect != PAGE_NOACCESS)        //регион не защищён доступом к нему
                )//то
        {
           
            if(mbi.RegionSize != lpRead)
            {
                BYTE* lpData = (BYTE*)malloc(mbi.RegionSize);//резервируем место для массива lpData, размером в регион
                
                if(ReadProcessMemory(hProc, (LPCVOID)start, lpData, mbi.RegionSize, &lpRead))
                {
                   cout << "Поиск в регионе размером " << mbi.RegionSize << " байт\n";//поиск строки в массиве
				
				      BYTE *p = lpData;
					  while((p = (BYTE*)memchr(p, signature[0], mbi.RegionSize - len_signature + 1 - (p - lpData))) != 0)
					  {
						 if ( 0 == memcmp(p+1, signature + 1, len_signature - 1))
						 {
							// найдено!!! в (p) адрес нашего буфера, где обнаружена последовательность.
							// соответственно адрес в приложении равен: Start + (p - lpData);
							 printf("%d\n",lpData);
						 }
						 ++p;
					  }

                }
            }
        }

        start += mbi.RegionSize;//переходим на следующий регион
    }

    cout << "\nГотово.";

    //закрываем хэндл процесса
    CloseHandle(hProc);
}

Последний раз редактировалось Stilet; 22.04.2015 в 09:56.
Кирилл Романов вне форума Ответить с цитированием
Старый 22.04.2015, 10:01   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

мб начать с того, что строки бывают разные, и соответственно, по разному расположены в памяти? полезно знать это и вот это. Язык значения не имеет, читайте о строках.
Человек_Борща вне форума Ответить с цитированием
Старый 22.04.2015, 11:02   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

А что именно не получается?

Это по вашему что?
mbi.Protect != PAGE_READONLY
Что такое битовые маски и как с ними работать?

memchr абсолютно лишнее, особой прибавки к скорости поиска это не даст.
При поиске убедитесь, что не выходите за пределы блока.

А ксати, вы уверены, что IP адрес там именно в виде строки?
waleri вне форума Ответить с цитированием
Старый 22.04.2015, 14:15   #4
Кирилл Романов
Пользователь
 
Регистрация: 30.10.2013
Сообщений: 12
Смущение

Уверен, что ip адрес именно в виде строки
Кирилл Романов вне форума Ответить с цитированием
Старый 22.04.2015, 14:17   #5
Кирилл Романов
Пользователь
 
Регистрация: 30.10.2013
Сообщений: 12
По умолчанию

Ошибок в компиляции нет
Кирилл Романов вне форума Ответить с цитированием
Старый 12.05.2015, 22:44   #6
Malriser
xor esp, esp
Форумчанин
 
Регистрация: 11.02.2014
Сообщений: 135
По умолчанию

Цитата:
Сообщение от Кирилл Романов Посмотреть сообщение
Ошибок в компиляции нет
OllyDbg в помощь. Вместо огромного количества if'в достаточно проверить на: PAGE_READWRITE | PAGE_EXECUTE_READWRITE

Это что?

Код:
jon@debian: ~
Вы Putty что-ли хотите парсить? Лучше ищите по имени процесса.

Просто в GetMemorySize из MODULEINFO.SizeOfImage берите размер модуля. А в GetBaseAddress из MODULEINFO.lpBaseOfDll !!!!!!!

Внимательно читай MSDN:

Цитата:
The load address of a module is the same as the HMODULE value. The information returned in the SizeOfImage and EntryPoint members comes from the module's Portable Executable (PE) header. The module entry point is the location called during process startup, thread startup, process shutdown, and thread shutdown. While this is not the address of the DllMain function, it should be close enough for most purposes.
Т.е ты получаешь не HMODULE модуля, а точку входа в PE файл!

Остальное не смотрел

P.S.

UPD: Удалил весь код по просьбе правоохранительных органов.

Последний раз редактировалось Malriser; 13.05.2015 в 22:15. Причина: Попросили правоохранительные органы
Malriser вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение памяти процесса (поиск адресов) xRamzeSx Общие вопросы Delphi 0 12.01.2014 13:10
Оперативная память Кабан89 Компьютерное железо 3 10.11.2012 23:03
Поиск в памяти процесса Mr_ViK Общие вопросы Delphi 5 27.08.2012 21:38
Поиск сигнатуры в памяти процесса Crystallon Общие вопросы Delphi 8 26.09.2011 23:01
Оперативная память elektroniks Компьютерное железо 4 20.02.2011 13:59