С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
6 / 5 / 3
Регистрация: 05.05.2011
Сообщений: 38
1

Вычитать переменную из динамической памяти

07.12.2018, 06:27. Показов 689. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Каким способом возможно взять указатель на переменную из запущенного
приложения для дальнейшего его использования?

Суть в следующем:

Есть программа 1, в которой выделяется динамическая область памяти
на переменную int

C++
1
2
3
4
5
6
7
8
9
10
11
12
void main ()
{
    int * pnt = new (int); //выделяем память
    *pnt = 234;
 
    ofstream out ("test.bin", ios_base::out|ios_base::binary|ios_base::trunc);// создаем файл бинарный
    out.write(reinterpret_cast<char*>(&pnt),sizeof(&pnt));//записываю в файл адрес выделенной памяти
    out.close();
 
    _getch(); //программу не закрываю, чтоб выделенная область осталась в памяти
 
}
Есть программа 2, в которой пытаюсь взять указатель на выделенную область памяти из первой программы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
{
    int * pnt;
 
    ifstream in ("test.bin", ios_base::in|ios_base::binary);// читаем созданный файл
    in.read(reinterpret_cast<char*>(&pnt),sizeof(&pnt));//читаю адрес переменной
    in.close();
 
    cout << *pnt;//вот здесь хочу посмотреть значение выделенной области
    *pnt=134;// или как то изменить ее
 
    _getch(); 
 
}
Адрес вроде бы вычитывает правильно, но почему то по этому адресу совсем другие данные
пробовал с помощью программки "ArtMoney" вижу по данному адресу мое значение.
Может есть какой-то другой способ? прошу помочь...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.12.2018, 06:27
Ответы с готовыми решениями:

Должен ли общий объем графической памяти складываться из зарезервированной (фиксированной) памяти и динамической (DVMT)?
Здравствуйте. Скажите, должен ли общий объем графической памяти складываться из зарезервированной...

Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти?
Добрый день. Не могу найти информацию по двум вопросам : 1) могу ли я разместить переменную в...

Нужно из базы MSSQLSERVER2000 вычитать поле типа Image в переменную типа Image
На C# из базы MSSQLSERVER2000 вычитать поле типа Image в переменную типа Image пишу так ...

Высвобождение динамической памяти
Нужна помощь, в проблеме высвобождения памяти, все делаю по стандартам С++, но постоянно выдает...

13
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
07.12.2018, 08:13 2
Кстати, мне тоже стало интересно, по какому принципу работает ArtMoney?
Цитата Сообщение от Роман2707 Посмотреть сообщение
Адрес вроде бы вычитывает правильно, но почему то по этому адресу совсем другие данные
У меня крашится, не дает получить доступ, до тех пор пока первую программу не подвешиваю на паузе
0
18 / 18 / 2
Регистрация: 23.02.2012
Сообщений: 132
07.12.2018, 08:21 3
На сколько я знаю, у каждого процесса свой участок памяти. И получить вот так просто доступ к ней не получиться. Там намного все сложнее.
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
07.12.2018, 08:38 4
Роман2707, Бред полный. После завершения программы её процесс завершается с освобождением всей памяти, что была ему выделена. то что в нём не вызывалось delete - вообще никакой роли не играет. Первая программа отработала и умерла. Там даже ExitProcess вызывается после мейна.

Это не говоря уже о том, что даже если первую программу поставить на паузу в конце, после записи файла, чтобы процесс не умирал, все адреса для неё будут в ином пространстве, чем то, которое доступно второй программе. То, что ты через файл передашь ей какой-то адрес, вообще ничего не даст.

Для доступа к процессу используй ReadProcessMemory
0
6 / 5 / 3
Регистрация: 05.05.2011
Сообщений: 38
07.12.2018, 08:38  [ТС] 5
Цитата Сообщение от Avaddon74 Посмотреть сообщение
Кстати, мне тоже стало интересно, по какому принципу работает ArtMoney?
Еще момент что ArtMoney вычитывает правильно только когда в выборе процесса
указываешь конкретный процесс...
0
18 / 18 / 2
Регистрация: 23.02.2012
Сообщений: 132
07.12.2018, 08:49 6
Вот именно. ArtMoney подключается к процессу приложения. Могу предположить, что как отладчик, что бы получить доступ к памяти процесса. К сожалению знания поверхностные. Более подробно не скажу.
0
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
07.12.2018, 08:56 7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Для доступа к процессу используй ReadProcessMemory
т.е. я могу получить доступ к памяти другой программы через эту функцию?
0
18 / 18 / 2
Регистрация: 23.02.2012
Сообщений: 132
07.12.2018, 09:00 8
Зная идентификатор процесса - да.
0
6 / 5 / 3
Регистрация: 05.05.2011
Сообщений: 38
07.12.2018, 09:17  [ТС] 9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
То, что ты через файл передашь ей какой-то адрес, вообще ничего не даст.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Для доступа к процессу используй ReadProcessMemory
Ок, спасибо, только мне для linux, но тут похоже посложнее ... https://guidedhacking.com/thre... lent.4483/
0
18 / 18 / 2
Регистрация: 23.02.2012
Сообщений: 132
07.12.2018, 09:24 10
Наверно. Не пробовал. Но судя по описанию он же уже все сделал. Подцепляй его код да пиши.
0
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
07.12.2018, 10:01 11
Роман2707, Лови, благодаря подсказки Kuzia domovenok и этому форуму , написал прогу на чтение переменной из другого процесса
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
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
#include <tchar.h>
#include <fstream>
 
int main() {
    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);
 
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
 
    if (Process32First(snapshot, &entry) == TRUE) {
        while (Process32Next(snapshot, &entry) == TRUE) {
            if (_wcsicmp(entry.szExeFile, TEXT("test234.exe")) == 0) {
                std::cout << "process handle = " << entry.th32ProcessID << std::endl;
 
                int * pnt;
                std::ifstream in("test.bin", std::ios_base::in | std::ios_base::binary);
                in.read((char*)&pnt, sizeof(&pnt));
                in.close();
                std::cout << "addr in memory: " << pnt << std::endl;
 
                int buffer = 0;
                SIZE_T size = sizeof(buffer);
                HANDLE hProcess = OpenProcess(PROCESS_VM_READ, FALSE, entry.th32ProcessID);
                if(!ReadProcessMemory(hProcess, (void*)pnt, (void*)&buffer, size, &size)) std::cout << "Can't read. error: " << GetLastError() << std::endl;
                else std::cout << "value: " << buffer << std::endl;
                
                CloseHandle(hProcess);
            }
        }
    }
 
    CloseHandle(snapshot);
    system("pause");
    return 0;
}
Вычитать переменную из динамической памяти
1
18 / 18 / 2
Регистрация: 23.02.2012
Сообщений: 132
07.12.2018, 10:02 12
Ему под линукс надо, а там совсем все по другому
0
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
07.12.2018, 10:27 13
Цитата Сообщение от Wurgengel Посмотреть сообщение
Ему под линукс надо
Упустил это. Ну я под линукс и не знаю

Добавлено через 3 минуты
А вот на запись, кому интересно:
C++
1
2
3
4
5
6
int buffer = 555;
SIZE_T size = sizeof(buffer);
HANDLE hProcess = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, entry.th32ProcessID);
if (!WriteProcessMemory(hProcess, (void*)pnt, (void*)&buffer, size, &size)) std::cout << "Can't write. error: " << GetLastError() << std::endl;
else std::cout << "Write complete " << buffer << std::endl;
CloseHandle(hProcess);
0
6 / 5 / 3
Регистрация: 05.05.2011
Сообщений: 38
07.12.2018, 16:36  [ТС] 14
Avaddon74, спасибо!
Я просто понял что капал не в ту сторону, вообще цель межпроцессного взаимодействия,
нашел mmap - позволяет выполнять отображение файла в памяти и уже юзать
обычными read, write только быстрее.
В любом случае спасибо.
0
07.12.2018, 16:36
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.12.2018, 16:36
Помогаю со студенческими работами здесь

Выделение динамической памяти C++
Всем доброго времени суток. Вот столкнулся с проблемой и пока что не приходит ничего интересного по...

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

Очистка динамической памяти.
О, гуру, помогите мне, несведущему! Не получается полностью освободить динамическую память. Гугль...

Удаление динамической памяти
Всем здрасьте. Имеется вот такая структура. struct ModelType { DWORD FVF;...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru