[英]Embed a binary in C program
我試圖用C編寫一個程序,該程序可以使用選項調用某些二進制文件(例如lsof,netstat)。 該程序的目的是從計算機收集取證數據,與此同時,該程序不應使用被分析計算機的二進制文件,因為它們可能會受到威脅。 結果,要求已認證/未破壞的二進制文件(例如lsof,netstat -antpu等)已經嵌入到C程序中,或由例如存儲在USB驅動器中的C程序調用。
$ ld -s -r -b binary -o testls.o bin-x86-2.4/ls
$ 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
下一步將是使用可能需要的一些選項從主程序中調用“函數”,例如“ ls -al”。 因此,我制作了一個C程序來調用目標文件的入口點。
然后我用以下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.