LINUX.ORG.RU

SHC - бинарный файл после компиляции просто висит в консоли

 


0

1

Привет!

Люди, кто пользовался этой утилитой? Я проббовал ее уже на двух машинках с убунтой сервер 18,4 и кубунтой.

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

#!/bin/bash -x

echo mytest

exit

После компиляции

shc -r -T -f ./test.sh

появляются, как и полагается, два файла - .с и .х, последний с исполняемым флагом. После его запуска в консоли он просто висит безрезультатно, пока его не снимет Ctrl+C.

Бинарный файл вместо 20 байт в источнике превращается в 10К.

Она вообще работает у кого?



Последнее исправление: DrBim (всего исправлений: 1)

два файла - .с и .х

Тот, что «.x» оставь себе. Тот что «.c» покажи здесь.

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

#if 0 shc Version 3.8.9b, Generic Script Compiler Copyright (c) 1994-2015 Francisco Rosales frosal@fi.upm.es

    ./shc -r -T -f ./test.sh

#endif

static char data [] = #define text_z 30 #define text ((&data[4])) «\366\261\067\110\312\245\022\075\256\336\224\201\263\145\343\263» «\060\377\164\356\272\206\001\003\114\323\164\365\101\212\157\226» «\322\274\131» #define lsto_z 1 #define lsto ((&data[35])) «\355» #define xecc_z 15 #define xecc ((&data[36])) «\255\150\036\032\036\306\044\361\253\206\125\064\050\222\361\371» «\376» #define pswd_z 256 #define pswd ((&data[88])) «\362\154\267\111\167\371\217\027\337\201\007\370\117\242\065\105» «\123\154\215\255\324\373\107\056\056\364\050\055\372\262\047\355» «\037\337\066\014\134\015\157\331\307\177\277\321\131\010\362\150» «\135\242\165\373\114\277\222\004\177\203\227\027\154\225\167\307» «\143\301\324\300\316\104\231\225\303\130\147\035\140\132\205\276» «\374\372\272\111\272\114\115\072\320\345\121\074\173\311\003\336» «\212\330\237\131\034\070\357\340\220\126\376\361\260\203\257\255» «\176\152\366\070\266\104\162\206\052\304\303\245\215\306\204\030» «\237\043\161\274\134\141\234\355\270\233\336\151\036\216\027\235» «\370\016\326\257\122\111\066\175\015\371\042\232\300\247\262\137» «\313\044\033\047\206\270\024\076\123\363\250\162\202\277\017\173» «\315\346\052\040\057\140\235\074\131\300\327\031\150\212\171\063» «\257\224\132\065\115\157\164\240\142\034\022\345\334\042\140\252» «\010\212\312\070\353\150\165\105\050\114\136\220\326\330\304\205» «\154\037\273\271\216\057\132\361\114\155\326\051\220\066\323\231» «\301\236\321\254\007\106\361\060\223\120\300\152\050\205\360\225» «\244\253\117\062\333\252\043\050\027\372\122\247\060\045\101\362» «\304\022\237\313\131\221\373\354\341\274\126\012\102\106\240\346» «\362\360\030\226\330\306\255\267\110\265\260\227\127\345\334\253» «\122\152\130\046\146\240\125\225\225\176\302\217\060\352\175\117» «\311\264\346\241\172\224\131\302\112\011\132\241\357\066\115\101» «\241\246\150\010\106\276\235\333\074\137\153\155\112\351\275\023» «\235\243» #define rlax_z 1 #define rlax ((&data[407])) «\105» #define msg1_z 42 #define msg1 ((&data[417])) «\030\064\044\010\153\161\112\015\030\272\376\033\236\171\355\247» «\310\217\060\301\060\145\345\065\016\207\317\300\115\175\131\045» «\211\160\125\030\132\200\254\000\376\152\075\270\107\370\376\355» «\337\332\030\262\025\136\161\262» #define shll_z 10 #define shll ((&data[466])) «\246\033\127\347\166\310\300\323\302\021\360\366» #define tst1_z 22 #define tst1 ((&data[479])) «\157\054\175\206\252\075\221\202\014\343\024\134\136\067\000\035» «\244\043\025\227\340\040\137\345\204\044\104\265\063\037» #define inlo_z 3 #define inlo ((&data[506])) «\000\030\376» #define chk1_z 22 #define chk1 ((&data[510])) «\315\001\065\334\055\012\374\144\002\133\263\336\102\262\046\207» «\257\041\276\173\102\361\006\236\314\345\121» #define tst2_z 19 #define tst2 ((&data[537])) «\224\202\303\323\316\131\113\326\252\021\006\122\215\340\321\123» «\065\131\171\123\176\161\247» #define date_z 1 #define date ((&data[559])) «\011» #define opts_z 1 #define opts ((&data[560])) «\274» #define chk2_z 19 #define chk2 ((&data[565])) «\046\231\314\105\013\241\046\175\343\034\032\033\234\307\106\117» «\171\360\074\201\212\261\112\320\030» #define msg2_z 19 #define msg2 ((&data[586])) «\077\133\366\232\112\160\305\376\215\204\105\316\274\040\041\324» «\322\132\011\131\371»/* End of data[] */;

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

#define hide_z 4096 #define DEBUGEXEC 0 /* Define as 1 to debug execvp calls / #define TRACEABLE 1 / Define as 1 to enable ptrace the executable */

/* rtc.c */

#include <sys/stat.h> #include <sys/types.h>

#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <unistd.h>

/* ‘Alleged RC4’ */

static unsigned char stte[256], indx, jndx, kndx;

/*

  • Reset arc4 stte. */ void stte_0(void) { indx = jndx = kndx = 0; do { stte[indx] = indx; } while (++indx); }

/*

  • Set key. Can be used more than once. */ void key(void * str, int len) { unsigned char tmp, * ptr = (unsigned char *)str; while (len > 0) { do { tmp = stte[indx]; kndx += tmp; kndx += ptr[(int)indx % len]; stte[indx] = stte[kndx]; stte[kndx] = tmp; } while (++indx); ptr += 256; len -= 256; } }

/*

  • Crypt data. */ void arc4(void * str, int len) { unsigned char tmp, * ptr = (unsigned char *)str; while (len > 0) { indx++; tmp = stte[indx]; jndx += tmp; stte[indx] = stte[jndx]; stte[jndx] = tmp; tmp += stte[indx]; *ptr ^= stte[tmp]; ptr++; len–; } }

/* End of ARC4 */

/*

  • Key with file invariants. */ int key_with_file(char * file) { struct stat statf[1]; struct stat control[1];

     if (stat(file, statf) < 0)
             return -1;
    
     /* Turn on stable fields */
     memset(control, 0, sizeof(control));
     control->st_ino = statf->st_ino;
     control->st_dev = statf->st_dev;
     control->st_rdev = statf->st_rdev;
     control->st_uid = statf->st_uid;
     control->st_gid = statf->st_gid;
     control->st_size = statf->st_size;
     control->st_mtime = statf->st_mtime;
     control->st_ctime = statf->st_ctime;
     key(control, sizeof(control));
     return 0;
    

}

#if DEBUGEXEC void debugexec(char * sh11, int argc, char ** argv) { int i; fprintf(stderr, «shll=%s\n», sh11 ? sh11 : «»); fprintf(stderr, «argc=%d\n», argc); if (!argv) { fprintf(stderr, «argv=\n»); } else { for (i = 0; i <= argc ; i++) fprintf(stderr, «argv[%d]=%.60s\n», i, argv[i] ? argv[i] : «»); } } #endif /* DEBUGEXEC */

void rmarg(char ** argv, char * arg) { for (; argv && *argv && *argv != arg; argv++); for (; argv && *argv; argv++) *argv = argv[1]; }

int chkenv(int argc) { char buff[512]; unsigned long mask, m; int l, a, c; char * string; extern char ** environ;

    mask  = (unsigned long)&chkenv;
    mask ^= (unsigned long)getpid() * ~mask;
    sprintf(buff, "x%lx", mask);
    string = getenv(buff);

#if DEBUGEXEC fprintf(stderr, «getenv(%s)=%s\n», buff, string ? string : «»); #endif l = strlen(buff); if (!string) { /* 1st / sprintf(&buff[l], «=%lu %d», mask, argc); putenv(strdup(buff)); return 0; } c = sscanf(string, «%lu %d%c», &m, &a, buff); if (c == 2 && m == mask) { / 3rd */ rmarg(environ, &string[-l - 1]); return 1 + (argc - a); } return -1; }

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

#if !TRACEABLE

#define _LINUX_SOURCE_COMPAT #include <sys/ptrace.h> #include <sys/types.h> #include <sys/wait.h> #include <fcntl.h> #include <signal.h> #include <stdio.h> #include <unistd.h>

#if !defined(PTRACE_ATTACH) && defined(PT_ATTACH)

define PTRACE_ATTACH PT_ATTACH

#endif void untraceable(char * argv0) { char proc[80]; int pid, mine;

    switch(pid = fork()) {
    case  0:
            pid = getppid();
            /* For problematic SunOS ptrace */

#if defined(FreeBSD) sprintf(proc, «/proc/%d/mem», (int)pid); #else sprintf(proc, «/proc/%d/as», (int)pid); #endif close(0); mine = !open(proc, O_RDWR|O_EXCL); if (!mine && errno != EBUSY) mine = !ptrace(PTRACE_ATTACH, pid, 0, 0); if (mine) { kill(pid, SIGCONT); } else { perror(argv0); kill(pid, SIGKILL); } _exit(mine); case -1: break; default: if (pid == waitpid(pid, 0, 0)) return; } perror(argv0); _exit(1); } #endif /* !TRACEABLE */

char * xsh(int argc, char ** argv) { char * scrpt; int ret, i, j; char ** varg; char * me = argv[0];

    stte_0();
     key(pswd, pswd_z);
    arc4(msg1, msg1_z);
    arc4(date, date_z);
    if (date[0] && (atoll(date)<time(NULL)))
            return msg1;
    arc4(shll, shll_z);
    arc4(inlo, inlo_z);
    arc4(xecc, xecc_z);
    arc4(lsto, lsto_z);
    arc4(tst1, tst1_z);
     key(tst1, tst1_z);
    arc4(chk1, chk1_z);
    if ((chk1_z != tst1_z) || memcmp(tst1, chk1, tst1_z))
            return tst1;
    ret = chkenv(argc);
    arc4(msg2, msg2_z);
    if (ret < 0)
            return msg2;
    varg = (char **)calloc(argc + 10, sizeof(char *));
    if (!varg)
            return 0;
    if (ret) {
            arc4(rlax, rlax_z);
            if (!rlax[0] && key_with_file(shll))
                    return shll;
            arc4(opts, opts_z);
            arc4(text, text_z);
            arc4(tst2, tst2_z);
             key(tst2, tst2_z);
            arc4(chk2, chk2_z);
            if ((chk2_z != tst2_z) || memcmp(tst2, chk2, tst2_z))
                    return tst2;
            /* Prepend hide_z spaces to script text to hide it. */
            scrpt = malloc(hide_z + text_z);
            if (!scrpt)
                    return 0;
            memset(scrpt, (int) ' ', hide_z);
            memcpy(&scrpt[hide_z], text, text_z);
    } else {                        /* Reexecute */
            if (*xecc) {
                    scrpt = malloc(512);
                    if (!scrpt)
                            return 0;
                    sprintf(scrpt, xecc, me);
            } else {
                    scrpt = me;
            }
    }
    j = 0;
    varg[j++] = argv[0];            /* My own name at execution */
    if (ret && *opts)
            varg[j++] = opts;       /* Options on 1st line of code */
    if (*inlo)
            varg[j++] = inlo;       /* Option introducing inline code */
    varg[j++] = scrpt;              /* The script itself */
    if (*lsto)
            varg[j++] = lsto;       /* Option meaning last option */
    i = (ret > 1) ? ret : 0;        /* Args numbering correction */
    while (i < argc)
            varg[j++] = argv[i++];  /* Main run-time arguments */
    varg[j] = 0;                    /* NULL terminated array */

#if DEBUGEXEC debugexec(shll, j, varg); #endif execvp(shll, varg); return shll; }

int main(int argc, char ** argv) { #if DEBUGEXEC debugexec(«main», argc, argv); #endif #if !TRACEABLE untraceable(argv[0]); #endif argv[1] = xsh(argc, argv); fprintf(stderr, «%s%s%s: %s\n», argv[0], errno ? ": " : "", errno ? strerror(errno) : "", argv[1] ? argv[1] : «» ); return 1; }

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

#if !TRACEABLE

#define _LINUX_SOURCE_COMPAT #include <sys/ptrace.h> #include <sys/types.h> #include <sys/wait.h> #include <fcntl.h> #include <signal.h> #include <stdio.h> #include <unistd.h>

#if !defined(PTRACE_ATTACH) && defined(PT_ATTACH)

define PTRACE_ATTACH PT_ATTACH

#endif void untraceable(char * argv0) { char proc[80]; int pid, mine;

    switch(pid = fork()) {
    case  0:
            pid = getppid();
            /* For problematic SunOS ptrace */

#if defined(FreeBSD) sprintf(proc, «/proc/%d/mem», (int)pid); #else sprintf(proc, «/proc/%d/as», (int)pid); #endif close(0); mine = !open(proc, O_RDWR|O_EXCL); if (!mine && errno != EBUSY) mine = !ptrace(PTRACE_ATTACH, pid, 0, 0); if (mine) { kill(pid, SIGCONT); } else { perror(argv0); kill(pid, SIGKILL); } _exit(mine); case -1: break; default: if (pid == waitpid(pid, 0, 0)) return; } perror(argv0); _exit(1); } #endif /* !TRACEABLE */

char * xsh(int argc, char ** argv) { char * scrpt; int ret, i, j; char ** varg; char * me = argv[0];

    stte_0();
     key(pswd, pswd_z);
    arc4(msg1, msg1_z);
    arc4(date, date_z);
    if (date[0] && (atoll(date)<time(NULL)))
            return msg1;
    arc4(shll, shll_z);
    arc4(inlo, inlo_z);
    arc4(xecc, xecc_z);
    arc4(lsto, lsto_z);
    arc4(tst1, tst1_z);
     key(tst1, tst1_z);
    arc4(chk1, chk1_z);
    if ((chk1_z != tst1_z) || memcmp(tst1, chk1, tst1_z))
            return tst1;
    ret = chkenv(argc);
    arc4(msg2, msg2_z);
    if (ret < 0)
            return msg2;
    varg = (char **)calloc(argc + 10, sizeof(char *));
    if (!varg)
            return 0;
    if (ret) {
            arc4(rlax, rlax_z);
            if (!rlax[0] && key_with_file(shll))
                    return shll;
            arc4(opts, opts_z);
            arc4(text, text_z);
            arc4(tst2, tst2_z);
             key(tst2, tst2_z);
            arc4(chk2, chk2_z);
            if ((chk2_z != tst2_z) || memcmp(tst2, chk2, tst2_z))
                    return tst2;
            /* Prepend hide_z spaces to script text to hide it. */
            scrpt = malloc(hide_z + text_z);
            if (!scrpt)
                    return 0;
            memset(scrpt, (int) ' ', hide_z);
            memcpy(&scrpt[hide_z], text, text_z);
    } else {                        /* Reexecute */
            if (*xecc) {
                    scrpt = malloc(512);
                    if (!scrpt)
                            return 0;
                    sprintf(scrpt, xecc, me);
            } else {
                    scrpt = me;
            }
    }
    j = 0;
    varg[j++] = argv[0];            /* My own name at execution */
    if (ret && *opts)
            varg[j++] = opts;       /* Options on 1st line of code */
    if (*inlo)
            varg[j++] = inlo;       /* Option introducing inline code */
    varg[j++] = scrpt;              /* The script itself */
    if (*lsto)
            varg[j++] = lsto;       /* Option meaning last option */
    i = (ret > 1) ? ret : 0;        /* Args numbering correction */
    while (i < argc)
            varg[j++] = argv[i++];  /* Main run-time arguments */
    varg[j] = 0;                    /* NULL terminated array */

#if DEBUGEXEC debugexec(shll, j, varg); #endif execvp(shll, varg); return shll; }

int main(int argc, char ** argv) { #if DEBUGEXEC debugexec(«main», argc, argv); #endif #if !TRACEABLE untraceable(argv[0]); #endif argv[1] = xsh(argc, argv); fprintf(stderr, «%s%s%s: %s\n», argv[0], errno ? ": " : "", errno ? strerror(errno) : "", argv[1] ? argv[1] : «» ); return 1; }

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