Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.19 KB | None | 0 0
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <TlHelp32.h>
  4.  
  5. #define MAXLENGTH 101
  6. DWORD GetProcessID(char*);                                          // GetProcessID получает идентификатор указанного процесса
  7.  
  8. void main(void)
  9. {
  10.     LPCTSTR Pipe_Name = "\\\\.\\pipe\\mynamedpipe";                 // Имя именнованого канала
  11.     HANDLE Handle_Process_B;                                        // Дескриптор процесса B
  12.     LPVOID B_Address;                                               // Адрес в памяти процесса B
  13.     DWORD Write, Read, Buffer;                                      // Буфферы
  14.     BOOL Success;                                                   // Флаг успешного открытия/считывания/записи
  15.     DWORD Str_Size = sizeof(char) * MAXLENGTH;                      // Размер вводимой строки
  16.     char* Str = (char*)malloc(Str_Size);                            // Вводимая строка
  17.     HANDLE Handle_Pipe = INVALID_HANDLE_VALUE;                      // Дескриптор канала
  18.  
  19.  
  20.  
  21.  
  22.     printf("Enter your string: ");
  23.     gets_s(Str, MAXLENGTH - 1);
  24.  
  25.  
  26.  
  27.  
  28.     /*ОТКРЫТИЕ ПРОЦЕССА B*/
  29.     printf("Opening ProcessB...");
  30.     Handle_Process_B = OpenProcess(
  31.         PROCESS_ALL_ACCESS,                                         // Устанавливает уровень доступа к объекту процесса
  32.         FALSE,                                                      // Параметр дескриптора наследования
  33.         GetProcessID("Lab_3_SP_B.exe"));                            // ID процесса (Lab_3_SP_B.exe)
  34.  
  35.     if (Handle_Process_B == INVALID_HANDLE_VALUE)
  36.     {
  37.         printf("ERROR!!!\n");
  38.         system("pause");
  39.         return -1;
  40.     }
  41.  
  42.  
  43.  
  44.  
  45.  
  46.     /*ВЫДЕЛЕНИЕ ПАМЯТИ ПРОЦЕССУ B*/
  47.     printf("Success!\nAllocating memory for ProcessB...");
  48.     B_Address = VirtualAllocEx(
  49.         Handle_Process_B,                                                   // Дескриптор процесса B
  50.         0,                                                                  // ОС решает, где выделять память
  51.         Str_Size,                                                           // Объём резервируемой памяти
  52.         MEM_RESERVE |                                                       // Память зарезервирована | освобождена
  53.         MEM_COMMIT,
  54.         PAGE_EXECUTE_READWRITE);                                            // атрибут защиты
  55.  
  56.  
  57.  
  58.  
  59.  
  60.     /*ЗАПИСЬ СТРОКИ В*/
  61.     printf("Success!\nWriting your string in ProcessB memory...");
  62.     Success = WriteProcessMemory(
  63.         Handle_Process_B,                                                   // Дескриптор процесса B
  64.         B_Address,                                                          // Откуда
  65.         Str,                                                                // Куда
  66.         Str_Size,                                                           // Размер строки
  67.         0);                                                                 // Указатель на переменную, которая получает число байтов, переданное в указанный процесс (игнорируется)
  68.     if (Success == FALSE) {
  69.         printf("ERROR!!!\n");
  70.         system("pause");
  71.         return -1;
  72.     }
  73.  
  74.  
  75.  
  76.  
  77.     /*ПОДКЛЮЧЕНИЕ К КАНАЛУ*/
  78.     printf("Success!\nConnecting to named pipe...");
  79.     while (Handle_Pipe == INVALID_HANDLE_VALUE) {
  80.         Handle_Pipe = CreateFile(
  81.             Pipe_Name,                                              // Имя именованного канала
  82.             GENERIC_READ |                                          // Доступ к чтению | записи
  83.             GENERIC_WRITE,
  84.             0,                                                      // Без совместного доступа
  85.             NULL,                                                   // Без дескрипторов защиты
  86.             OPEN_EXISTING,                                          // Открываем существующий канал
  87.             0,                                                      // Атрибуты файла по умолчанию
  88.             NULL);                                                  // Без дескриптора файла шаблона
  89.     }
  90.  
  91.  
  92.  
  93.  
  94.     printf("Success!\nWriting memory address...");
  95.     Buffer = (DWORD)B_Address;
  96.     Success = WriteFile(
  97.         Handle_Pipe,                                                        // Дескриптор канала
  98.         &Buffer,                                                            // Данные для записи (адрес памяти в процессе B)
  99.         sizeof(Buffer),                                                     // Объём записываемых данных
  100.         &Write,                                                             // Количество записанных данных (не используем)
  101.         NULL);                                                              // Асинхронный буфер (не используем)
  102.     if (Success == FALSE) {
  103.         printf("Failure!\n");
  104.         system("pause");
  105.         return -1;
  106.     }
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.     /*Ожидание ответа от процесса B*/
  117.     printf("Success!\nWaiting answer from ProcessB...");
  118.     Success = ReadFile(
  119.         Handle_Pipe,                                                        // Имя именованного канала
  120.         &B_Address,                                                         // Буфер для считывания
  121.         sizeof(B_Address),                                                  // Объём считываемых данных
  122.         &Read,                                                              // Количество считанных данных (не используем)
  123.         NULL);                                                              // Асинхронный буфер (не используем)
  124.     if (Success == FALSE) {
  125.         printf("Failure!\n");
  126.         system("pause");
  127.         return -1;
  128.     }
  129.  
  130.  
  131.  
  132.  
  133.  
  134.     /*Высвобождение памяти (процесс B)*/
  135.     printf("Success!\nReleasing ProcessB memory...");
  136.     Success = VirtualFreeEx(
  137.         Handle_Process_B,
  138.         B_Address,
  139.         0,
  140.         MEM_RELEASE);
  141.     if (Success == FALSE) {
  142.         printf("Failure!\n");
  143.         system("pause");
  144.         return -1;
  145.     }
  146.  
  147.  
  148.  
  149.  
  150.  
  151.     /*Закрытие канала*/
  152.     printf("Success!\nClosing named pipe...");
  153.     Success = CloseHandle(Handle_Pipe);
  154.     if (Success == FALSE) {
  155.         printf("ERROR!!!\n");
  156.         system("pause");
  157.         return -1;
  158.     }
  159.  
  160.  
  161.  
  162.  
  163.     /*Закрытие процесса B*/
  164.     printf("Success!\nClosing ProcessB...");
  165.     Success = CloseHandle(Handle_Process_B);
  166.     if (Success == FALSE) {
  167.         printf("ERROR!!!\n");
  168.         system("pause");
  169.         return -1;
  170.     }
  171.  
  172.     printf("Success!\nProcessA was finished...\n");
  173.     system("pause");
  174.  
  175. }
  176.  
  177. DWORD GetProcessID(char* process) {
  178.     PROCESSENTRY32 Process_Entry;
  179.     DWORD Process_ID = 0;
  180.     HANDLE Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  181.  
  182.     if (Snapshot != INVALID_HANDLE_VALUE) {
  183.         Process_Entry.dwSize = sizeof(Process_Entry);
  184.         Process32First(Snapshot, &Process_Entry);
  185.  
  186.         do
  187.         {
  188.             if (strcmp(Process_Entry.szExeFile, process) == 0)
  189.             {
  190.                 Process_ID = Process_Entry.th32ProcessID;
  191.                 break;
  192.             }
  193.         } while (Process32Next(Snapshot, &Process_Entry));
  194.  
  195.         CloseHandle(Snapshot);
  196.     }
  197.  
  198.     return Process_ID;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement