簡體   English   中英

在C程序中嵌入二進制文件

[英]Embed a binary in C program

我試圖用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標頭不是函數。 你不能叫它。 如果可以(例如采用某些古老的二進制格式),這將是一個非常糟糕的主意,因為它永遠也不會返回。

如果要在中間運行另一個程序,請執行以下操作:

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);

為簡潔起見,省略了錯誤處理。

對於您的情況,您應該將自己的二進制副本與程序一起發送。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM