请教如何把一个已经写好的 shell 脚本“内置”到 C 语言程序里并运行。

143 天前
 oneforall
shell 脚本的加密方法目前知道两种,一种是 shc ,另一种是 gzexe ,想试试一个新思路。

以下代码仅实现在 C 语言程序中运行 shell 脚本:

#include <stdio.h>
#include <stdlib.h>

int main() {
// 使用 system 函数调用 shell 脚本
int result = system("sh your_script.sh");

// 检查执行结果
if (result == -1) {
perror("Error executing the shell script");
return EXIT_FAILURE;
} else {
printf("Shell script executed successfully\n");
return EXIT_SUCCESS;
}
}

也在网上搜索到很多在 C 语言中逐行写入 shell 脚本命令的方法,觉得不太方便。请教大佬们怎么把一个已经编写好的 shell 脚本文件“内置”或者说“隐藏”到程序中,让人看起来就是一个可执行程序,每次运行程序时,就会“释放”这个 shell 脚本到/tmp 目录下,再执行 sh /tmp/myshell.sh
1879 次点击
所在节点    程序员
9 条回复
AoEiuV020JP
143 天前
管道,
ihciah
143 天前
首先实现功能的话没必要走文件,直接将内容 pipe 给 sh 或者作为 sh -c 的参数即可;其次你要加密这个就有点难了,至少你得把 sh 的逻辑自己实现一把,否则随便 alias sh 为一个 logger + 系统 sh 就能记录下来你的原始脚本(也是常见的渗透手段),你甚至不能在某个瞬间解压出明文脚本内容,否则直接 frida 挂上去就 dump 出来了。
proxytoworld
143 天前
释放文件不是直接释放吗
jiangaimin
143 天前
双击程序运行时,创建一个提前写好的脚本文件,运行之后再立即删除?如果脚本字符过多,可以考虑将字符以二进制形式写入到一个文件中?和程序放一起?用的时候读取。这样就算别人有文件,打开也是乱码~
vituralfuture
143 天前
首先确定一点,使用外部的 sh 肯定不行,因为不能保证/usr/bin/sh 没有被修改过,所以可以考虑找到 sh 的源码,然后在 sh 的基础上添加上要允许的脚本的字符串,调用 sh 源码中的函数直接解释 shell 脚本,另外还需要考虑一下混淆,免得别人反汇编就搞懂了,不过这样已经可以编译成可执行了,很容易混淆了,别人想看 shell 脚本难度就大多了
body007
142 天前
我查了下 sh -s 可以从标准输入中执行脚本,因此你可以将 sh 脚本加密成字符串存在 c 代码中,使用时解密,并启动子进程 sh -s ,然后把脚本传入 stdin 的标准输入就行。

SmiteChow
142 天前
想得太复杂了,脚本自解压自动执行就行了,搜索 makeself
GeekGao
142 天前
将 shell 脚本转化为二进制数据。你可以使用 xxd 工具来完成这个任务。xxd 是一个可以将任何文件转化为 C 语言数据声明的工具,这对于将二进制数据嵌入到 C 程序中非常有用。你可以使用以下命令来生成二进制数据:
xxd -i myshell.sh myshell.h

接下来,你需要在程序中包含这个生成的头文件,并使用这些数据。你可以使用 fwrite 函数来将这些数据写入到 /tmp 目录下的一个文件中,示例代码:
```
#include <stdio.h>
#include "myshell.h"

int main() {
FILE *file = fopen("/tmp/myshell.sh", "wb");
if (file == NULL) {
return 1;
}
fwrite(myshell, sizeof(myshell), 1, file);
fclose(file);
system("sh /tmp/myshell.sh");
return 0;
}

```
liberize
98 天前
参考我的项目:
https://github.com/liberize/ssc
目前用的是 c++14 constexpr 实现的编译时混淆。
还有一个思路是用 ssc 嵌入解释器的方式,把脚本加密后放到 data 段。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1001468

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX