Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/50: Рейтинг темы: голосов - 50, средняя оценка - 4.88
70 / 69 / 10
Регистрация: 14.06.2009
Сообщений: 310
Записей в блоге: 1
1

Чтение памяти процесса

16.09.2013, 00:13. Показов 10430. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, пытаюсь найти кое-что в памяти процесса.

Вариант 1.
Ищем нужную строку внутри исполняемого файла при помощи например IDA или чего другого, смотрим адрес нужной строки.
Полученный адрес минус начальный адрес = смещение относительно начала.

Теперь если сделать ReadProcessMemory на адрес загрузки исполняемого файла + смещение, то найдем нужную строку.

Вариант 2.
Исполняемый файл загружает библиотеку (.dll), и в этой библиотеке находится необходимая строка, которую нужно найти.

Вопрос: где в памяти ее искать, зная смещение адреса этой строки относительно адреса загрузки .dllки? Пробовал по аналогии с вариантом 1, с помощью GetModuleHandleA (DLL_NAME), искал адрес dll, сдвигал на смещение, и находил мусор Подскажите, что я делаю не так, спасибо)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.09.2013, 00:13
Ответы с готовыми решениями:

Проверка и чтение памяти процесса
Здравствуйте. Необходима помощь в решении одной проблемы. Имеется опр. игра. Для неё написан...

Чтение/запись памяти процесса
Какие есть способы чтения или записи в память процесса ? Я нашел только дефолтный...

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

Чтение памяти процесса. Динамические адреса
Здравствуйте! Пожалуйста помогите разобраться. Я научился читать память виртуального процесса, а...

6
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
16.09.2013, 01:29 2
1. Если файл не упакован/не зашифрован итп, проще всего искать в самом этом файле, а не в памяти.
2. Виртуальный адрес (VA) зависит не только от адреса загрузки модуля, но и от адреса смещения секции при загрузке (RVA). Проще всего использовать Hiew, который сделает все вычисления сам (http://www.hiew.ru), или иной редактор PE-файлов.

Или так, основываясь на данных из заголовка и используемой секции:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
DWORD VA2OFS(DWORD dwVA)
{
   int      iSectNum = 0;
   
   PIMAGE_SECTION_HEADER      pSect = GetSectionByVA(dwVA,iSectNum);
   
   if (!pSect)
   {
      return 0;
   }
 
   return dwVA - (_pNTHeader->OptionalHeader.ImageBase + pSect->VirtualAddress - pSect->PointerToRawData);
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
DWORD OFS2VA(DWORD dwOfs)
{
   int      iSectNum = 0;
   
   PIMAGE_SECTION_HEADER      pSect = GetSectionByOffset(dwOfs,iSectNum);
   
   if (!pSect)
   {
      return 0;
   }
 
   return _pNTHeader->OptionalHeader.ImageBase + pSect->VirtualAddress - pSect->PointerToRawData + dwOfs;
}
Если речь идет о текстовой строке, не короче 5 символов, можете попробовать просто поискать ее в выдаче простенького дампера из эташа.
Вложения
Тип файла: rar qt.rar (3.9 Кб, 37 просмотров)
0
70 / 69 / 10
Регистрация: 14.06.2009
Сообщений: 310
Записей в блоге: 1
16.09.2013, 05:53  [ТС] 3
У меня задача, не просто найти строку, а найти ее программным путем, чтобы подменить при загрузке приложения (использую DLL injection).

DWORD dwOfs = VA2OFS(Какой адрес отдавать сюда? Известное смещение?);
DWORD offset = OFS2VA(dwOfs);
Как дальше использовать offset? Или теперь offset это всяко адрес загрузки приложения?

Сейчас я читаю вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool ReadMemory(DWORD offset, LPVOID buffer){
    DWORD baseAddress=(DWORD)GetModuleHandleA(PROCESS_NAME);
    if (baseAddress == NULL){
        OutputDebugString("Base address not found");
        return 0;
    }
 
    memset(buffer, '\0', sizeof(buffer));
    baseAddress += offset;
    
    if (!ReadProcessMemory(GetCurrentProcess(),(LPVOID*)(baseAddress),buffer,sizeof(buffer),NULL))
    {
        char buff[250];
        char* result = "Error during ReadProcessMemory [%d]";
        sprintf_s(buff, result, GetLastError());
        OutputDebugString(buff);
        return 0;
    }
    return 1;
}
Для варианта 1 работает, для 2 - нет.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
16.09.2013, 06:31 4
VA - Virtual address, Ofs - смещение в файле.

Если задача - менять в памяти, работайте с виртуальными адресами.

DLL, в отличие от EXE, может быть ребазирована, адреса при этом будут перенастроены загрузчиком с учетом Relocation table.

Relocation (computing)

Посмотрите еще здесь:

Использование DLL в программе на Visual C++
Загрузчик PE-файлов
0
70 / 69 / 10
Регистрация: 14.06.2009
Сообщений: 310
Записей в блоге: 1
16.09.2013, 07:45  [ТС] 5
Ок, понял что VA2OFS и OFS2VA надо использовать для конвертирования Виртуального адреса в Смещение в файле и обратно.

Не могу разобраться как заставить GetSectionByOffset и _pNTHeader работать, надо что-то инклудить или тут посложнее будет? Подскажите
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
16.09.2013, 08:35 6
Структуры описаны здесь: ImageHlp Structures

А GetSection - это просто итератор: пробегает в цикле по всем секциям, пока не найдет подходящую.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PIMAGE_SECTION_HEADER GetSectionByOffset(DWORD dwOffset,int& iSectNum)
{        
   iSectNum = 0;
                        
   int      iCnt = GetMaxSectionNum() + 1;
 
   for (int ii = 0; ii < iCnt; ++ii)
   {
      PIMAGE_SECTION_HEADER      pSection = GetSection(ii);
 
      if ((pSection->PointerToRawData <= dwOffset) && (dwOffset < pSection->PointerToRawData + pSection->SizeOfRawData))
      {
         iSectNum = ii;
         return pSection;
      }
   }
 
   return NULL;
}
1
70 / 69 / 10
Регистрация: 14.06.2009
Сообщений: 310
Записей в блоге: 1
16.09.2013, 11:43  [ТС] 7
да, похоже с наскока барьер взять не удастся) придется мне почитать доки по PE формату, но всё равно спасибо )
0
16.09.2013, 11:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2013, 11:43
Помогаю со студенческими работами здесь

Чтение памяти процесса через загруженную в него dll
Доброе утро Подскажите решение проблемы При инжекте dll в процесс, надо чтобы эта dll прочитала...

О памяти процесса
Всем доброго времени суток. Подскажите, как узнать (и возможно ли вообще) границы памяти,...

Чтение stdout дочернего процесса
Задача: запустить консольную утилиту и отобразить процесс ее деятельности. Пример: pngout.exe...

Сканирование памяти процесса
Пытаюсь нашаманить что-то похожие на cheat engine, надо сделать поиск в памяти процесса найти все...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru