LINUX.ORG.RU

Как сложить 2 бинаря

 , ,


0

2

Привет.

Есть бинарь допустим, который выводит helloworld.

Есть второй бинарь, который запускает первый через fork()+execve();

Можно ли их как-то сложить в один файл по аналогии «технологии» rarjpg

Я догадываюсь что можно но непонимаю как переписать второй бинарь чтобы его можнобыло состыковать с первым.

★★★

Ответ на: комментарий от anonymous
#include <stdio.h>

int main(int argc, char ** argv)
{
  printf("Helloworld");
}

#include <sys/ptrace.h>
#include <sys/reg.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/syscall.h>

int do_child(int argc, char **argv);
int do_trace(pid_t child);


int main(int argc, char **argv) {
    if (argc < 2) {
        fprintf(stderr, "Usage: %s prog args\n", argv[0]);
        exit(1);
    }

    pid_t child = fork();
    if (child == 0) {
        return do_child(argc-1, argv+1);
    } else {
        return do_trace(child);
    }
}

int do_trace(pid_t pid)
{
  return 0;

}

int do_child(int argc, char **argv) {
    char *args [argc+1];
    memcpy(args, argv, argc * sizeof(char*));
    args[argc] = NULL;

    ptrace(PTRACE_TRACEME);
    kill(getpid(), SIGSTOP);
    return execvp(args[0], args);
}

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

Ты можешь сделать кастомный загрузчик как ld-linux

mittorn ★★★★★
()

можно объехать (три загиба на версту) через VFS и tar

tar`ом делаешь архив из всего что надобно изнутри запускать, через objcopy линкуешь сей tar в exe`шник при старте через VFS монтируешь с нужными правами и запускаешь..

но это дикая дичь

PS если есть хотя-бы .o от «helloword» то можно переименовывать символ __main в __foo_main, слинковать и так к нему и обращаться

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

интересна мысль про __foo_main

На этом целый busybox построен.

vodz ★★★★★
()

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

А rarjpg это просто дописанный в конец jpg файла архив rar, в *NIX системах это можно сделать, используя cat

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

задумка такая. сделать бинарь, который бы защищал переменные окружения от модификации и сливать это с бинарём который идёт в дистрибутиве. например утилита mysql. я хочу чтобы MYSQL_HISTORY был задан в строго в соответствии тому что я хочу и не мог быть переопределён (за быстрое время). я делаю бинарь, который, переписывает если надо environ на то что надо и делает execve на дистрибутивный бинарь). Хотелось бы просто сделать так чтобы эти 2 бинаря были слиты.

сейчас смотрю ещё objdump objcopy на предмет замены секций старта

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

Ну так это, почему бы не пропатчить main () в mysql и не сделать чтобы там в envp игнорилась MYSQL_HISTORY и значение MYSQL_HISTORY было захардкожено в самом main? Вариант перекомпиляции из исходников не рассматривается?

SZT ★★★★★
()

посмотри на бандл анбандл shскрипт

https://notfaq.wordpress.com/2006/08/05/bundle-files-in-unix-2/

осталось добавить автоудаление(али исполнение в памяти - типо создание окружения для процеса1 и процеса2 поднятого из забандленного файла)

т.е. технически можно агрегировать несколько исполнимых в один исполнимый.

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

Ну так оставь комментарий в скрипте, что сломаешь руки тому, кто поменяет окружение.

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

Кстати, так и не стало понятно, цель то благородная или самодельная защита типа вендор-lock и прочая проприетарщина?

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

Защита от фантазий и усталости коллег на продакшен нодах. Смысл в том чтобы не дать просто так выполнить действия, которые имеют последствия для прода. И не дать стереть свои ошибки, чтобы было видно кто что сделал, а не как обычно, «я не я и вообще не приделах»

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

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

Ну для этого вовсе не стоит крякать бинарники. Эта задача давно имеет стандартное решение. Сделайте всё что относится к prod uid на USER=prod так чтобы USERS=dbadmins могли запускать правки только через sudo -u prod скрипт, а сам скрипт защитите от правки dbadmin-ами. Тогда команды из скрипта будут все вызваны от пользователя prod, но руками можно вызвать только скрипт, а не его содержимое покомандно. Скрипт может быть и бинарем.

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

дикая дичь

Раньше на баше так инсталляторы делали - uuencoded бинарник в комментарии, в начале - скрипт, который сам себя парсит.

Shadow ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.