Сейчас на форуме: localhost1, vsv1, asfa, tyns777 (+5 невидимых)

 eXeL@B —› Вопросы новичков —› Заморозка чужого процесса и работа с его памятью
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 1.6 (гость)
Активность: 0.030.01
Статус: Участник

Создано: 29 июня 2019 20:23
· Личное сообщение · #1

В чужой программе есть два .dll файла. Нужно как-то заморозить процесс и вырезать эти .dll файлы. Словно все это делается ручками в ProcessHacker'е. Как это можно сделать на C++? Никак не могу найти подходящей информации, видимо заходить надо издалека. Направьте меня пожалуйста. Заранее спасибо!)




Ранг: 90.1 (постоянный), 91thx
Активность: 0.290.56
Статус: Участник

Создано: 11 апреля 2020 20:22 · Поправил: Boostyq
· Личное сообщение · #2

hipp0gryph пишет:
подчеркивает и пишет

Попробуйте просто:
printf("0x%x\n", offset);
cout менее удобен, чем printf.
%x - беззнаковое число до 32 бит в hex, %llx - беззнаковое число 64-бит в hex, %zx - беззнаковое число 32/64-бит в hex (зависит от текущей архитектуры).
А вообще на вывод не налегайте, пользуйтесь отладчиком студии, на порядок быстрее.

-----
В облачке многоточия


| Сообщение посчитали полезным: hipp0gryph

Ранг: 1.6 (гость)
Активность: 0.030.01
Статус: Участник

Создано: 11 апреля 2020 20:38
· Личное сообщение · #3

Да, спасибо) Уже получилось!) Да и адреса я понял и осознал. Враг подкрался незаметно. Расчеты вне скобок - зло товарищи!!!) Не знаю, как не заметил отсутствие скобок раньше. Прошу меня простить за неопытность, сейчас наверное залью самый наглядный код за историю интернета на C++ и скрины по поиску значения через базовый адрес и оффсеты.

Добавлено спустя 11 минут


Итак, находим базовый адрес и оффсеты через CE. Как это делать, можно посмотреть в интернете. Способов много я делал с помощью автоматического pointer scan в CE. (самый простой способ, хоть теперь я и предпочитаю другой)
Потом у нас получается то, что на скрине выше. Оттуда я взял первый указатель с адресом 5D9DFA00, поставил галочку у hex рядом с поиском, в поле поиска забил этот указатель и нашел зелененький базовый адрес. Далее смотрим код и проводим по аналогии замену базового адреса и оффсетов. PROFIT!!!)
Code:
  1. #include <Windows.h>
  2. #include <TlHelp32.h>
  3. #include <string>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7. DWORD FindProcessId(string processName)
  8. {
  9.          PROCESSENTRY32 peInfo;
  10.          peInfo.dwSize = sizeof(peInfo);
  11.          HANDLE _hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
  12.          if (_hSnap == INVALID_HANDLE_VALUE)
  13.                  return 0;
  14.          Process32First(_hSnap, &peInfo);
  15.          if (!processName.compare(peInfo.szExeFile))
  16.          {
  17.                  CloseHandle(_hSnap);
  18.                  return peInfo.th32ProcessID;
  19.          }
  20.          while (Process32Next(_hSnap, &peInfo))
  21.          {
  22.                  if (!processName.compare(peInfo.szExeFile))
  23.                  {
  24.                         CloseHandle(_hSnap);
  25.                         return peInfo.th32ProcessID;
  26.                  }
  27.          }
  28.          CloseHandle(_hSnap);
  29.          return 0;
  30. }
  31.  
  32. int main() {
  33.          HANDLE _hProc = NULL;
  34.          DWORD _pID = NULL;
  35.          _pID = FindProcessId("Name.exe");
  36.          cout <<"Pid: " <<_pID << endl;
  37.          _hProc = OpenProcess(PROCESS_VM_READ, NULL, _pID);
  38.          DWORD base = 0x10070E98;
  39.          DWORD offset;
  40.          int num=0;
  41.          while (true) {
  42.                  ReadProcessMemory(_hProc, (PBYTE*)base, &offset, sizeof(int), 0);
  43.                  cout << hex << offset << endl;
  44.                  ReadProcessMemory(_hProc, (PBYTE*)(offset + 0xA0), &offset, sizeof(int), 0);
  45.                  cout << hex << offset << endl;
  46.                  ReadProcessMemory(_hProc, (PBYTE*)(offset + 0x10), &offset, sizeof(int), 0);
  47.                  cout << hex << offset << endl;
  48.                  ReadProcessMemory(_hProc, (PBYTE*)(offset + 0x24), &offset, sizeof(int), 0);
  49.                  cout << hex << offset << endl;
  50.                  ReadProcessMemory(_hProc, (PBYTE*)(offset + 0x0), &offset, sizeof(int), 0);
  51.                  cout << hex << offset << endl;
  52.                  ReadProcessMemory(_hProc, (PBYTE*)(offset + 0x28), &num, sizeof(int), 0);
  53.                  cout << dec <<num << endl;
  54.                  //Sleep(5000);
  55.                  system("pause");
  56.                  system("cls");
  57.          }
  58.          return 0;
  59. }


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


<< . 1 . 2 .
 eXeL@B —› Вопросы новичков —› Заморозка чужого процесса и работа с его памятью
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати