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

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

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

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

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

Есть программа 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) могу ли я разместить переменную в нужную ячейку памяти. Например: int a...

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

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

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

Для доступа к процессу используй ReadProcessMemory
0
6 / 5 / 3
Регистрация: 05.05.2011
Сообщений: 38
07.12.2018, 08:38  [ТС]
Цитата Сообщение от Avaddon74 Посмотреть сообщение
Кстати, мне тоже стало интересно, по какому принципу работает ArtMoney?
Еще момент что ArtMoney вычитывает правильно только когда в выборе процесса
указываешь конкретный процесс...
0
18 / 18 / 2
Регистрация: 23.02.2012
Сообщений: 132
07.12.2018, 08:49
Вот именно. ArtMoney подключается к процессу приложения. Могу предположить, что как отладчик, что бы получить доступ к памяти процесса. К сожалению знания поверхностные. Более подробно не скажу.
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
07.12.2018, 08:56
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Для доступа к процессу используй ReadProcessMemory
т.е. я могу получить доступ к памяти другой программы через эту функцию?
0
18 / 18 / 2
Регистрация: 23.02.2012
Сообщений: 132
07.12.2018, 09:00
Зная идентификатор процесса - да.
0
6 / 5 / 3
Регистрация: 05.05.2011
Сообщений: 38
07.12.2018, 09:17  [ТС]
Цитата Сообщение от 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
Наверно. Не пробовал. Но судя по описанию он же уже все сделал. Подцепляй его код да пиши.
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
07.12.2018, 10:01
Роман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
Ему под линукс надо, а там совсем все по другому
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
07.12.2018, 10:27
Цитата Сообщение от 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  [ТС]
Avaddon74, спасибо!
Я просто понял что капал не в ту сторону, вообще цель межпроцессного взаимодействия,
нашел mmap - позволяет выполнять отображение файла в памяти и уже юзать
обычными read, write только быстрее.
В любом случае спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.12.2018, 16:36
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru