从pipe道执行代码

我一直在做一个小小的黑客来获取可执行文件的文件大小。 我知道有一些工具可以正确执行可执行压缩,但这比我认为的更重要。

我的想法是用gzip压缩可执行文件,然后将其embedded另一个称为启动程序的c程序中作为数组。 当发射器运行时,它会build立一个如下的pipe道系统:

parent launcher -> fork 1 of launcher -> fork 2 of launcher 

fork 1把它自己变成gzip,所以它解压任何父进程,并将解压后的版本吐出到fork 2。

这里是黑客踢的地方.Fork 2试图执行文件“/ dev / fd / n”,其中n是从fork 1到fork 2的pipe道的文件编号。本质上,这意味着fork 2将尝试执行任何二进制gzip吐出。

然而,这是行不通的(意外的惊喜)。我试着对我的样例实现进行testing,执行“/ dev / fd / n”的execv的行返回-1 EACCES(Permission denied)。 但是,如果我打开一个terminal并运行ls -l /dev/fd/我得到如下所示:

 lrwx------ 1 blackle users 64 Nov 10 05:14 0 -> /dev/pts/0 lrwx------ 1 blackle users 64 Nov 10 05:14 1 -> /dev/pts/0 lrwx------ 1 blackle users 64 Nov 10 05:14 2 -> /dev/pts/0 lr-x------ 1 blackle users 64 Nov 10 05:14 3 -> /proc/17138/fd 

他们都有权限+ x的用户(我)这意味着它应该是可执行的,不是? 或者这只是一个非常奇怪的内核边缘情况, 说它没有得到权限,但实际上它不能执行,因为它不是一个真正的文件。

只有mmap能够执行的文件。 不幸的是,由于序列性质和有限的缓冲区大小(可能需要重新读取先前的代码,现在在阅读一次之后将会消失),管道是不可以这样做的。

你会有更多的运气,而不是使用管道在ramfs中创建文件,将其映射到父节点的内存空间的一个区域,将解压缩的代码复制到mmap中,最后让子节点执行文件ramfs,最后在父文件的ramfs中取消链接文件,以便在子文件退出时自动释放文件。

希望这有帮助,如果有什么不清楚的请评论。