c - 在 C 程序中嵌入二进制文件

标签 c binary

我正在尝试用 C 语言编写一个程序,该程序能够使用选项调用某些二进制文件(例如 lsof、netstat)。该程序的目的是从计算机收集取证数据,同时该程序不应使用被分析计算机的二进制文件,因为它们可能会受到威胁。因此,要求已认证/未妥协的二进制文件(例如 lsof、netstat -antpu 等)已经嵌入到 C 程序中或被存储在 USB 驱动器中的 C 程序调用。

  1. 例如,使用“ls”命令的二进制文件,我使用链接器创建了一个目标文件,如下所示:
    $ ld -s -r -b binary -o testls.o bin-x86-2.4/ls
  1. 使用以下命令,我从目标文件中提取了以下入口点
    $ nm testls.o

    000000000007a0dc D _binary_bin_x86_2_4_ls_end
    000000000007a0dc A _binary_bin_x86_2_4_ls_size
    0000000000000000 D _binary_bin_x86_2_4_ls_start
  1. 下一步是使用我可能需要的一些选项从主程序调用“函数”,例如“ls -al”。因此,我编写了一个C程序来调用目标文件的入口点。

  2. 然后我使用以下 gcc 选项编译程序

    gcc -Wall -static testld.c testls.o -o testld

这是主程序:

#include <stdio.h>

extern int _binary_bin_x86_2_4_ls_start();

int main(void)  
{
    _binary_bin_x86_2_4_ls_start();
    return 0;
}

当我运行该程序时出现段错误。我在 teSTLd 程序中使用 objdump 检查了入口点,链接似乎成功了。为什么我会遇到段错误? 我还需要用选项调用“ls”。我该怎么做,即使用参数“-al”调用“函数”。

谢谢。

最佳答案

二进制文件的 ELF header 不是函数。你不能调用它。如果可以(比如某些古老的二进制格式),那将是一个非常糟糕的主意,因为它永远不会返回。

如果您想在中途运行另一个程序,请执行以下操作:

int junk;
pid_t pid;
if (!(pid = fork())) {
    execl("ls", "/bin/ls", ...); /* this results in running ls in current directory which is probably what you want but maybe you need to adjust */
    _exit(3);
}
if (pid > 0) waitpid(pid, &junk, 0);

为简洁起见省略了错误处理。

在您的情况下,您应该将自己的二进制文件副本与您的程序一起发送。

关于c - 在 C 程序中嵌入二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57776925/

相关文章:

C - 将枚举用于位标志 - 警告 : enumerated type mixed with another type

c - 在赋值中使用后缀/后缀运算符

r - 使用大型数据集在 R 中创建二元矩阵

c - 如何获取目录中的目录数?

c++ - sprintf函数的问题,last参数写错了

c - C 中接收函数调用

C++ cout 二进制值

c - 如何在 C 中将 double 据类型可移植地写入文件

algorithm - 在数学上如何将分类结果与聚类结果进行比较

c++ - 用 Big-O Notation 计算我的程序的算法复杂度