はい、これは可能です。実際には、リンクされた記事と概念が非常に似ています。秘訣はuuencode
、バイナリをテキスト形式にエンコードしてから、スクリプトの最後に追加することです。
次に、スクリプトは、uudecode
それ自体で実行されてバイナリファイルを作成し、アクセス許可を変更してから実行するように記述されます。
uuencode
もともとは、uudecode
インターネットの前身でバイナリコンテンツをシフトするために作成されたもので、バイナリ情報をうまく処理できませんでした。テキストへの変換は、シェルスクリプトとしても出荷できることを意味します。何らかの理由で、実行しようとしたときにディストリビューションに不満がある場合はuuencode
、おそらくそれをインストールする必要があることを意味します。たとえば、DebianSqueezeでは次のようになります。
sudo aptitude install sharutils
関連する実行可能ファイルを取得します。これが私が経験したプロセスです。まず、Cプログラムを作成してコンパイルしますhello.c
。
pax> cat hello.c
#include <stdio.h>
int main (void) {
printf ("Hello\n");
return 0;
}
pax> gcc -o hello hello.c
testEmbed.sh
次に、それ自体をデコードするシェルスクリプトを作成します。
pax> cat testEmbed.sh
#!/bin/bash
rm -f hello
uudecode $0
./hello
rm -f hello
exit
最初のrm
ステートメントは、hello
実行可能ファイルがこのスクリプトによって新たに作成されており、コンパイルからぶら下がっていないことを示しています。ファイルにもペイロードが必要なので、エンコードされた実行可能ファイルをファイルの最後に添付します。
pax> uuencode hello hello >>testEmbed.sh
その後、スクリプトを実行するtestEmbed.sh
と、実行可能ファイルが抽出されて実行されます。
これが機能する理由は、入力(および)で、によって配置されuudecode
た特定のマーカー行を検索するためです。したがって、スクリプト全体ではなく、エンコードされたプログラムのみをデコードしようとします。begin
end
uuencode
pax> cat testEmbed.sh
#!/bin/bash
rm -f hello
uudecode $0
./hello
rm -f hello
exit
begin 755 hello
M?T5,1@$!`0````````````(``P`!````$(,$"#0```#`!@```````#0`(``'
M`"@`'@`;``8````T````-(`$"#2`!`C@````X`````4````$`````P```!0!
: : :
M:&%N9&QE`%]?1%1/4E]%3D1?7P!?7VQI8F-?8W-U7VEN:70`7U]B<W-?<W1A
M<G0`7V5N9`!P=71S0$!'3$E"0U\R+C``7V5D871A`%]?:38X-BYG971?<&-?
4=&AU;FLN8G@`;6%I;@!?:6YI=```
`
end
プログラムがターゲットシステムに存在しない共有ライブラリを必要とする可能性など、おそらく心配する必要がある他のことがありますが、上記のプロセスは基本的に必要なものです。
JARファイルのプロセスは、実行方法が異なることを除いて、非常に似ています。それはまだ単一のファイルですが、次の行を置き換える必要があります。
./hello
次のようなJARファイルを実行できるものを使用します。
java -jar hello.jar