eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 сентября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: dezmand07, zombi-vadim, mostafa4875 (+5 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

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

Ранг: 1.0 (гость)
Статус: Участник

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

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

Ранг: 29.6 (посетитель)
Статус: Участник

Создано: 29 июня 2019 21:29 New!
Цитата · Личное сообщение · #2

Не уверен, правильно ли я понял вопрос, но - "заморозить процесс" - см. WinApi SuspendThread (перечислить все потоки в процессе и приостановить).
Память - в книге Рихтера были примеры работы с памятью , как раз таки на плюсах (простая программа для просмотра памяти процесса, см. книгу Windows via C++) , вот еще есть статья , там дельфи, но суть таже http://alexander-bagel.blogspot.com/2013/11/pmm2.html

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



Ранг: 298.4 (наставник)
Статус: Участник

Создано: 29 июня 2019 21:47 · Поправил: DenCoder New!
Цитата · Личное сообщение · #3

Что значит вырезать? Если нужны dll-файлы, просто сдампить их. Если исключить из памяти процесса, то примерно так

Для 1го есть дамперы. Нужно на c++ написать? Обращайтесь в пм, поделюсь кодом.

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



Ранг: 659.5 (! !)
Статус: Участник
ALIEN Hack Team

Создано: 30 июня 2019 00:35 New!
Цитата · Личное сообщение · #4

NtSuspendProcess засаспендит весь процесс. Как Process Explorer из Sysinternals делает. С "вырезать" надо бы уточнить, это что значит?

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



Ранг: 302.4 (мудрец)
Статус: Участник

Создано: 30 июня 2019 00:36 · Поправил: difexacaw New!
Цитата · Личное сообщение · #5

Дампить нужно до инит. модулей, те до записи в них вне загрузчика.

В общем же никаких проблем не должно с этим возникать, разница между файловым образом и в памяти - секционное выравнивание.

Очень не обычно, если используется загрузка длл из памяти. Это делает исключительно малварь, при этом не плохая.

Добавлено спустя 33 минуты
ARCHANGEL

Заморозка потоков не приемлема для дампа. Это значит что модуль уже инициализирован и при перезапуске будет не рабочим.

Нужно отслеживать запись в модуль. Возможны два варианта, тс не достаточно инфы предоставил. Это загрузка из памяти или это файловая загрузка.

Скорее всего загрузка из памяти, так как файла нет. При этом так же вероятно что нет пе-хидера.

Если в случае с файловым образом его можно дампить до любой записи в него, те ядро замапило и пока загрузчик не поменял образ он сырой. То в случае с загрузкой из памяти всё сложнее. Нужно как минимум определить два события - окончание формирования образа и начало исполнения в нём, если первое событие скипнуто.

Нужно больше данных про загрузку.

Ранг: 1.0 (гость)
Статус: Участник

Создано: 30 июня 2019 17:23 New!
Цитата · Личное сообщение · #6

Ого!) Спасибо огромное за ответы!!!))) Там просто процесс подзагружает две dll'ки. И убить их можно как угодно. Это кривая защита игры, которая на каких-то пк работает, на каких-то нет. И чтобы от неё избавиться, достаточно просто из процесса их вырезать. Я никогда не занимался такими вещами, а тут стало интересно)))
difexacaw, спасибо за ответ! Как я понимаю, защита у игры ультра кривая и поэтому разрабы сделали так, что если в отношении защиты идут какие-то ошибки, то игра просто их проглатывает и забивает, поэтому убивать участки памяти которые заняты этой защитой можно целиком и все будет хорошо)) Мне демонстрировали это на примере Process Hacker 2. Просто вырезали два участка памяти занятые этими dll'ками и было все прекрасно!) Защита падала, игра работала.
ARCHANGEL, шикарно! Спасибо!) В отношении вырезать, нужно освободить участки памяти в процессе, которые постоянно занимают два этих файла.
DenCoder, спасибо!) Мне нужно исключить из памяти процесса, постараюсь разобраться, если ничего не получится постучусь!!))) Спасибо!)
morgot, Благодарю!) Попробую если не получится с NtSuspendProcess. Почитаю раздел с памятью)
Всем огромное спасибо, буду пробовать) Как что-то получится, отпишусь сюда с кодом)


Ранг: 302.4 (мудрец)
Статус: Участник

Создано: 30 июня 2019 20:44 New!
Цитата · Личное сообщение · #7

hipp0gryph

Как это вырезать ?
Туда будет передано управление, а если там кода нет, то дальше ошибка возникнет, которую обработать некому - код вырезан". В таком случае зачем вообще что то замораживать, это не на что не повлияет.

Ранг: 1.0 (гость)
Статус: Участник

Создано: 30 июня 2019 21:27 New!
Цитата · Личное сообщение · #8

difexacaw, я пытаюсь программно реализовать обход защиты, который мне показывали) Там просто заходили в Process Hacker 2, открывали процесс. Отображались различные модули, файлы и dll'ки подключенные к процессу. И отображались адреса с которых начинался каждый файл, модуль, dll. Суть обхода была заморозить процесс, выделить эти две dll там и просто убить их нажатием на Terminate. Как я понимаю, это просто вырезался кусок кода. Почему не было исключений? Потому что это защита и она очень кривая, вплоть до того, что может не работать прямо совсем. И что происходит с исключениями, я не знаю. Их просто нет. Может в других местах программы в отношении этих двух файлов идет обработка. Вообще хз) Я честно признаться не до конца понимаю как это вообще устроено. Но вот что имеем, собственно)


Ранг: 302.4 (мудрец)
Статус: Участник

Создано: 30 июня 2019 21:33 · Поправил: difexacaw New!
Цитата · Личное сообщение · #9

hipp0gryph

> убить их нажатием на Terminate.

Может поток завершить, который встал в области, а не убирать области из памяти ?

Тогда понятно зачем остановка.

Покажите семпл, если размер не особо большой.

Ранг: 1.0 (гость)
Статус: Участник

Создано: 30 июня 2019 21:56 New!
Цитата · Личное сообщение · #10



Добавлено спустя 7 минут
Code:
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <string.h>
  4. #include <Tlhelp32.h>
  5.  
  6. using namespace std;
  7.  
  8. typedef LONG(NTAPI *NtSuspendProcess)(IN HANDLE ProcessHandle);
  9. typedef LONG(NTAPI *NtResumeProcess)(IN HANDLE ProcessHandle);
  10.  
  11. void ProcessSuspend(DWORD PID)//остановка процесса
  12. {
  13.          HANDLE hProcess = OpenProcess(PROCESS_SUSPEND_RESUME, FALSE, PID);
  14.          if (!hProcess) {
  15.                  printf("Ошибка открытия процесса\n");
  16.                  return;
  17.          }
  18.          NtSuspendProcess _NtSuspendProcess = (NtSuspendProcess)GetProcAddress(GetModuleHandle("ntdll"), "NtSuspendProcess");
  19.          _NtSuspendProcess(hProcess);
  20.          CloseHandle(hProcess);
  21. }
  22.  
  23. void ProcessResume(DWORD PID)//вернуть процесс
  24. {
  25.          HANDLE hProcess = OpenProcess(PROCESS_SUSPEND_RESUME, FALSE, PID);
  26.          if (!hProcess) {
  27.                  printf("Ошибка открытия процесса\n");
  28.                  return;
  29.          }
  30.          NtResumeProcess _NtResumeProcess = (NtResumeProcess)GetProcAddress(GetModuleHandle("ntdll.dll"), "NtResumeProcess");
  31.          _NtResumeProcess(hProcess);
  32.          CloseHandle(hProcess);
  33. }
  34.  
  35. unsigned long PIDByName(string AProcessName, DWORD pid[])//определение PID
  36. {
  37.          HANDLE pHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  38.          PROCESSENTRY32 ProcessEntry;
  39.          unsigned long i = 0;
  40.          ProcessEntry.dwSize = sizeof(ProcessEntry);
  41.          bool Loop = Process32First(pHandle, &ProcessEntry);
  42.  
  43.          while (Loop)
  44.          {
  45.                  if (ProcessEntry.szExeFile == AProcessName)
  46.                  {
  47.                         pid[i] = ProcessEntry.th32ProcessID;
  48.                         i++;
  49.                  }
  50.                  Loop = Process32Next(pHandle, &ProcessEntry);
  51.          }
  52.          CloseHandle(pHandle);
  53.          return i;
  54. }
  55.  
  56. int main()
  57. {
  58.          setlocale(LC_ALL, "Rus");
  59.          DWORD pid[10];
  60.          unsigned long size;
  61.          size=PIDByName("Launch.exe", pid);
  62.          cout << "Количество окон: " << size << endl;
  63.          for (int i = 0; i < size; i++)
  64.          {
  65.                  cout << "ID окна " << i + 1 << ": " << pid[i] << endl;
  66.          }
  67.          cin >> size;
  68.          return 0;
  69. }


Ранг: 302.4 (мудрец)
Статус: Участник

Создано: 30 июня 2019 22:03 New!
Цитата · Личное сообщение · #11

hipp0gryph

Список потоков, стартовые их адреса. Что дальше, те зачем эта инфа ?

Ранг: 1.0 (гость)
Статус: Участник

Создано: 30 июня 2019 22:03 New!
Цитата · Личное сообщение · #12

такой код пока что получается, который может успешно морозить)

Добавлено спустя 1 минуту
mrac.dll там две штуки. вот эти два потока надо завершить и все.


Ранг: 302.4 (мудрец)
Статус: Участник

Создано: 30 июня 2019 22:13 New!
Цитата · Личное сообщение · #13

hipp0gryph

Тоесть уже память трогать не нужно, а завершать потоки в нужных модулях.. как быстро всё меняется, никакой хрустальный шар не успеет

Если в произвольный момент остановить поток, то скорее всего его адрес окажется в сервисе, точнее на адресе возврата в нэйтивный шлюз. Тогда вам нужно крутить цикл саспенд-ресум, до тех пор пока указатель не окажется в искомой области. По нормальному же это делается иначе - блокируется память от исполнения и в ловушке киляйте потоки. Ну или вообще прикончить треды, если у них прямые стартап адреса в целевые модуля.

Есть один важный нюанс. Если в произвольный момент прикончить тред, то это скорее всего приведёт к деадлоку, апп повиснет. Так как захваченные тредом ресурсы не будут освобождены.

Ранг: 1.0 (гость)
Статус: Участник

Создано: 30 июня 2019 22:26 · Поправил: hipp0gryph New!
Цитата · Личное сообщение · #14

difexacaw, ладно, поищу функции, попробую. Спасибо!)))

Добавлено спустя 55 минут
блин, не могу найти нигде как работать с чужими потоками(


Ранг: 659.5 (! !)
Статус: Участник
ALIEN Hack Team

Создано: 30 июня 2019 23:23 New!
Цитата · Личное сообщение · #15

hipp0gryph

Вам нужно:
1. Остановить процесс.
2. Перечислить все потоки и найти для них Win32StartAddress.
3. Перечислить все динамические библиотеки и найти среди них ImageBase и ImageSize для mrac.dll.
4. Для всех потоков, Win32StartAddress которых попадает в диапазон ImageBase <= x <= ImageBase + ImageSize, сделать TerminateThread.
5. Возобновить работу процесса.

Как искать Win32StartAddress: --> StackOverflow <--
По остальному - либо советовали выше, либо всё тривиально.


Ранг: 302.4 (мудрец)
Статус: Участник

Создано: 30 июня 2019 23:28 · Поправил: difexacaw New!
Цитата · Личное сообщение · #16

ARCHANGEL

> 4. Для всех потоков, Win32StartAddress которых попадает в диапазон ImageBase <= x <= ImageBase + ImageSize, сделать TerminateThread.

Не корректное решение. Это повесит апп.

Необходимо обождать когда поток выйдет на синхро-безопасное место(иначе другой поток войдёт в бесконечный цикл ожидания глобального синхро ресурса). Это не простая задача, в простейшем случае чем меньше число стековых фреймов, тем меньше вероятность блокировки. Проще блокировать потоки до их запуска.

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


Ранг: 1.0 (гость)
Статус: Участник

Создано: 1 июля 2019 01:43 New!
Цитата · Личное сообщение · #17

Попытался искать эти модули внутри процесса, но не получается сделать снапшот и из-за этого ничего не выводится. В чем может быть проблема?
Code:
  1. void GetModuleListByPID(DWORD pid)
  2. {
  3.          HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
  4.          if (snapshot != INVALID_HANDLE_VALUE) 
  5.          {
  6.                  MODULEENTRY32 module;
  7.                  module.dwSize = sizeof(MODULEENTRY32);
  8.                  Module32First(snapshot, &module);
  9.  
  10.                  do {
  11.                         cout <<"Базовый адрес: " <<module.modBaseAddr<<"Имя: "<<module.szExePath;
  12.                  } while (Module32Next(snapshot, &module));
  13.          }
  14.  
  15.          CloseHandle(snapshot);
  16. }


Ранг: 659.5 (! !)
Статус: Участник
ALIEN Hack Team

Создано: 1 июля 2019 14:47 New!
Цитата · Личное сообщение · #18

hipp0gryph
Дебаг привилегии нужно получить. А так, чтобы не гадать, выводите хотя бы код ошибки через GetLastError().

difexacaw
Вы не читаете тред, что ли. Эти потоки защиты, вероятно, ни на каких ресурсах игры не завязаны и вообще стейтлесс. В худшем случае немного ресурсов утечёт (которые юзала сама защита), но это - небольшая цена за снятие защиты. Плюс защита, если бы работала, сама бы их юзала с некоей пользой, а так они просто будут висеть без дела.

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


Ранг: 160.9 (ветеран)
Статус: Участник

Создано: 1 июля 2019 15:31 · Поправил: Cigan New!
Цитата · Личное сообщение · #19

hipp0gryph
Ну так может для тебя будет проще лоадер написать с длл, которая будет перехватывать loadlibrary и не давать грузить эту длл как таковую?

Ранг: 1.0 (гость)
Статус: Участник

Создано: 1 июля 2019 18:20 New!
Цитата · Личное сообщение · #20

Cigan, хотел защитить этот обход от распространения. Боюсь инжект dll не очень надежно, и обход заберут себе в копилку.
ARCHANGEL, 6: Неверный дескриптор.

Ранг: 29.6 (посетитель)
Статус: Участник

Создано: 1 июля 2019 19:13 New!
Цитата · Личное сообщение · #21

hipp0gryph
CreateToolhelp32Snapshot возвращает неверный дескриптор (0xff..), или getlasterror?
Просто у меня ваш код работает.
Разрядность совпадает (т.е. обе программы 32 или 64 битные)?


Ранг: 302.4 (мудрец)
Статус: Участник

Создано: 1 июля 2019 19:26 New!
Цитата · Личное сообщение · #22

По идеи не может быть ERROR_INVALID_HANDLE. Если процесс не откроется, будет ACCESS_DENIED. Иначе если не верный PID, должно вернуть INVALID_PARAMETER, так как PID это не описатель.

Ранг: 29.6 (посетитель)
Статус: Участник

Создано: 1 июля 2019 19:59 New!
Цитата · Личное сообщение · #23

difexacaw
да, я перепутал с INVALID_HANDLE_VALUE. В любом случае, код выше у меня работает, мб там прога с какой-то защитой или прав нет или разрядность не та. Ждем ТС.

Ранг: 16.1 (новичок)
Статус: Участник

Создано: 1 июля 2019 20:15 New!
Цитата · Личное сообщение · #24

ERROR_INVALID_HANDLE может давать Module32First и CloseHandle, скорей всего ТС где-то не там вызывает GetLastError, это вполне реально особенно если присмотреться к коду: проверки выполнения Module32First нет, CloseHandle вызывается даже если дескриптор неверен.


Ранг: 302.4 (мудрец)
Статус: Участник

Создано: 1 июля 2019 20:43 New!
Цитата · Личное сообщение · #25

В данном случае лучше всего использовать отладчик, он будет получать события запуска потоков и загрузку, а есчо запустится при запуске апп --> Link <--
 eXeL@B —› Вопросы новичков —› Заморозка чужого процесса и работа с его памятью

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS