- mmap с понятными опциями - чтобы сегмент был writable/readable/executable.
Сложность в том месте, когда из сгенерённого машинного кода надо вызвать обычную c++/c-функцию. Тут наверное про gcc ABI вызовы надо читать и всё получится?
А шаманства с линкером не помогают? Условно, если ему явно указать адрес функции Что-то из разряда __attribute__((section(".nonshook"))) void printf(void) {} с дальнейшим манипулированием секции через линкер-скрипт Ещё как вариант использовать inline __attribute__((always_inline)) int CURR_IP() { register int ip asm("rdx"); asm volatile ("call kek \n" "kek: \n" "pop %rdx"); return ip; } #define printf ((int (*)(char *, ...))(long)(0x4000-CURR_IP())) Но тут нужно ещё умудриться до компиляции знать адрес функции, на которую будет совершаться прыжок + CURR_IP инлайнится не перед вызовом функции, а чуть раньше, и возникает разница в регистре IP Сам щас мучаюсь с этой проблемой хД
Я боюсь тут надо кодогенерацию переделать
В каком плане? Асм генерируется вполне себе сносно за исключением проблемы с относительными прыжками
Я не имею дела с асмом в C++ коде, я беру кусок памяти и генерю туда машинные инструкции. (Я щас не понял чему я противоречю и на что возражаю) Поэтому мне, кстати, проще: я могу брать адреса функций в рантайме (нет проблемы "надо знать адреса функций до компиляции...")
Как я понял ты хочешь вызывать внешний код, значит тебе нужно что-то вроде стадии линковки
Я хочу вызвать С++ код, который я сам и писал и могу взять адрес этих функций.
Но вызвать из них внешний код ты же е можешь?
"них" - это кого?
Из своих функции, или я вообще не понимаю о чем речь
Что такое "внешний код" я не понял. У нас полный рассинхрон в понимании, надо писать больше букв.
А каким образом происходит генерация инструкций в память? Авось говорится про программирование компилятора хД
Внешний по отношению к коду который компилишь в рантайме
Происходит из C-подобного псевдоязыка, который юзер засылает на сервер. Типа, программирование персонажей игры. Условно, пишется недо-си-JIT-компилятор.
Постегаю асм и пытаюсь дописать свою статическую хукалку хД
мат офф
Не понимаю, в чём твои проблемы? Зачем mmap тебе? Хоть на стеке свой код генерь, главное права дать, а внешний код можешь через колбеки вызывать, вроде ничего сложного, или вопрос был в чём-то другом?
mmap нужен, чтобы выделить регион с правами read/write/execute. SELinux взборет тебя, если ты попытаешься дать права такие какому-то существующему куску хипа или стеку.
Это неправда, я спокойно могу дать права хоть стеку, хоть куче, хоть бсс, хоть дате.
Ну ты можешь, но SELinux может всечь. Не портабельно.
Ты хоть читал про SELinux? Какое это имеет отношение к сегментам памяти процесса?
Он просто выделяет кусок сырой памяти с нужными правами, что ты к нему пристал?
Не читал, но на stack overflow вчера читал, как чувака убило SELinux-ом за подобное и там было постановлено, что лучше просто у mmap попросить сразу что надо, а не кускам своих сегментов права на лету менять.
Максимум, что может убить - это тупость, когда ты кидаешь в мпротект не начало страницы
https://stackoverflow.com/a/28016270 - вот в этом посте чувак был умный, но SELinux ему всё равно всёк в бочину.
Обсуждают сегодня