Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
6 / 6 / 2
Регистрация: 19.02.2013
Сообщений: 68

Работа с виртуальной памятью

20.05.2014, 15:56. Показов 8344. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Процесс A выделяет память в адресном пространстве процесса B
Процесс А записывает в выделенный блок памяти строку, введенную пользователем
Процесс B выводит строку на экран
Процесс А освобождает выделенную память

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
#include <iostream>
#include <Windows.h>
#include <conio.h>
using namespace std;
int main()
{
char lpszCommandLine[] = "E:\\Projects\\СП3.2\\Debug\\СП3.2.exe p1 p2 p3";
 
STARTUPINFO si;
PROCESS_INFORMATION piCom;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
 
CreateProcess(NULL, lpszCommandLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &piCom);
char input[100];
cin>>input;
HANDLE Process = OpenProcess(PROCESS_VM_OPERATION,true,piCom.dwProcessId);
VirtualAllocEx(Process,NULL,sizeof(input),MEM_COMMIT,NULL);
WriteProcessMemory(Process,NULL,input,sizeof(input),NULL);
 
CloseHandle(piCom.hThread);
CloseHandle(piCom.hProcess);
 
return 0;
}
Вопрос собственно в том как считать, то, что записал, в процессе B?
Пробывал через ReadProcessMemory(), не получилось =(

Добавлено через 10 часов 20 минут
Жаль пост нельзя редактировать =(
Вот код обоих процессов:
Адын
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <windows.h>
#include <conio.h>
#include <iostream>
#include <tchar.h>
 
using namespace std;
int main()
{
char lpszComLine[80]; // для командной строки
STARTUPINFO si;
PROCESS_INFORMATION pi;
HANDLE hWritePipe, hReadPipe, hInheritWritePipe;
// создаем анонимный канал
if(!CreatePipe(
&hReadPipe, // дескриптор для чтения
&hWritePipe, // дескриптор для записи
NULL, // атрибуты защиты по умолчанию,
// в этом случае дескрипторы
// hReadPipe и hWritePipe ненаследуемые
0)) // размер буфера по умолчанию
{
_cputs("Create pipe failed.\n");
_cputs("Press any key to finish.\n");
_getch();
return GetLastError();
}
// делаем наследуемый дубликат дескриптора hWritePipe
if(!DuplicateHandle(
GetCurrentProcess(), // дескриптор текущего процесса
hWritePipe, // исходный дескриптор канала
GetCurrentProcess(), // дескриптор текущего процесса
&hInheritWritePipe, // новый дескриптор канала
0, // этот параметр игнорируется
TRUE, // новый декскриптор наследуемый
DUPLICATE_SAME_ACCESS ))// доступ не изменяем
{
_cputs("Duplicate handle failed.\n");
_cputs("Press any key to finish.\n");
_getch();
return GetLastError();
}
// закрываем ненужный дескриптор
CloseHandle(hWritePipe);
// устанавливаем атрибуты нового процесса
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
// формируем командную строку
wsprintf(lpszComLine, "E:\\Projects\\СП3.2\\Debug\\СП3.2.exe %d %d", (int)hInheritWritePipe, (int)GetCurrentProcess());
// запускаем новый консольный процесс
if (!CreateProcess(
NULL, // имя процесса
lpszComLine, // командная строка
NULL, // атрибуты защиты процесса по умолчанию
NULL, // атрибуты защиты первичного потока по умолчанию
TRUE, // наследуемые дескрипторы текущего процесса
// наследуются новым процессом
CREATE_NEW_CONSOLE, // новая консоль
NULL, // используем среду окружения процесса предка
NULL, // текущий диск и каталог, как и в процессе предке
&si, // вид главного окна - по умолчанию
&pi // здесь будут дескрипторы и идентификаторы
// нового процесса и его первичного потока
))
{
_cputs("Create process failed.\n");
_cputs("Press any key to finish.\n");
_getch();
return GetLastError();
}
// закрываем дескрипторы нового процесса
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
// закрываем ненужный дескриптор канала
CloseHandle(hInheritWritePipe);
// читаем из анонимного канала
//for (int i = 0; i < 10; i++)
//{
//int nData;
LPVOID VirtualAdress;
//cout<<(wchar_t*)VirtualAdress<<endl;
DWORD dwBytesRead;
if (!ReadFile(
hReadPipe,
&VirtualAdress,
sizeof(VirtualAdress),
&dwBytesRead,
NULL))
{
_cputs("Read from the pipe failed.\n");
_cputs("Press any key to finish.\n");
_getch();
return GetLastError();
}
int out;
ReadProcessMemory(GetCurrentProcess(),&VirtualAdress,&out,sizeof(out),NULL);
printf("%d \n", out);
cout<<out<<endl;
cout<<(wchar_t*)VirtualAdress<<endl;
 
//_cprintf("The number %d is read from the pipe.\n", nData);
//}
// закрываем дескриптор канала
CloseHandle(hReadPipe);
_cputs("The process finished reading from the pipe.\n");
_cputs("Press any key to exit.\n");
_getch();
return 0;
}
Дыва
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
#include <windows.h>
#include <conio.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
HANDLE hWritePipe;
HANDLE Process;
LPVOID VirtualAdress;
int input;
// преобразуем символьное представление дескриптора в число
hWritePipe = (HANDLE)atoi(argv[1]);
Process = (HANDLE)atoi(argv[2]);
 
cin>>input;
VirtualAdress = VirtualAllocEx(Process,NULL,sizeof(input),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(Process,VirtualAdress,(LPVOID)input,sizeof(input),NULL);
 
// ждем команды о начале записи в анонимный канал
_cputs("Press any key to start communication.\n");
_getch();
// пишем в анонимный канал
//for (int i = 0; i < 10; i++)
//{
DWORD dwBytesWritten;
if (!WriteFile(
hWritePipe,
&VirtualAdress,
sizeof(VirtualAdress),
&dwBytesWritten,
NULL))
{
_cputs("Write to file failed.\n");
_cputs("Press any key to finish.\n");
_getch();
return GetLastError();
}
//_cprintf("The number %d is written to the pipe.\n", i);
Sleep(500);
//}
// закрываем дескриптор канала
CloseHandle(hWritePipe);
_cputs("The process finished writing to the pipe.\n");
_cputs("Press any key to exit.\n");
_getch();
return 0;
}
Для упрощения нахождения косяков вместо строки пытаюсь передать int, но всерано получить то что записал не получается =(
Помогите каким советом дельным.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.05.2014, 15:56
Ответы с готовыми решениями:

Прямая работа с памятью WinAPI
Выделяю блок памяти (10000 байт) и напрямую заполняю его значениями (123). Есть ли ошибки? Можно ли сделать проще? Можно ли написать...

Реализовать алгоритм работы планировщика. Управление виртуальной памятью. Управление файловой системой
Разработка программы менеджера памяти. Свопинг. Сегментная схема организации памяти. Управление виртуальной памятью. Глобальное и локальное...

Работа с оперативной памятью
Доброго дня. Есть интересная задача. Планируется создание чего-то типа сканера оперативной памяти. Необходимо сделать его работающим из под...

4
Заблокирован
20.05.2014, 20:57
все твои коды - это большая куча мусора, в которой никому не хочется копаться, если ты сумеешь сформулировать свой вопрос в нескольких строках кода - тогда тебе помогут, может даже я

Добавлено через 2 минуты
вот, посмотри мой пост тут, там показано, как читать память процесса
Дамп динамической памяти (Heap)
0
6 / 6 / 2
Регистрация: 19.02.2013
Сообщений: 68
21.05.2014, 15:15  [ТС]
Цитата Сообщение от newbie666 Посмотреть сообщение
если ты сумеешь сформулировать свой вопрос в нескольких строках кода - тогда тебе помогут, может даже я
Тогда так:
Запускаю из первого процесса (А) второй (B), в процессе В выделяю память в процессе А, и записываю в его циферку(для начала)
C++
1
2
VirtualAdress = VirtualAllocEx(Process,NULL,sizeof(input),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(Process,VirtualAdress,(LPVOID)input,sizeof(input),NULL);
После передаю указатель на память ViruallAdress через анонимный канал в процесс А
C++
1
2
DWORD dwBytesWritten;
if (!WriteFile(hWritePipe,&VirtualAdress,sizeof(VirtualAdress),&dwBytesWritten,NULL))
В процессе А собственно принимаю его:
C++
1
2
3
4
LPVOID VirtualAdress;
//cout<<(wchar_t*)VirtualAdress<<endl;
DWORD dwBytesRead;
if (!ReadFile(hReadPipe,&VirtualAdress,sizeof(VirtualAdress),&dwBytesRead,NULL))
И тут начинаются проблемы, по идее должно хватить обычного cout, но как ни пытался, введенной циферки не получал (выводилось или 00030000 - вывод без приведения, 196608 с приведением к int, и просто пустая строка если приводился к char. Кстати, через ReadPrpcessMemory тоже получал 0030000...)
Так достаточно точно сформулировано?
0
Заблокирован
21.05.2014, 21:26
архив с проектом прикрепляй
0
6 / 6 / 2
Регистрация: 19.02.2013
Сообщений: 68
21.05.2014, 22:51  [ТС]
Вот архивы
Вложения
Тип файла: rar СП3.1.rar (6.95 Мб, 53 просмотров)
Тип файла: rar СП3.2.rar (6.99 Мб, 39 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.05.2014, 22:51
Помогаю со студенческими работами здесь

Работа с виртуальной памятью
ОЧЕНЬ ИНТЕРЕСНЫЙ ВОПРОС! Разбирал &quot;азы&quot; виртуальной памяти Там была статья про: ...процесс замещения страниц который можно выполнить...

Управление виртуальной памятью
Подскажите пожалуйста источники информации или книги какие. Есть задание: выяснить отличия управления виртуальной памятью всех версий...

Что-то с виртуальной памятью
Кто подскажет от чего такое может быть: BCCode : 10000050 BCP1 : A1644D29 BCP2 : 00000000 BCP3 : F72C50A8 BCP4 : 00000000?...

Функции для работы с виртуальной памятью
Здравствуйте, помогите пожалуйста решить задачу: С помощью функций VirtualAlloc, VirtualQuery и VirtualFree вычислить значение функции ...

Преимущества Адресного пространства(виртуальной памяти) над физической памятью
Вечер добрый) Читаю Таненбаума, отвечаю на вопросы. Вопрос звучит так: &quot;В современных ОС адресное пространство процесса отделено от...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru