LINUX.ORG.RU

Генерация и запуск кода на лету

 ,


0

1

Здравствуйте уважаемые программисты. Подскажите пожалуйста по следующей задаче: в GNU/Linux необходимо написать программу на C/C++, которая может на лету генерировать исполняемый код и его запускать.

Кратко погуглив тему понял лишь:

  1. fexecve - немного не о том. В идеале не обращаться к файловой системе вовсе.

  2. JavaVM не особо подходит.

  3. OSKIT - не уверен что правильное решение.

То бишь тебе нужен парсер интерпретируемого языка?

Eddy_Em ☆☆☆☆☆ ()

на лету генерировать исполняемый код и его запускать

На каком языке генерировать?

uberroot ()

man mmap. Вам надо выделить виртуальную память, загрузить туда сгенерированный код, поставить права на исполнение и вызвать загруженный код.

X512 ★★★ ()
Последнее исправление: X512 (всего исправлений: 1)
  1. Открыть файл для записи
  2. Поместить в файл код
  3. Закрыть поток
  4. Вызвать интерпретатор/компилятор/запустить_файл

Так что ли?

fernandos ★★★ ()

А зачем? Вопрос без подвоха, ты можешь на самом деле хотеть встроить скриптовый язык, но не знать об этом.

Ceiling_QB ★★★★ ()
Ответ на: комментарий от Ceiling_QB

Мне нужно организовать виртуальную машину и в ней производить некоторые вычисления. Желательно генерировать виртуальные машины налету. Усложнить процесс реверса определённого софта.

shimajima ()
Ответ на: комментарий от shimajima

так вроде защита памяти не позволит поставить права на исполнение…

Ещё как позволяет. Динамический загрузчик *.so файлов по вашему как работает? Через mmap и mprotect он работает. Процесс может свободно управлять памятью в своём адресном пространстве, ограничения действуют только на чужие адресные пространства.

X512 ★★★ ()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от shimajima

Усложнить процесс реверса определённого софта.

Бизнес-модель и правда предполагает что твое время дешевле времени реверсера? О_о

anonymous ()
Ответ на: комментарий от shimajima

Усложнить процесс реверса определённого софта.

Надо начать с sstrip. Убивает значительную часть анализаторов бинарников ввиду их кривости (мой по-прежнему работает).

X512 ★★★ ()
Ответ на: комментарий от Eddy_Em

Клиенты системы могут добраться до чувствительных данных, до которых им давать доступа нельзя. В рамках закона. Заказчик конечно получает исходники.

shimajima ()
Ответ на: комментарий от shimajima

Клиенты системы могут добраться до чувствительных данных, до которых им давать доступа нельзя.

Почему просто нельзя держать чувствительные данные на сервере с авторизацией и шифрованием?

X512 ★★★ ()
Ответ на: комментарий от shimajima

А можно чуть более подробно? Просто звучит это как забивание гвоздей высокотехнологичным микроскопом

Aswed ★★★★★ ()
Ответ на: комментарий от shimajima

Что мешает тебе хранить где-нибудь зашифрованный код на LUA, например? Да хоть в exe-шнике. При исполнении расшифровать его и загрузить в LUA jit.

Aswed ★★★★★ ()
Ответ на: комментарий от shimajima

Твой софт в принципе для своей работы должен как-либо связываться с сервером или подразумевается полностью автономная работа?

Aswed ★★★★★ ()

Хммм...

В самом простецком случае это может быть как-то вот так (генерация кода и компиляция):

echo '#include <stdio.h>
void main() {
        printf("%s\n", "Hi!");
}' | gcc -o my_hello.o -xc -

Либо:

gcc -x c - <<eof
#include <stdio.h>
void main() {
        printf("%s\n", "Hi!");
}
eof

Если надо достаточно серьёзные генераторы кода на С или С++, то тогда смотрите bison или flex. Они генерируют С или С++ (и не только).

Останется тогда только скомпилировать и запустить полученный код на исполнение.

Ну или я не понял постановку задачи.

Moisha_Liberman ★★ ()

всякие jit чем не катят ? какой-нить libjit ??

PS/ кстати слово «libjit» очевидно не переваривают ’nb dfib zyltrcs b ueukfvb

MKuznetsov ★★★★★ ()

кстате пункт раз (1.fexecve не обращаться) НИ ПРОКАТИТ…нельзя не обратиться в файловой системе играя правами.

MKuznetsov ★★★★★ ()
Ответ на: комментарий от shimajima

jit не вариант.

Ты прямо в заглавном сообщении написал, что тебе нужно «на лету генерировать исполняемый код и его запускать». Это и есть определение JIT-компиляторов. Ты уж там решись, нужна тебе JIT-компиляция, или строго-настрого не нужна.

i-rinat ★★★★★ ()
Ответ на: комментарий от shimajima

Мне нужно организовать виртуальную машину и в ней производить некоторые вычисления. Желательно генерировать виртуальные машины налету. Усложнить процесс реверса определённого софта.

так это-ж анти-лисп сиречь хаскел ? чего париться…

MKuznetsov ★★★★★ ()
Ответ на: комментарий от Aswed

А ключ шифрования где хранить? А что помешает из памяти прочитать после расшифровки этот скрипт?

pon4ik ★★★★★ ()
Ответ на: комментарий от i-rinat

Это мы тут привыкли, что код это сорсы, байтолюбы зовут кодом опкоды инструкций процессоря. Или в данном случае, видимо опкоды для виртуальной машины которая гарантирует полиморфное выполнение кода который генерирует ключи и шифрует память. В общем товарищ видимо решил denuvo под онтопик быстренько запилить.

pon4ik ★★★★★ ()

А ты не пробовал вылить воду и свести задачу к исходной? Взять libwine и использовать win32 специфичное решение?

pon4ik ★★★★★ ()
Ответ на: комментарий от shimajima

Обычно... на практике...

Вполне хватает запрета на создание core dumps в приложении. Т.е., если в приложении на момент падения сохраняются core dumps, то да, есть ненулевой шанс что в дампе останутся чувствительные к разглашению данные. Верно.

Можно поступить двояко. Либо заранее оговаривается что система, где живёт Ваш код работает с обрубленными core dumps, либо самим блокировать их создание для Вашего процесса.

В первом случае задача чисто «одминская». Как решается смотреть здесь, например. Либо здесь. В принципе ничего такого «военного», надо просто пнуть одминоф чтобы они сконфигурировали систему под требования.

Второй путь (в своём коде) короче. В этом случае сугубо по барабану разрешены или запрещены core dumps а уровне системы, Вы для своего приложения блокируете их на хрен. Как-то так:

#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>

/* Memory dumps не будет. */   
void disable_core_dumps(void) {
         struct rlimit rlim;
   
         rlim.rlim_cur = rlim.rlim_max = 0;
         setrlimit(RLIMIT_CORE, &rlim);
}

/* Далее очевидно как-то вот так. */
int main(int argc, char *argv[]) {
         (void)argc;
         (void)argv;

         /* Да, прямо вот так, сразу нагло и резко. */
         disable_core_dumps();

         /* Далее делаем то, для чего наша приблуда нужна. */
         return(EXIT_SUCCESS);
}

Можно в принципе, и так и этак. И чисто софтом и командно-административными методами. Для использования последних есть такой язык как AQL (administrative query language), иной раз не грех использовать. =)))

Moisha_Liberman ★★ ()
Ответ на: комментарий от shimajima

Желательно генерировать виртуальные машины налету.

без байт-кода

Пиздец у тебя каша в голове.

anonymous ()
Ответ на: комментарий от pon4ik

Можно конечно.

Но тогда можно считать хэш бинаря где-нибудь в коде и не просто «хэш», а не иначе как хэш-функцией от Стрибог 2012г. Можно и просто gdb залезть. Тогда надо защиты от этого сразу предусматривать.

Если генерировать исходники на лету, то вон, выше я про bison/flex сказал, нор боюсь в таком случае (если мы понимаем что пытаемся защищаться от «хорошо вооружённого» пользователя, как минимум знающего как использовать gdb), то это тоже мало поможет. Такой пользователь, если уж возьмётся дебажить, то рано или поздно отреверсит алгоритм генерации кода и прикинет где примерно искать эти самые «чувствительные к разглашению» данные.

Тут всё определяется тем, что и от кого мы пытаемся защитить.

Moisha_Liberman ★★ ()
Ответ на: комментарий от anonymous

Спасибо за ссылку, изучу продукт. Но одно из требований заказчика - это наличие исходников.

shimajima ()
Ответ на: Можно конечно. от Moisha_Liberman

Полностью защититься невозможно, вопрос только в сведении трудозатрат к нужному уровню. Либо к детектированию и репорту такой о такой попытке с отсылкой отпечатка системы на которой была попытка сделать ай-яй-яй.

pon4ik ★★★★★ ()
Ответ на: комментарий от pon4ik

Кстати да. Вы правильно заметили. Поэтому же и библиотеки использовать не очень хочется - т.к. проксировать вызов не так долго.

shimajima ()

если задача в том что группа гениальных программистов делает софт который генерит НЁХ, в результате работы которой получается то что хочет заказчик (и чтобы никто нидогадался) - возьмите какой-нить FPGA.

всё одно разовая задача

MKuznetsov ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.