You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python/C++等语言从已编译程序生成可执行文件?无编译器方案咨询

实现无编译器的自定义可执行文件生成方案

这问题本质上是要做带参数的可执行文件生成器——不用依赖目标机器上的编译器,核心思路就是复用预先编译好的程序模板,把用户的自定义内容嵌入进去。下面给你拆解几个实用的方案,从简单到进阶:

方案1:预编译模板+固定缓冲区注入

这是最直观的方法,步骤大概是:

  • 先写一个模板程序(比如用C/C++编译成template.exe),在代码里预留一块固定大小的缓冲区,用来存储自定义数据。比如:
    // 模板程序代码
    #include <iostream>
    #include <cstring>
    
    // 预留标记和缓冲区,方便生成器定位
    char __attribute__((section(".custom"))) marker[] = "MY_CUSTOM_DATA_MARKER";
    char __attribute__((section(".custom"))) custom_text[256] = "Default Text";
    
    int main() {
        std::cout << "Custom content: " << custom_text << std::endl;
        return 0;
    }
    
  • 编译模板后,用PE编辑器(比如PEview)找到.custom节的偏移地址,或者让生成器直接搜索MY_CUSTOM_DATA_MARKER这个字符串,定位到后面的custom_text缓冲区。
  • 生成器(用Python/C都可以)打开template.exe,定位到缓冲区偏移,把用户输入的文本写入,然后另存为新的output.exe
  • 注意:要限制用户输入的长度不超过缓冲区大小,避免破坏程序的其他段。

方案2:PE资源段替换

Windows的PE文件有专门的资源段,可以存放字符串、图标、对话框等资源,这种方式更安全,不会破坏代码逻辑:

  • 模板程序中,把需要自定义的内容放到资源里。比如在资源文件(.rc)中定义:
    STRINGTABLE
      BEGIN
          1 "Default Display Text"
      END
    然后在代码中读取资源:
    #include <windows.h>
    #include <iostream>
    
    int main() {
        char buffer[256];
        LoadString(NULL, 1, buffer, sizeof(buffer));
        std::cout << buffer << std::endl;
        return 0;
    }
    
  • 生成器可以用Python的pefile库解析PE文件,找到资源段中的字符串资源,替换成用户输入的内容,再保存为新的exe。这种方式不用修改代码段,兼容性更好。

方案3:附加数据到PE文件末尾

PE文件允许在末尾追加额外数据,系统加载时只会读取头部指定的有效内容,附加的数据不会被加载到内存,但程序可以自己读取:

  • 模板程序运行时,先获取自身的路径,打开文件,跳到文件末尾读取附加的自定义数据:
    #include <iostream>
    #include <fstream>
    #include <windows.h>
    
    int main() {
        char path[MAX_PATH];
        GetModuleFileName(NULL, path, MAX_PATH);
        std::ifstream file(path, std::ios::binary | std::ios::ate);
        if (file.is_open()) {
            // 假设我们约定附加数据的长度是256字节
            std::streampos size = file.tellg();
            file.seekg(size - 256);
            char custom_data[256];
            file.read(custom_data, 256);
            std::cout << "Custom content: " << custom_data << std::endl;
        }
        return 0;
    }
    
  • 生成器的工作很简单:打开template.exe,把用户输入的文本(补全到256字节)追加到文件末尾,然后另存为output.exe。这种方式不需要解析复杂的PE结构,实现成本最低。

方案4:代码段补丁(进阶)

如果需要修改程序的硬编码逻辑(比如替换恶意程序中的邮箱地址),可以找到模板程序中目标数据的内存偏移,直接修改代码段:

  • 比如模板程序中有char* target_email = "default@example.com";,编译后这个字符串会存放在数据段。用反汇编工具(比如x64dbg)找到这个字符串的偏移地址。
  • 生成器打开模板exe,定位到该偏移,把用户输入的邮箱覆盖进去。注意:如果新字符串长度和原字符串不一致,可能会破坏后面的数据,导致程序崩溃,所以通常需要保证长度一致,或者用更复杂的跳转方式(比如把新字符串写到空闲段,然后修改指针指向新地址)。

注意事项

  • 不同架构(x86/x64)的PE文件结构不同,生成器要对应处理,不能混用模板。
  • 这类工具容易被杀毒软件判定为恶意程序,因为很多恶意软件用类似方法生成变种,测试时需要注意。
  • 操作PE文件时,要避免破坏文件头、节表等关键结构,否则生成的exe会无法运行。

内容的提问来源于stack exchange,提问作者voyager_1

火山引擎 最新活动