Translate

вівторок, 12 листопада 2013 р.

Shc: compile bash-script to binary view

Скоріш за все вам навіть це не спадало на думку, проте так, насправді, є можливість скомпілювати bash-скрипт у бінарний вигляд. Щоправда це не зовсім так, адже програма, мова про яку піде далі, спочатку транслює bash-скрипт в Cі-скрипт, а вже потім його компілює. Як наслідок, ніхто і ніколи не побачить того, що було "накостилячено" в скрипті. Проте таким чином також можна заборонити редагування коду чи приховати паролі, котрі вживаються в скрипті і мають бути недоступні всім іншим. 

Ім'я цієї програми Shc і, на щастя, вона відсутня в репозиторіях. Тому зкомпілюємо її :

# wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz
--2013-11-12 01:40:16--  http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz
Resolving www.datsi.fi.upm.es (www.datsi.fi.upm.es)... 138.100.9.22
Connecting to www.datsi.fi.upm.es (www.datsi.fi.upm.es)|138.100.9.22|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 20536 (20K) [application/x-gzip]
Saving to: ‘shc-3.8.9.tgz’

100%[====================================================>] 20 536      --.-K/s   in 0,1s    

2013-11-12 01:40:16 (150 KB/s) - ‘shc-3.8.9.tgz’ saved [20536/20536]

# tar xvfz shc-3.8.9.tgz
shc-3.8.9/CHANGES
shc-3.8.9/Copying
shc-3.8.9/match
shc-3.8.9/pru.sh
shc-3.8.9/shc-3.8.9.c
shc-3.8.9/shc.1
shc-3.8.9/shc.README
shc-3.8.9/shc.html
shc-3.8.9/test.bash
shc-3.8.9/test.csh
shc-3.8.9/test.ksh
shc-3.8.9/makefile

# cd shc-3.8.9

В останній версії є маленькі проблеми з назвами:

# cp shc-3.8.9.c shc.c

Збираємо програму:

# make
cc -Wall  shc.c -o shc
*** Do you want to probe shc with a test script?
*** Please try... make test

І за бажанням можна скопіювати скрипти в системні директорії:

# make install
*** Installing shc and shc.1 on /usr/local
*** Do you want to continue? y
install -c -s shc /usr/local/bin/
install -c -m 644 shc.1 /usr/local/man/man1/

Тепер найцікавіше. Продемонструю роботу програми на звичайному простому срипту, що має вигляд:

# vim myscript.sh
#!/bin/bash
echo "Enter your name: "
read Name
echo "Your name is $Name"

Нічого хитрого. Зберігаємо скрипт і запускаємо наступне:

$ shc -v -r -T -f myscript.sh
shc shll=bash
shc [-i]=-c
shc [-x]=exec '%s' "$@"
shc [-l]=
shc opts=
shc: cc  myscript.sh.x.c -o myscript.sh.x
shc: strip myscript.sh.x
shc: chmod go-r myscript.sh.x

Значення ключів можна почитати в мануалі, там все просто. На виході отримуємо:

myscript.sh.x - транслюваний скрипт в Сі код.
myscript.sh.x.c - зкомпільований бінарник.

$ file myscript.sh.x
myscript.sh.x: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xdac86a0ceb75a17e74f4c66d64d4278791b305d7, stripped
$ file myscript.sh.x.c
myscript.sh.x.c: C source, ASCII text

Запускаємо скомпільований скрипт:

$ ./myscript.sh.x.c
Enter your name: 
Ipeacocks
Your name is Ipeacocks

Ніби все. Проте додам, що варто не зловживати такими речами, адже shell-скрипт має залишатися shell-скриптом. Ось декілька посилань, що, можливо, будуть корисними:

Немає коментарів:

Дописати коментар