Выполнение двоичных файлов без execve?

Где-то я видел упоминание о том, что можно «эмулировать» execve (в основном с помощью open и mmap), чтобы загрузить какой-то другой двоичный файл (без фактического системного вызова «execve»).

  1. Есть ли уже реализованные примеры для него?
  2. Можем ли мы загружать как статические, так и динамические двоичные файлы?
  3. Можно ли это сделать портативно?

Такая функция может быть полезна для делегирования работы произвольным двоичным файлам игнорирования битов файловой системы или с установленной политикой seccomp, не разрешающей фактическое выполнение.


person Vi.    schedule 16.03.2013    source источник
comment
Я не думаю, что вы действительно можете сделать это без помощи ядра. Если вы откроете целевой двоичный файл и проанализируете ELF (или любой другой формат исполняемого файла, который вы хотите поддерживать), вы сможете сопоставить его и сделать кучу других необходимых вещей (например, найти и сопоставить интерпретатор), а затем перейти в код нового двоичного файла, но у вас возникнут проблемы с отменой карты одновременно и с несколькими другими вещами, такими как убеждение ядра в том, что исполняемый в данный момент исполняемый файл изменился.   -  person Celada    schedule 16.03.2013
comment
Что произойдет, если ваш маленький кусочек останется нанесенным на карту? убедить ядро, что запущенный в данный момент исполняемый файл изменился -> Зачем? Цель в первую очередь состоит в том, чтобы выполняться за спиной ядра. Частичный результат (т. е. возможность запуска большинства бинарных файлов) также приемлем.   -  person Vi.    schedule 16.03.2013
comment
Замечание принято относительно убеждения ядра. Что касается вашего первого пункта, да, я полагаю, что вы почти могли бы сделать это, оставив лишь крошечный фрагмент кода передачи обслуживания, отображаемый в адресном пространстве. Но, кстати, еще одна проблема заключается в том, что я считаю, что текущий исполняемый файл всегда отображается на один и тот же виртуальный адрес, и я действительно не знаю, позволит ли mmap() отменить сопоставление того, что уже есть, и вместо этого сопоставить что-то другое.   -  person Celada    schedule 16.03.2013
comment
Чтобы обойти это, вы можете выполнить вспомогательный двоичный файл, который намеренно загружается по другому виртуальному адресу, который не мешает, оставляя пространство, в которое обычно отображаются двоичные файлы, свободным. Это интересная (и амбициозная) задача, я вам скажу.   -  person Celada    schedule 16.03.2013
comment
Может быть, уже есть какой-то простой метод, похожий на dlopen/dlsym, только для динамических двоичных файлов?   -  person Vi.    schedule 16.03.2013
comment
Я так не думаю. С исполняемыми файлами вам приходится иметь дело с интерпретатором ELF, который не применяется к разделяемым библиотекам, поэтому dlopen не справляется с этим. dlsym также будет предполагать, что вы хотите, чтобы символы в целевом файле были связаны с текущим исполняемым двоичным файлом, а в данном случае это не то, что вам нужно. Я предполагаю, что вы, вероятно, захотите использовать libelf.   -  person Celada    schedule 16.03.2013
comment
Вероятно, вам не удастся убедить ядро ​​изменить /proc/self/exe без execve.   -  person Basile Starynkevitch    schedule 16.03.2013