Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 15.05.2015
Сообщений: 7

Работа с памятью, для совсем новичков в этом деле

19.04.2019, 01:29. Показов 2924. Ответов 12

Студворк — интернет-сервис помощи студентам
Добрый день.

Стало интересно, разобраться как работать с памятью процессов, чтение, запись, поиск и так далее. Допустим запущен у меня калькулятор, в нем какое-то число, как мне его найти в памяти, как преобразовать в читабельные значения(выводя в консоль), основы типов для работы с памятью, хорошие темы про какие-то "побитовые" сдвиги и прочее. С чего начать, что прочитать, что освоить. Для меня это совсем темный лес...эти двоичные значения и прочее...всякие кракозябры типо 4D 5F EE 1E 4D. Хочу работать с памятью из C# через WinAPI. Если Вы уже знаете эту тему, то если не сложно, дайте примерный порядок изучения этого, что бы как можно было меньше пробелов в понимании.

Буду очень признателен, спасибо большое.

Добавлено через 10 минут
Допустим ,как работает ArtMoney. Он ищет эти значения, показывает их и так далее...хочу разобраться, как это все происходит, какой-нибудь пример, если у Вас есть(если возможно с объяснениями). Самому что-то похожее написать, что бы лучше понимать.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.04.2019, 01:29
Ответы с готовыми решениями:

Читаю книгу Страуструпа для новичков но мне одному она кажется трудной и не совсем понятной?
на протяжении всей книги он показывает код в виде ...<...>... почему просто бы не объяснить?в ООП Р.Лафоре и Б.Эккеля все норм по...

Новичок в этом деле
Расскажите что должен и обязан знать программист!а то я только первый год в универе изучаю языки программирования(C++,basic) ,но ничего...

Меню сайта!Я новичок в этом деле:(
Помогите,кому не сложно,в создании своеобразного меню Я тут нарисовала каряво,что хотелось бы...в общем,надо,чтоб это было 2хуровневое...

12
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
19.04.2019, 01:36
ArtMoney и подобный софт использует стандартные WinAPI типа ReadProcessMemory/WriteProcessMemory/VirtualQueryEx и т.д.
По ним куча инфы в интернете в т.ч. и тут на форуме.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
19.04.2019, 02:16
Цитата Сообщение от npqHqJKee Посмотреть сообщение
всякие кракозябры типо 4D 5F EE 1E 4D
Ну вот и начали бы с крякозяблов. Это не больно. Шеснадцетеричная система исчисления называется.
0
0 / 0 / 0
Регистрация: 15.05.2015
Сообщений: 7
19.04.2019, 12:48  [ТС]
Если бы сразу нашел, то вероятно не спрашивал бы тут. Хороших примеров, которые бы дали ответы на мои вопросы не нашел. Я прекрасно понимаю, что нужно будет работать с WinAPI, выше это писал. Я попросил хороших статей, книг, советов, примеров, а не посыла искать дальше Примерно понимаю, что нужно получить хэндл окна, по нему взять либо дескриптор процесса(возможно тут не прав. МНе же наверно еще надо будеть разобраться где искать в стеке или в куче....плаваю в этой теме, нет четкого понимания.) и вот тут начинается самое интересно - что я ищу, как искать, как преобразовать, как получить корректное значение.

Спасибо конечно за совет, продолжить искать, но это не совсем то, на что я надеялся. Я же не прошу готовую программу или прочее, прошу помочь с поиском материала, который даст понимание как с этим работать.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
19.04.2019, 15:40
Я не понимаю что вам мешает самостоятельно найти инфу. Тема популярная, материалов достаточно, их не сложно найти.
Такое впечатление, что вы как раз не хотите ничего изучать, а хотите чтобы вам подготовили и обочначили строчки которые надо прочитать в массе разрозненных материалов, чтобы достить решения такой специфической задачи.
Ну ок, ждите.
0
0 / 0 / 0
Регистрация: 15.05.2015
Сообщений: 7
19.04.2019, 16:04  [ТС]
Зачем мне строчки кода, в которых я не смогу разобраться. В том то и дело, что есть эти строчки кода, но описание к ним скудное, мне не копи паст нужен. Я хочу понять. То что Вам кажется вполне понятным, мне кажется вообще черной дырой, к которой я не знаю, как подступиться. Если Вы смогли с этим разобраться разве сложно было бы дать план в какой последовательности, что читать!? Допустим: 1)По своему опыту скажу что лучше начать с этого , тут рассказывается про это, как устроена память, что у каждого процесса своя область памяти и т.д 2) Посмотри вот на такие нюансы. и тд и тп, это отсечет дальнейшие вопросы в такой области.

ну раз у вас нет мыслей, как помочь, можно тогда и не писать "Иди ищи, полно инфы".


Вот одна из таких тем, которая вылезла при поиске:

Небезопасный код, многоуровневая адресация - каково их назначение

Базовые адреса ESI +18 и тд и тп....что это, откуда это все берется, где начало где конец, что прочитать? Где Вы нашли ответы на эти вопросы? Что бы получить какую-то целостную картину нужна последовательность. Из всего, что я читаю у меня только больше каши в голове скапливается, все накладывается друг на друга и понимания не прибавляется. Поэтому прошу помощи. С чего начать и куда двигаться.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
19.04.2019, 16:34
А все потому что вы думаете что можно без фундаментальных знаний подступиться к этой теме.
Уверен что совет начать с книги по ассемблеру вам не понравится.

Добавлено через 5 минут
И нет, мне не кажется конкретно эта тема вполне понятной. Просто имея фундаментальные знания (не из форумов, а из книг) я примерно могу прикинуть в какую сторону копать, чтобы решить эту задачу.
0
0 / 0 / 0
Регистрация: 15.05.2015
Сообщений: 7
19.04.2019, 18:16  [ТС]
Так вот я и прошу сказать мне что читать. Если совет начать с книги по ассемблеру, значит я начну с нее, подскажите какую. Я же к этому и писал, что мне нужны эти знания, что бы понимать что к чему. Есть тонны примеров, они все различаются, все наполнены определенными понятиями и прочими умными словами, которые я не понимаю. Переписывать каждый пример не дает конкретного понимания, что я делаю. Какой результат должен быть? А правильно ли? Этот пример не заработал, другой заработал, почему? А что я вообще делаю то? Зачем я использую VirtualQueryEx? Почему после этого я делаю ReadProcessMemory? Что за регион я получаю этим VirtualQueryEx? Очень много вопросов на которые есть ответы, но без фундамента они не понятны.

Добавлено через 6 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
      MEMORY_BASIC_INFORMATION mbi =  new MEMORY_BASIC_INFORMATION();
      Process prc = null;
      IntPtr baseAddress = IntPtr.Zero;
      Process[] processes = Process.GetProcesses();
 
      foreach(var process in processes){                
        if(process.MainWindowTitle.Contains("Калькулятор")){
          prc = Process.GetProcessById(process.Id);;
        }
      }
 
      if(prc != null){
        Console.WriteLine("Process: " + prc.MainWindowTitle);
        WinApi.VirtualQueryEx(prc.Handle, baseAddress, out mbi, (uint)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION)));
        byte[] buffer = new byte[(int) mbi.RegionSize];
        IntPtr countOfReadBytes;
 
        WinApi.ReadProcessMemory(
          prc.Handle,
          mbi.BaseAddress,
          buffer,
          (uint) buffer.Length,
          out countOfReadBytes);
 
        Console.WriteLine(buffer);
        Console.WriteLine(countOfReadBytes);
      }
Добавлено через 50 минут
Пока понимание есть такое:

У каждого процесса есть своя область памяти. Данные в памяти, которые мне потребуются начинаются с адреса 0x00010000(понимание адреса тоже очень расплывчатое, не совсем понимаю всю эту адресацию, это ,если я верно понимаю, номер байта, поправьте меня если не прав). У каждого процесса есть стек и есть куча. Зачем тогда VirtualQueryEx если можно просто считать память с определенного адреса через ReadProcessMemory (хендл_процесса, 0x0010000, буфер, размер, количество_считаных_байтов)......как узнать размер.......Все из-за нехватки базовых знаний

Добавлено через 7 минут
Так же не совсем понимаю зачем OpenProcess если процесс уже открыт
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
19.04.2019, 19:31
VirtualQueryEx получает адреса, размеры (и другую информацию, о которой написано в документации) всех страниц памяти процесса. Если вам известен адрес, то вполне логично что использовать VirtualQueryEx не нужно (ну разве что чтобы убедиться что адрес на самом деле попадает в одну из страниц памяти выбранного процесса).

OpenProcess получает Handle процесса, если он у вас уже есть то вполне логично что вызывать OpenProcess не нужно...
0
0 / 0 / 0
Регистрация: 15.05.2015
Сообщений: 7
19.04.2019, 21:25  [ТС]
Спасибо большое за развернутый ответ.

Вопрос: Вы сказали "все страницы памяти процесса". Если я верно понимаю, то процесс в памяти может занимать не все пространство подряд, и каждый кусочек памяти, который он занимает - это и есть страница?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
19.04.2019, 21:39
Цитата Сообщение от npqHqJKee Посмотреть сообщение
Если я верно понимаю, то процесс в памяти может занимать не все пространство подряд, и каждый кусочек памяти, который он занимает - это и есть страница?
Да. Есть прога, которая позволяет визуально показывает VMMap
И вот еще статейка с примерами C# How to Scan a Process' Memory
1
0 / 0 / 0
Регистрация: 15.05.2015
Сообщений: 7
19.04.2019, 22:07  [ТС]
Спасибо еще раз!
0
0 / 0 / 0
Регистрация: 15.05.2015
Сообщений: 7
20.04.2019, 01:38  [ТС]
Запустил данный код, разобрался с проблемой в разрядности системы, и в дамп вроде все попало, но видимо проблема с кодировкой....и вот тут я не совсем понимаю, что делать. Помогите пожалуйста, как это исправить.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
    static void Main(string[] args)
    {
      const int PROCESS_QUERY_INFORMATION = 0x0400;
      const int MEM_COMMIT = 0x00001000;
      const int PAGE_READWRITE = 0x04;
      const int PROCESS_WM_READ = 0x0010;
 
      MEMORY_BASIC_INFORMATION64 mbi = new MEMORY_BASIC_INFORMATION64();
      SYSTEM_INFO sys_info = new SYSTEM_INFO();
      WindowsAPI.GetSystemInfo(out sys_info);
 
      IntPtr proc_min_address = sys_info.minimumApplicationAddress;
      IntPtr proc_max_address = sys_info.maximumApplicationAddress;
 
      ulong proc_min_address_l = (ulong)proc_min_address;
      ulong proc_max_address_l = (ulong)proc_max_address;
 
      // Console.WriteLine("Hello World!");
      Process process = Process.GetProcessesByName("notepad")[0];
      IntPtr processHandle = process.Handle;
 
      // opening the process with desired access level
      // IntPtr processHandle = WindowsAPI.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_WM_READ, false, process.Id);
 
      StreamWriter sw = new StreamWriter("dump.txt");
 
      int bytesRead = 0;  // number of bytes read with ReadProcessMemory
 
      while (proc_min_address_l < proc_max_address_l)
      {
        // 28 = sizeof(MEMORY_BASIC_INFORMATION)
        WindowsAPI.VirtualQueryEx(processHandle, proc_min_address, out mbi, (uint)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION64)));
 
        // if this memory chunk is accessible
        if (mbi.Protect == PAGE_READWRITE && mbi.State == MEM_COMMIT)
        {
          byte[] buffer = new byte[mbi.RegionSize];
 
          // read everything in the buffer above
          WindowsAPI.ReadProcessMemory((int)processHandle, mbi.BaseAddress, buffer, mbi.RegionSize, ref bytesRead);
 
          // then output this in the file
          for (ulong i = 0; i < mbi.RegionSize; i++)
          {
            sw.WriteLine("0x{0} : {1}", mbi.BaseAddress + i.ToString("X"), (char)buffer[i]);
          }
        }
 
        // move to the next memory chunk
        proc_min_address_l += mbi.RegionSize;
        proc_min_address = new IntPtr((int)proc_min_address_l);
      }
 
      sw.Close();
      Console.WriteLine("END");
      Console.ReadLine();
    }
В приложении файл дампа, с удаленными пустыми полями, оставив там только символы.

Опять же я не прошу решения, прошу помощи с пониманием в какую сторону смотреть для решения проблемы.
Вложения
Тип файла: txt dump.txt (970 байт, 12 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.04.2019, 01:38
Помогаю со студенческими работами здесь

Зацените пожалуйста сайт:)))я новичек в этом деле.
Понакидайте пожалуйста советов, критики, укажите на ошибки, буду очень признательна! Я сама студентка, поэтому профессионально этим...

нужен совет. я в этом деле полный ноль))
Добрый всем день! Нужен совет по раскрутке сайта! что делать, что можно сделать? подскажите пожалуйста! что не так? Т.к. в этом деле мы...

работа с реестром не для новичков задача!
есть тема народ программа при запуске в реестре должна удалять строки в реестре , которые отвечают за рботу безопасного режима

Работа для новичков(очень нужен совет)
Всем привет! Почитал форум и понял, что люди здесь (по большей части) профи. У меня к вам ряд вопросов. 1)Сейчас стою перед выбором –...

Работает поисковик, но не так как нужно. В этом деле начинающий, очень тяжело разобраться. Буду благодарен всем
Здравствуйте! Такая, проблема: вроде написал поисковик, присоединил базу, ищет по параметрам, но выводит не так как мне нужно. Пример что...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru