169 похожих чатов

Задача: в C++ сгенерить машинный код, выполнить. Решается ясно как

- mmap с понятными опциями - чтобы сегмент был writable/readable/executable.

Сложность в том месте, когда из сгенерённого машинного кода надо вызвать обычную c++/c-функцию. Тут наверное про gcc ABI вызовы надо читать и всё получится?

25 ответов

9 просмотров

А шаманства с линкером не помогают? Условно, если ему явно указать адрес функции Что-то из разряда __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 Сам щас мучаюсь с этой проблемой хД

Rekreker
А шаманства с линкером не помогают? Условно, если ...

Я боюсь тут надо кодогенерацию переделать

disba1ancer
Я боюсь тут надо кодогенерацию переделать

В каком плане? Асм генерируется вполне себе сносно за исключением проблемы с относительными прыжками

pavel- Автор вопроса
Rekreker
А шаманства с линкером не помогают? Условно, если ...

Я не имею дела с асмом в C++ коде, я беру кусок памяти и генерю туда машинные инструкции. (Я щас не понял чему я противоречю и на что возражаю) Поэтому мне, кстати, проще: я могу брать адреса функций в рантайме (нет проблемы "надо знать адреса функций до компиляции...")

Rekreker
В каком плане? Асм генерируется вполне себе сносно...

Как я понял ты хочешь вызывать внешний код, значит тебе нужно что-то вроде стадии линковки

pavel- Автор вопроса
disba1ancer
Как я понял ты хочешь вызывать внешний код, значит...

Я хочу вызвать С++ код, который я сам и писал и могу взять адрес этих функций.

pavel
Я хочу вызвать С++ код, который я сам и писал и мо...

Но вызвать из них внешний код ты же е можешь?

pavel
"них" - это кого?

Из своих функции, или я вообще не понимаю о чем речь

pavel- Автор вопроса
disba1ancer
Из своих функции, или я вообще не понимаю о чем ре...

Что такое "внешний код" я не понял. У нас полный рассинхрон в понимании, надо писать больше букв.

pavel
Я не имею дела с асмом в C++ коде, я беру кусок па...

А каким образом происходит генерация инструкций в память? Авось говорится про программирование компилятора хД

pavel
Что такое "внешний код" я не понял. У нас полный р...

Внешний по отношению к коду который компилишь в рантайме

pavel- Автор вопроса
Rekreker
А каким образом происходит генерация инструкций в ...

Происходит из C-подобного псевдоязыка, который юзер засылает на сервер. Типа, программирование персонажей игры. Условно, пишется недо-си-JIT-компилятор.

C17179n Latypin
Какие люди в чате

Постегаю асм и пытаюсь дописать свою статическую хукалку хД

мат офф

Не понимаю, в чём твои проблемы? Зачем mmap тебе? Хоть на стеке свой код генерь, главное права дать, а внешний код можешь через колбеки вызывать, вроде ничего сложного, или вопрос был в чём-то другом?

pavel- Автор вопроса
BlackBloodyRabbit Rabbit
Не понимаю, в чём твои проблемы? Зачем mmap тебе? ...

mmap нужен, чтобы выделить регион с правами read/write/execute. SELinux взборет тебя, если ты попытаешься дать права такие какому-то существующему куску хипа или стеку.

pavel
mmap нужен, чтобы выделить регион с правами read/w...

Это неправда, я спокойно могу дать права хоть стеку, хоть куче, хоть бсс, хоть дате.

pavel- Автор вопроса
BlackBloodyRabbit Rabbit
Это неправда, я спокойно могу дать права хоть стек...

Ну ты можешь, но SELinux может всечь. Не портабельно.

pavel
Ну ты можешь, но SELinux может всечь. Не портабель...

Ты хоть читал про SELinux? Какое это имеет отношение к сегментам памяти процесса?

BlackBloodyRabbit Rabbit
Ты хоть читал про SELinux? Какое это имеет отношен...

Он просто выделяет кусок сырой памяти с нужными правами, что ты к нему пристал?

pavel- Автор вопроса
BlackBloodyRabbit Rabbit
Ты хоть читал про SELinux? Какое это имеет отношен...

Не читал, но на stack overflow вчера читал, как чувака убило SELinux-ом за подобное и там было постановлено, что лучше просто у mmap попросить сразу что надо, а не кускам своих сегментов права на лету менять.

pavel
Не читал, но на stack overflow вчера читал, как чу...

Максимум, что может убить - это тупость, когда ты кидаешь в мпротект не начало страницы

pavel- Автор вопроса
BlackBloodyRabbit Rabbit
Максимум, что может убить - это тупость, когда ты ...

https://stackoverflow.com/a/28016270 - вот в этом посте чувак был умный, но SELinux ему всё равно всёк в бочину.

Похожие вопросы

Обсуждают сегодня

А чем вам питонисты не угодили?😂
.
79
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Ещё такой вопрос. Мне необходимо хранить пароль пользователя локально. Для этого планирую использовать ini файл. Это для автозаполнения полей логин и пароль при авторизации. Е...
Евгений
19
Ты просто гитлеровскую эстетику плохо понимаешь. Он же всё под Цезаря делал. А это как бы запрещённый приём в политике. Пиджаки они зачем все носят? Чтобы показать что они тип...
Ivan Kropotkin
4
а чем лучше всего сделать глобальный лок, если много нодов, до сотни? ну то есть мне надо, чтобы некоторые операции с объектом не происходили одновременно. перемещение между н...
Д. П.
15
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
26
Hi guys, I'm looking for a good LLM course. Is there any course to learn LLMs in advanced? I'm aiming to use them in my apps, so a perfect course in my openion, is not only a ...
Taha
14
База данных не поможет. Шифрование не поможет. Какие там ещё варианты? Накидывайте.
КТ315
20
А табстоп это сообщение от окна или от элемента управления?
The Bird of Hermes
18
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
Карта сайта