是的,这可以做到。它在概念上与您的链接文章非常相似。诀窍是使用uuencode
将二进制文件编码为文本格式,然后将其粘贴到脚本的末尾。
然后,您的脚本以这样的方式编写,即它自己运行uudecode
以创建二进制文件,然后更改权限并执行它。
uuencode
和uudecode
最初是为了将二进制内容转移到互联网的前体而创建的,它并没有很好地处理二进制信息。转换为文本意味着它可以作为shell脚本发送。如果由于某种原因,当您尝试运行uuencode
时,您的分发抱怨,则可能意味着您必须安装它。例如,在Debian Squeeze上:
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
然后创建一个shell脚本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,[email protected]$!`0````````````(``P`!````$(,$"#0```#`[email protected]```````#0`(``'
M`"@`'@`;``8````T````-(`$"#2`!`[email protected]````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;[email protected]`;6%I;@!?:6YI=```
`
end
还有其他一些你应该担心的事情,例如你的程序可能需要目标系统上不存在的共享库,但上面的过程基本上是你需要的。
JAR文件的过程非常相似,只是运行方式不同。它仍然是一个单一的文件,但你需要更换行:
./hello
与能够运行的JAR文件,如东西:
java -jar hello.jar
向shell脚本添加一个'trap'rm -f hello'SIGINT'也是一个好主意,这样在用户Ctrl-C的程序中就可以清理临时文件。 –
是的,我不怀疑您可以对该代码进行大量的改进,并且这是一个很好的改进。我不想把它复杂得太多,因为我只是试图理解这个概念。 – paxdiablo
一个非常好的解释。谢谢 – Ankit