Advertisement
EgorS2000

Untitled

Nov 17th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.76 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*);                                          // функция получения ID процесса
  7.  
  8. void main(void)
  9. {
  10.     LPCTSTR pipename = "\\\\.\\pipe\\mynamedpipe";                  // имя канала
  11.     HANDLE hProcessB;                                               // дескриптор процесса B
  12.     LPVOID szAddress;                                               // адрес в памяти процесса B
  13.     DWORD cbWritten, cbRead, dBuf;                                  // буфферы (имеют промежуточное значение)
  14.     BOOL Success;                                                   // флаг успешного открытия/считывания/записи
  15.     DWORD szSize = sizeof(char) * MAXLENGTH;                        // размер вводимой строки
  16.     char *str = (char*)malloc(szSize);                              // сама строка
  17.     HANDLE hPipe = INVALID_HANDLE_VALUE;                            // дескриптор канала
  18.  
  19.     printf("Enter your string: ");
  20.     gets_s(str, MAXLENGTH - 1);
  21.  
  22.     printf("Opening ProcessB...");
  23.     hProcessB = OpenProcess(
  24.         PROCESS_ALL_ACCESS,                                         // устанавливает уровень доступа к объекту процесса
  25.         FALSE,                                                      // параметр дескриптора наследования
  26.         GetProcessID("ProcessB.exe"));                              // ID процесса (в данном случае - процесса B)
  27.     if (hProcessB == INVALID_HANDLE_VALUE) {
  28.         printf("Failure!\n");
  29.         system("pause");
  30.         return -1;
  31.     }
  32.  
  33.     printf("Success!\nAllocating memory for ProcessB...");
  34.     szAddress = VirtualAllocEx(
  35.         hProcessB,                                                  // дескриптор процесса (в данном случае - процесса B)
  36.         0,                                                          // система сама решает, где выделять память
  37.         szSize,                                                     // объём резервируемой памяти
  38.         MEM_RESERVE |                                               // память зарезервирована и освобождена
  39.         MEM_COMMIT,
  40.         PAGE_EXECUTE_READWRITE);                                    // атрибут защиты
  41.  
  42.     printf("Success!\nWriting your string in ProcessB memory...");
  43.     Success = WriteProcessMemory(
  44.         hProcessB,                                                  // дескриптор процесса (в данном случае - процесса B)
  45.         szAddress,                                                  // куда записывать
  46.         str,                                                        // что записывать
  47.         szSize,                                                     // объём записываемых данных
  48.         0);                                                         // указатель на переменную, которая получает число байтов, переданное в указанный процесс (игнорируется)
  49.     if (Success == FALSE) {
  50.         printf("Failure!\n");
  51.         system("pause");
  52.         return -1;
  53.     }
  54.  
  55.     printf("Success!\nConnecting to named pipe...");
  56.     while (hPipe == INVALID_HANDLE_VALUE) {
  57.         hPipe = CreateFile(
  58.             pipename,                                               // имя именованного канала
  59.             GENERIC_READ |                                          // требуем доступ к чтению и записи
  60.             GENERIC_WRITE,
  61.             0,                                                      // без совместного доступа
  62.             NULL,                                                   // без дескрипторов защиты
  63.             OPEN_EXISTING,                                          // открываем существующий канал
  64.             0,                                                      // атрибуты файла по умолчанию
  65.             NULL);                                                  // без дескриптора файла шаблона
  66.     }
  67.  
  68.     printf("Success!\nWriting memory address...");
  69.     dBuf = (DWORD)szAddress;
  70.     Success = WriteFile(
  71.         hPipe,                                                      // дескриптор канала
  72.         &dBuf,                                                      // данные для записи (в данном случае - адрес памяти в процессе B)
  73.         sizeof(dBuf),                                               // объём записываемых данных
  74.         &cbWritten,                                                 // количество записанных данных (не используем)
  75.         NULL);                                                      // асинхронный буфер (не используем)
  76.     if (Success == FALSE) {
  77.         printf("Failure!\n");
  78.         system("pause");
  79.         return -1;
  80.     }
  81.  
  82.     printf("Success!\nWaiting answer from ProcessB...");
  83.     Success = ReadFile(
  84.         hPipe,                                                      // имя именованного канала
  85.         &szAddress,                                                 // буфер для считывания
  86.         sizeof(szAddress),                                          // объём считываемых данных
  87.         &cbRead,                                                    // количество считанных данных (не используем)
  88.         NULL);                                                      // асинхронный буфер (не используем)
  89.     if (Success == FALSE) {
  90.         printf("Failure!\n");
  91.         system("pause");
  92.         return -1;
  93.     }
  94.  
  95.     printf("Success!\nReleasing ProcessB memory...");
  96.     Success = VirtualFreeEx(
  97.         hProcessB,
  98.         szAddress,
  99.         0,
  100.         MEM_RELEASE);
  101.     if (Success == FALSE) {
  102.         printf("Failure!\n");
  103.         system("pause");
  104.         return -1;
  105.     }
  106.  
  107.     printf("Success!\nClosing named pipe...");
  108.     Success = CloseHandle(hPipe);
  109.     if (Success == FALSE) {
  110.         printf("Failure!\n");
  111.         system("pause");
  112.         return -1;
  113.     }
  114.  
  115.     printf("Success!\nClosing ProcessB...");
  116.     Success = CloseHandle(hProcessB);
  117.     if (Success == FALSE) {
  118.         printf("Failure!!!\n");
  119.         system("pause");
  120.         return -1;
  121.     }
  122.  
  123.     printf("Success!\nProcessA was finished...\n");
  124.     system("pause");
  125.     //return 0;
  126. }
  127.  
  128. DWORD GetProcessID(char* process) {
  129.     PROCESSENTRY32 processEntry;
  130.     DWORD processID = 0;
  131.     HANDLE Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  132.  
  133.     if (Snapshot != INVALID_HANDLE_VALUE) {
  134.         processEntry.dwSize = sizeof(processEntry);
  135.         Process32First(Snapshot, &processEntry);
  136.  
  137.         do {
  138.             if (strcmp(processEntry.szExeFile, process) == 0) {
  139.                 processID = processEntry.th32ProcessID;
  140.                 break;
  141.             }
  142.         } while (Process32Next(Snapshot, &processEntry));
  143.  
  144.         CloseHandle(Snapshot);
  145.     }
  146.  
  147.     return processID;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement