Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: доступ к памяти чужого процесса  (Прочитано 1000 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн dronte

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
доступ к памяти чужого процесса
« : 16 Январь 2017, 17:49:23 »
итак: есть некоторый процесс, вообще говоря, запущенный под wine, требуется научиться получать доступ к его адресному пространству чисто из линукса (в частности, ради идеи максимальной незаметности слежки за ним для самого процесса), а также как с ним работать, как, например, в нем найти какой-нибудь адрес, т.е. перебрать _использующиеся_ адреса, как динамической, так и статической, инструкционной или стековой частей, по которому будет искомое значение, как получить всякие адреса вроде тех, которые для самого процесса находятся в esp и ebp, и т.п., т.е. как по нему "гулять". Как понимаю, надо еще как-то пересчитывать адреса из виртуальной адресации процесса в физическую адресацию, соответственно как с ней работать. И можно ли это организовать без "аттача"/инжекта своего кода в дерево процесса/память процесса.

собственно, понимаю, что это вопрос не на короткий ответ. Желательно получить ссылку на книгу или ресурс, да и который был бы актуален к настоящему времени.

p.s. хорошо знаком как с C/C++, так и с NASM, пусть он и не того синтаксиса, который принят в линуксе, не суть, я о том, что необходимые навыки есть, так что требуется именно ответ по теме того, как работать с чужим процессом, как использовать root/sudo привилегии в данном контексте. С работой всяких shm и прочего знаком, но тут нет доступа как к коду вообще, так и какой shm, когда процесс вообще под wine, но в прочем как я понял, wine достаточно хорошо эмулирует нативность запуска, что вполне должно быть осуществимо какое-то другое вмешательство в память процесса, чисто линуксовое.

--------------

или ещё, вот, например, получили адрес чего-то из вывода pmap, что с ним делать, ну т.е. да, опять отсылка к физической/виртуальной адресации ...
« Последнее редактирование: 16 Январь 2017, 18:23:18 от dronte »

Оффлайн dronte

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Re: доступ к памяти чужого процесса
« Ответ #1 : 19 Январь 2017, 00:19:42 »
насколько я понял, интернет говорит, о том, что надо пользоваться get_user или get_user_pages, но понятных примеров использования - я не нашел.

попутно возник странный вопрос, неужели для этого надо писать модуль ядра, чтобы мочь читать память произвольного процесса?
« Последнее редактирование: 19 Январь 2017, 00:28:28 от dronte »

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7169
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: доступ к памяти чужого процесса
« Ответ #2 : 19 Январь 2017, 00:39:00 »
Есть проприетарная крутая игрушка, называется Dwarf Fortress. К ней написана опенсорсная тулза DFHACK которая модифицирует процесс игры и читает из него некоторые данные. Никакого вменяемого API там нет. Посмотри, как она у них сделана. Но для работы с чужим процессом тебе потребуются права рута.

Оффлайн Ampermetr

  • Активист
  • *
  • Сообщений: 491
    • Просмотр профиля
Re: доступ к памяти чужого процесса
« Ответ #3 : 30 Январь 2017, 16:17:25 »
dronte, #include <iostream>
#include <sys/ptrace.h>
#include <errno.h>
#include <cstdlib>

using namespace std;

extern "C" unsigned int get_coordX(int pidL2, int X)
{
pid_t pid = pidL2;
int addrX = X;
int ret = ptrace(PTRACE_ATTACH, pid, NULL, NULL);
//~ cout << "ptrace Status: " << ret << endl; можно выводить и статус подключения, если требуется
//~ cout << "Errno: " << errno << endl;
char temp = errno;
unsigned int retX = ptrace(PTRACE_PEEKDATA, pid, addrX, NULL);
cout << retX << endl;
//~ cout << "Errno: " << errno << endl;
temp = errno;
ret = ptrace(PTRACE_DETACH, pid, NULL, NULL);
//~ cout << "ptrace Status: " << ret << endl;
//~ cout << "Errno: " << errno << endl;
temp = errno;
return retX;
}

читает данные процесса pidL2 из ячейки Х
адрес ячейки, где хранятся нужные мне данные я получил с помощью CheatEngine, в игре Lineage2 адрес не меняется, поэтому достаточно было найти его однажды.
Для чтения права рута не требуются. Также где-то читал, что из процесса невозможно отследить сканирует ли кто-нибудь его адресное пространство, если сканер имеет привилегии выше, чем сканируемый процесс.
Женский форум,топик "Плакала всю ночь, подскажите из-за чего?"
Линукс форум, топик "Всю ночь собирал генту, подскажите зачем?"

 

Страница сгенерирована за 0.277 секунд. Запросов: 24.