如何用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




