Сейчас на форуме: localhost1, vsv1, asfa, tyns777 (+5 невидимых) |
eXeL@B —› Вопросы новичков —› Заморозка чужого процесса и работа с его памятью |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 29 июня 2019 20:23 · Личное сообщение · #1 |
|
Создано: 29 июня 2019 21:29 · Личное сообщение · #2 Не уверен, правильно ли я понял вопрос, но - "заморозить процесс" - см. WinApi SuspendThread (перечислить все потоки в процессе и приостановить). Память - в книге Рихтера были примеры работы с памятью , как раз таки на плюсах (простая программа для просмотра памяти процесса, см. книгу Windows via C++) , вот еще есть статья , там дельфи, но суть таже http://alexander-bagel.blogspot.com/2013/11/pmm2.html | Сообщение посчитали полезным: hipp0gryph |
|
Создано: 29 июня 2019 21:47 · Поправил: DenCoder · Личное сообщение · #3 Что значит вырезать? Если нужны dll-файлы, просто сдампить их. Если исключить из памяти процесса, то примерно Для 1го есть дамперы. Нужно на c++ написать? Обращайтесь в пм, поделюсь кодом. ----- IZ.RU | Сообщение посчитали полезным: hipp0gryph |
|
Создано: 30 июня 2019 00:35 · Личное сообщение · #4 NtSuspendProcess засаспендит весь процесс. Как Process Explorer из Sysinternals делает. С "вырезать" надо бы уточнить, это что значит? ----- Stuck to the plan, always think that we would stand up, never ran. | Сообщение посчитали полезным: hipp0gryph |
|
Создано: 30 июня 2019 00:36 · Поправил: difexacaw · Личное сообщение · #5 Дампить нужно до инит. модулей, те до записи в них вне загрузчика. В общем же никаких проблем не должно с этим возникать, разница между файловым образом и в памяти - секционное выравнивание. Очень не обычно, если используется загрузка длл из памяти. Это делает исключительно малварь, при этом не плохая. Добавлено спустя 33 минуты ARCHANGEL Заморозка потоков не приемлема для дампа. Это значит что модуль уже инициализирован и при перезапуске будет не рабочим. Нужно отслеживать запись в модуль. Возможны два варианта, тс не достаточно инфы предоставил. Это загрузка из памяти или это файловая загрузка. Скорее всего загрузка из памяти, так как файла нет. При этом так же вероятно что нет пе-хидера. Если в случае с файловым образом его можно дампить до любой записи в него, те ядро замапило и пока загрузчик не поменял образ он сырой. То в случае с загрузкой из памяти всё сложнее. Нужно как минимум определить два события - окончание формирования образа и начало исполнения в нём, если первое событие скипнуто. Нужно больше данных про загрузку. ----- vx |
|
Создано: 30 июня 2019 17:23 · Личное сообщение · #6 Ого!) Спасибо огромное за ответы!!!))) Там просто процесс подзагружает две dll'ки. И убить их можно как угодно. Это кривая защита игры, которая на каких-то пк работает, на каких-то нет. И чтобы от неё избавиться, достаточно просто из процесса их вырезать. Я никогда не занимался такими вещами, а тут стало интересно))) difexacaw, спасибо за ответ! Как я понимаю, защита у игры ультра кривая и поэтому разрабы сделали так, что если в отношении защиты идут какие-то ошибки, то игра просто их проглатывает и забивает, поэтому убивать участки памяти которые заняты этой защитой можно целиком и все будет хорошо)) Мне демонстрировали это на примере Process Hacker 2. Просто вырезали два участка памяти занятые этими dll'ками и было все прекрасно!) Защита падала, игра работала. ARCHANGEL, шикарно! Спасибо!) В отношении вырезать, нужно освободить участки памяти в процессе, которые постоянно занимают два этих файла. DenCoder, спасибо!) Мне нужно исключить из памяти процесса, постараюсь разобраться, если ничего не получится постучусь!!))) Спасибо!) morgot, Благодарю!) Попробую если не получится с NtSuspendProcess. Почитаю раздел с памятью) Всем огромное спасибо, буду пробовать) Как что-то получится, отпишусь сюда с кодом) |
|
Создано: 30 июня 2019 20:44 · Личное сообщение · #7 |
|
Создано: 30 июня 2019 21:27 · Личное сообщение · #8 difexacaw, я пытаюсь программно реализовать обход защиты, который мне показывали) Там просто заходили в Process Hacker 2, открывали процесс. Отображались различные модули, файлы и dll'ки подключенные к процессу. И отображались адреса с которых начинался каждый файл, модуль, dll. Суть обхода была заморозить процесс, выделить эти две dll там и просто убить их нажатием на Terminate. Как я понимаю, это просто вырезался кусок кода. Почему не было исключений? Потому что это защита и она очень кривая, вплоть до того, что может не работать прямо совсем. И что происходит с исключениями, я не знаю. Их просто нет. Может в других местах программы в отношении этих двух файлов идет обработка. Вообще хз) Я честно признаться не до конца понимаю как это вообще устроено. Но вот что имеем, собственно) |
|
Создано: 30 июня 2019 21:33 · Поправил: difexacaw · Личное сообщение · #9 |
|
Создано: 30 июня 2019 21:56 · Личное сообщение · #10 Добавлено спустя 7 минут Code:
|
|
Создано: 30 июня 2019 22:03 · Личное сообщение · #11 |
|
Создано: 30 июня 2019 22:03 · Личное сообщение · #12 |
|
Создано: 30 июня 2019 22:13 · Личное сообщение · #13 hipp0gryph Тоесть уже память трогать не нужно, а завершать потоки в нужных модулях.. как быстро всё меняется, никакой хрустальный шар не успеет Если в произвольный момент остановить поток, то скорее всего его адрес окажется в сервисе, точнее на адресе возврата в нэйтивный шлюз. Тогда вам нужно крутить цикл саспенд-ресум, до тех пор пока указатель не окажется в искомой области. По нормальному же это делается иначе - блокируется память от исполнения и в ловушке киляйте потоки. Ну или вообще прикончить треды, если у них прямые стартап адреса в целевые модуля. Есть один важный нюанс. Если в произвольный момент прикончить тред, то это скорее всего приведёт к деадлоку, апп повиснет. Так как захваченные тредом ресурсы не будут освобождены. ----- vx |
|
Создано: 30 июня 2019 22:26 · Поправил: hipp0gryph · Личное сообщение · #14 |
|
Создано: 30 июня 2019 23:23 · Личное сообщение · #15 hipp0gryph Вам нужно: 1. Остановить процесс. 2. Перечислить все потоки и найти для них Win32StartAddress. 3. Перечислить все динамические библиотеки и найти среди них ImageBase и ImageSize для mrac.dll. 4. Для всех потоков, Win32StartAddress которых попадает в диапазон ImageBase <= x <= ImageBase + ImageSize, сделать TerminateThread. 5. Возобновить работу процесса. Как искать Win32StartAddress: По остальному - либо советовали выше, либо всё тривиально. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 30 июня 2019 23:28 · Поправил: difexacaw · Личное сообщение · #16 ARCHANGEL > 4. Для всех потоков, Win32StartAddress которых попадает в диапазон ImageBase <= x <= ImageBase + ImageSize, сделать TerminateThread. Не корректное решение. Это повесит апп. Необходимо обождать когда поток выйдет на синхро-безопасное место(иначе другой поток войдёт в бесконечный цикл ожидания глобального синхро ресурса). Это не простая задача, в простейшем случае чем меньше число стековых фреймов, тем меньше вероятность блокировки. Проще блокировать потоки до их запуска. ----- vx | Сообщение посчитали полезным: hipp0gryph |
|
Создано: 01 июля 2019 01:43 · Личное сообщение · #17 Попытался искать эти модули внутри процесса, но не получается сделать снапшот и из-за этого ничего не выводится. В чем может быть проблема? Code:
|
|
Создано: 01 июля 2019 14:47 · Личное сообщение · #18 hipp0gryph Дебаг привилегии нужно получить. А так, чтобы не гадать, выводите хотя бы код ошибки через GetLastError(). difexacaw Вы не читаете тред, что ли. Эти потоки защиты, вероятно, ни на каких ресурсах игры не завязаны и вообще стейтлесс. В худшем случае немного ресурсов утечёт (которые юзала сама защита), но это - небольшая цена за снятие защиты. Плюс защита, если бы работала, сама бы их юзала с некоей пользой, а так они просто будут висеть без дела. ----- Stuck to the plan, always think that we would stand up, never ran. | Сообщение посчитали полезным: hipp0gryph |
|
Создано: 01 июля 2019 15:31 · Поправил: Cigan · Личное сообщение · #19 |
|
Создано: 01 июля 2019 18:20 · Личное сообщение · #20 |
|
Создано: 01 июля 2019 19:13 · Личное сообщение · #21 |
|
Создано: 01 июля 2019 19:26 · Личное сообщение · #22 |
|
Создано: 01 июля 2019 19:59 · Личное сообщение · #23 |
|
Создано: 01 июля 2019 20:15 · Личное сообщение · #24 |
|
Создано: 01 июля 2019 20:43 · Личное сообщение · #25 В данном случае лучше всего использовать отладчик, он будет получать события запуска потоков и загрузку, а есчо запустится при запуске апп ----- vx |
|
Создано: 11 апреля 2020 15:18 · Поправил: hipp0gryph · Личное сообщение · #26 Спасибо огромное всем за помощь!!!) Понадобилось срочно уехать, а потом все было занято делами. Теперь пока что карантин вернулся к рассмотрению данного вопроса. Вообщем я начал морозить потоки все и сразу. Заморозил потоки > бот изменяет значение по адресу > размораживаю потоки > PROFIT!!! Защита не ругается, а в игре все крутенько. Вот что у меня получилось. Code:
Добавлено спустя 24 минуты Введение: Теперь перешагнув через это хочу создать собственный полноценный чит, коего там ещё никогда не было, с этим недо обходом) Через Cheat Engine собрал много полезных данных, которые позволяют мне сделать в игре нечто новое, что никто не разрабатывал и это будет там очень к месту. Проблема: Пытаюсь реализовать чтение адреса с помощью указателя. Нашел базовый адрес, оффсеты. Теперь нужно как-то реализовать это программно. Прочитал статьи по работе с базовым адресом и оффсетами. Понял что это такое. У меня выстроена цепочка из указателей. Получается я должен взять из базового адреса значение - это будет первый указатель, после прибавить к этому указателю первый оффсет, посмотреть значение - это второй указатель, ко второму прибавить оффсет - получить значение из третьего и т.д. Правильно ли я понял принцип? Что не так с моим кодом? Если я что-то не знаю или не правильно понял, посоветуйте пожалуйста хорошую статью. Заранее спасибо!!! Пока получается нерабочее вот это: Code:
|
|
Создано: 11 апреля 2020 19:04 · Личное сообщение · #27 |
|
Создано: 11 апреля 2020 19:16 · Личное сообщение · #28 Я думал базовый адрес именно этот пробил вот по значению. Или что-то не то? Добавлено спустя 1 минуту Я не понимаю как hex код грамотно принять и вывести. Обычный cout<<hex<<offset<<endl; не прет Добавлено спустя 2 минуты Думаю если бы получалось выводить, дело быстрее бы пошло, но подозреваю что как-то не так получаю. |
|
Создано: 11 апреля 2020 20:06 · Поправил: dosprog · Личное сообщение · #29 |
|
Создано: 11 апреля 2020 20:14 · Личное сообщение · #30 |
. 1 . 2 . >> |
eXeL@B —› Вопросы новичков —› Заморозка чужого процесса и работа с его памятью |