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

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

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

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

25 ответов

20 просмотров

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

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

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

Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Коллеги, добрый вечер. Создаю коллекцию от TFPGMap, ключ - перечисление, значение - целое. Нужно отсортировать коллекцию по значению. Как это можно сделать?
Kirill Filippenok
11
Скажи а ты когда этот канал создавал ты уже дельфи не любил, или это со временем пришло?
Роман Лях (rgreat)
18
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
Всем привет! Использую кастомное модальное диалоговое окошко, все по классике - mrOK, mrCancel как ModalResult. Однако есть нюанс - в главной форме есть универсальный обработч...
Олег Гранишевский
20
Карта сайта