我想为@Suroot 和这篇精彩的文章提供道具:http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967
但是,整个过程在Linux命令行下是这样的:
...首先,您需要在Linux上,需要启用命令行PHP(CLI),并且命令行中的PHP在执行“php -v”或通过测试时不应出现任何错误您知道通常可以在命令行中运行的脚本。
...其次,你需要安装 GCC 来编译 C 程序。
...创建一个工作目录并 'cd' 进入它。
...创建一个包含以下测试代码的文件 script.php:
<?php
$s1 = @ $argv[1];
$s2 = @ $argv[2];
$s3 = @ $argv[3];
for($i=0;$i<=10;$i++){
echo "($s1) ($s2) ($s3)\n";
}
...注意,这只是我们的测试。证明测试有效后,您可以稍后将自己的 PHP 代码放入其中。
...请注意,“script.php”的命名至关重要,否则 main.c 在到达_binary_script_php_start 行时将无法工作。起初通过我进行了一个循环,因为我没有想到变量名被这个过程粘住了。
...创建一个包含以下代码的 C 代码文件 main.c:
#include <stdio.h>
#include <stdlib.h>
extern char _binary_script_php_start;
extern char _binary_script_php_end;
int main(int argc, char *argv[]) {
// EXTRACT OUR RESOURCE OBJECT INTO /tmp/test.php
char *p = &_binary_script_php_start;
FILE *fp = fopen("/tmp/test.php","wb");
while ( p != &_binary_script_php_end ) {
fputc(*p++,fp);
}
fclose(fp);
// NOW READ IN OUR STANDARD ARGUMENTS AND LAUNCH OUR COMMAND
int i = 1;
char *cmd = "php /tmp/test.php";
char *s = NULL;
asprintf(&s, "%s",cmd);
for(i = 1; i < argc; i++) {
asprintf(&s, "%s \"%s\"",s,argv[i]);
}
system(s);
free(s);
unlink("/tmp/test.php"); // comment me out for debugging if you want
}
...注意,我对 C 有点生疏(自 1980 年代以来就没有使用过),并且不建议使用 strcpy(),因为它不安全。所以,我read up on StackOverflow 我们应该在 GNU Linux 系统上使用 asprintf()。 显然 asprintf() 处理缓冲区溢出和 malloc 问题?我当然希望如此——我不想在这里误导你。请研究一下!
...现在魔法开始了!
...我们需要使用这个命令行命令将 script.php 嵌入到一个目标文件“data.o”中(因此从 $ 提示符开始):
$ objcopy -I binary -O elf32-i386 -B i386 script.php data.o
...现在我们构建命令“runme”,将“data.o”和“main.c”链接在一起:
$ gcc main.c data.o -o runme
...然后为我们编译了一个名为“runme”的 C 程序。然后我们可以执行它来测试它:
$ ./runme "test1" "test2 test3" "test4"
...您应该看到如下输出:
(test1) (test2 test3) (test4)
(test1) (test2 test3) (test4)
(test1) (test2 test3) (test4)
(test1) (test2 test3) (test4)
(test1) (test2 test3) (test4)
(test1) (test2 test3) (test4)
(test1) (test2 test3) (test4)
(test1) (test2 test3) (test4)
(test1) (test2 test3) (test4)
(test1) (test2 test3) (test4)
(test1) (test2 test3) (test4)
...如您所见,双引号实际上很重要——它们告诉 C 和 PHP,参数应该组合在一起。这就是为什么 test3 没有出现在最后一个括号中的原因。如果没有双引号,您将看到完全不同的结果。
此时,您将了解我们如何制作一个内置 PHP 脚本并在 Linux 上运行的 C 程序。 (Mac、Windows——您可能需要对这段代码进行一些调整。)C 程序将我们的 PHP 脚本扩展为 /tmp,执行它,并将我们可以读入和使用的参数传递给它。从这里开始,您可以根据需要修改 script.php,并且您可以了解如何使用唯一的文件名,这样您就不会破坏其他人的 /tmp/test.php 文件,以防万一。