Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h>
- #include <stdio.h>
- #include <TlHelp32.h>
- #define MAXLENGTH 101
- DWORD GetProcessID(char*); // GetProcessID получает идентификатор указанного процесса
- void main(void)
- {
- LPCTSTR Pipe_Name = "\\\\.\\pipe\\mynamedpipe"; // Имя именнованого канала
- HANDLE Handle_Process_B; // Дескриптор процесса B
- LPVOID B_Address; // Адрес в памяти процесса B
- DWORD Write, Read, Buffer; // Буфферы
- BOOL Success; // Флаг успешного открытия/считывания/записи
- DWORD Str_Size = sizeof(char) * MAXLENGTH; // Размер вводимой строки
- char* Str = (char*)malloc(Str_Size); // Вводимая строка
- HANDLE Handle_Pipe = INVALID_HANDLE_VALUE; // Дескриптор канала
- printf("Enter your string: ");
- gets_s(Str, MAXLENGTH - 1);
- /*ОТКРЫТИЕ ПРОЦЕССА B*/
- printf("Opening ProcessB...");
- Handle_Process_B = OpenProcess(
- PROCESS_ALL_ACCESS, // Устанавливает уровень доступа к объекту процесса
- FALSE, // Параметр дескриптора наследования
- GetProcessID("Lab_3_SP_B.exe")); // ID процесса (Lab_3_SP_B.exe)
- if (Handle_Process_B == INVALID_HANDLE_VALUE)
- {
- printf("ERROR!!!\n");
- system("pause");
- return -1;
- }
- /*ВЫДЕЛЕНИЕ ПАМЯТИ ПРОЦЕССУ B*/
- printf("Success!\nAllocating memory for ProcessB...");
- B_Address = VirtualAllocEx(
- Handle_Process_B, // Дескриптор процесса B
- 0, // ОС решает, где выделять память
- Str_Size, // Объём резервируемой памяти
- MEM_RESERVE | // Память зарезервирована | освобождена
- MEM_COMMIT,
- PAGE_EXECUTE_READWRITE); // атрибут защиты
- /*ЗАПИСЬ СТРОКИ В*/
- printf("Success!\nWriting your string in ProcessB memory...");
- Success = WriteProcessMemory(
- Handle_Process_B, // Дескриптор процесса B
- B_Address, // Откуда
- Str, // Куда
- Str_Size, // Размер строки
- 0); // Указатель на переменную, которая получает число байтов, переданное в указанный процесс (игнорируется)
- if (Success == FALSE) {
- printf("ERROR!!!\n");
- system("pause");
- return -1;
- }
- /*ПОДКЛЮЧЕНИЕ К КАНАЛУ*/
- printf("Success!\nConnecting to named pipe...");
- while (Handle_Pipe == INVALID_HANDLE_VALUE) {
- Handle_Pipe = CreateFile(
- Pipe_Name, // Имя именованного канала
- GENERIC_READ | // Доступ к чтению | записи
- GENERIC_WRITE,
- 0, // Без совместного доступа
- NULL, // Без дескрипторов защиты
- OPEN_EXISTING, // Открываем существующий канал
- 0, // Атрибуты файла по умолчанию
- NULL); // Без дескриптора файла шаблона
- }
- printf("Success!\nWriting memory address...");
- Buffer = (DWORD)B_Address;
- Success = WriteFile(
- Handle_Pipe, // Дескриптор канала
- &Buffer, // Данные для записи (адрес памяти в процессе B)
- sizeof(Buffer), // Объём записываемых данных
- &Write, // Количество записанных данных (не используем)
- NULL); // Асинхронный буфер (не используем)
- if (Success == FALSE) {
- printf("Failure!\n");
- system("pause");
- return -1;
- }
- /*Ожидание ответа от процесса B*/
- printf("Success!\nWaiting answer from ProcessB...");
- Success = ReadFile(
- Handle_Pipe, // Имя именованного канала
- &B_Address, // Буфер для считывания
- sizeof(B_Address), // Объём считываемых данных
- &Read, // Количество считанных данных (не используем)
- NULL); // Асинхронный буфер (не используем)
- if (Success == FALSE) {
- printf("Failure!\n");
- system("pause");
- return -1;
- }
- /*Высвобождение памяти (процесс B)*/
- printf("Success!\nReleasing ProcessB memory...");
- Success = VirtualFreeEx(
- Handle_Process_B,
- B_Address,
- 0,
- MEM_RELEASE);
- if (Success == FALSE) {
- printf("Failure!\n");
- system("pause");
- return -1;
- }
- /*Закрытие канала*/
- printf("Success!\nClosing named pipe...");
- Success = CloseHandle(Handle_Pipe);
- if (Success == FALSE) {
- printf("ERROR!!!\n");
- system("pause");
- return -1;
- }
- /*Закрытие процесса B*/
- printf("Success!\nClosing ProcessB...");
- Success = CloseHandle(Handle_Process_B);
- if (Success == FALSE) {
- printf("ERROR!!!\n");
- system("pause");
- return -1;
- }
- printf("Success!\nProcessA was finished...\n");
- system("pause");
- }
- DWORD GetProcessID(char* process) {
- PROCESSENTRY32 Process_Entry;
- DWORD Process_ID = 0;
- HANDLE Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
- if (Snapshot != INVALID_HANDLE_VALUE) {
- Process_Entry.dwSize = sizeof(Process_Entry);
- Process32First(Snapshot, &Process_Entry);
- do
- {
- if (strcmp(Process_Entry.szExeFile, process) == 0)
- {
- Process_ID = Process_Entry.th32ProcessID;
- break;
- }
- } while (Process32Next(Snapshot, &Process_Entry));
- CloseHandle(Snapshot);
- }
- return Process_ID;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement