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

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

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

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

25 ответов

21 просмотр

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта