V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
oneforall
V2EX  ›  程序员

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

  •  
  •   oneforall · 356 天前 · 2113 次点击
    这是一个创建于 356 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    9 条回复    2024-02-01 08:51:33 +08:00
    AoEiuV020JP
        1
    AoEiuV020JP  
       356 天前 via Android
    管道,
    ihciah
        2
    ihciah  
       356 天前   ❤️ 1
    首先实现功能的话没必要走文件,直接将内容 pipe 给 sh 或者作为 sh -c 的参数即可;其次你要加密这个就有点难了,至少你得把 sh 的逻辑自己实现一把,否则随便 alias sh 为一个 logger + 系统 sh 就能记录下来你的原始脚本(也是常见的渗透手段),你甚至不能在某个瞬间解压出明文脚本内容,否则直接 frida 挂上去就 dump 出来了。
    proxytoworld
        3
    proxytoworld  
       356 天前
    释放文件不是直接释放吗
    jiangaimin
        4
    jiangaimin  
       356 天前
    双击程序运行时,创建一个提前写好的脚本文件,运行之后再立即删除?如果脚本字符过多,可以考虑将字符以二进制形式写入到一个文件中?和程序放一起?用的时候读取。这样就算别人有文件,打开也是乱码~
    vituralfuture
        5
    vituralfuture  
       356 天前 via Android
    首先确定一点,使用外部的 sh 肯定不行,因为不能保证/usr/bin/sh 没有被修改过,所以可以考虑找到 sh 的源码,然后在 sh 的基础上添加上要允许的脚本的字符串,调用 sh 源码中的函数直接解释 shell 脚本,另外还需要考虑一下混淆,免得别人反汇编就搞懂了,不过这样已经可以编译成可执行了,很容易混淆了,别人想看 shell 脚本难度就大多了
    body007
        6
    body007  
       355 天前
    我查了下 sh -s 可以从标准输入中执行脚本,因此你可以将 sh 脚本加密成字符串存在 c 代码中,使用时解密,并启动子进程 sh -s ,然后把脚本传入 stdin 的标准输入就行。

    SmiteChow
        7
    SmiteChow  
       355 天前
    想得太复杂了,脚本自解压自动执行就行了,搜索 makeself
    GeekGao
        8
    GeekGao  
       355 天前
    将 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
        9
    liberize  
       311 天前 via Android
    参考我的项目:
    https://github.com/liberize/ssc
    目前用的是 c++14 constexpr 实现的编译时混淆。
    还有一个思路是用 ssc 嵌入解释器的方式,把脚本加密后放到 data 段。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   793 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:45 · PVG 03:45 · LAX 11:45 · JFK 14:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.