【发布时间】:2011-01-02 11:00:15
【问题描述】:
我正在尝试弄清楚如何执行存储在内存中的机器代码。
我有以下代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
FILE* f = fopen(argv[1], "rb");
fseek(f, 0, SEEK_END);
unsigned int len = ftell(f);
fseek(f, 0, SEEK_SET);
char* bin = (char*)malloc(len);
fread(bin, 1, len, f);
fclose(f);
return ((int (*)(int, char *)) bin)(argc-1, argv[1]);
}
上面的代码在 GCC 中编译得很好,但是当我尝试像这样从命令行执行程序时:
./my_prog /bin/echo hello
程序段错误。我发现问题出在最后一行,因为注释掉它会停止段错误。
我认为我做的不太对,因为我仍在思考函数指针。
问题是演员阵容错误还是其他原因?
【问题讨论】:
-
查理:如果你曾经理解所有这些答案,而不是像你拥有的那样使用指向函数的转换指针,你可能更适合编写一些动态管理堆栈参数的基本 thunk .如果使用 gcc,则声明为“function() attribute ((naked));”的函数有关更多示例,请参阅gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html。这样,您调用相同的函数来决定是否需要为动态加载的代码提供 N 个参数/调用约定等...无论哪种方式,您都应该查看 FFI 等。
-
我很确定 OP 只是误解了可执行文件如何工作的基本原理。使用动态链接库执行您自己的动态代码,并使用 exec 执行其他应用程序。
-
@Jimbo - 你完全正确。我想看看我能不能做到这一点,所以我想“我在哪里可以找到机器代码?”,并决定直接抓取一个可执行文件而不加考虑:/
-
你可能有一些运气编译到 Web 程序集。
标签: c segmentation-fault function-pointers casting