引用:http://www.vckbase.com/vckbase/vckbase12/vc/nonctrls/misc_21/1221002.htm

将多个文件合并成一个最终可执行文件,运行这个最终文件时,就相当于运行了合并前的多个文件。这种程序在木马程序合并中会经常用到,你想知道它是怎么用程序实现的么?下面我就用我用VC6.0做的一个文件捆绑器的例子代码来告诉你,程序运行后界面如下:

图一

基本组成思想:其实,其中的构成思想非常简单。建立一个新的二进制文件,先写入你的捆绑程序的数据和其文件长度,再写入你要捆绑的第一个文件的数据和其文件长度,后再直接写入你要捆绑的第二个文件的数据和文件长度……,最后就可直接写入你要捆绑的最后一个文件的数据(不需其文件长度)。最终文件被执行时,也就是将上面的方法思想倒过来既可。(下面实例仅告诉你如何实现二个文件的捆绑,至于多个文件的捆绑,读者只需略加改动既可,详情请细看下载后的实例代码。)
下面我来讲讲如何具体将其来实现:
1、捆绑多个文件为一个可执行程序
    先得到自身捆绑程序的文件长度和第一个要捆绑文件的文件长度,枚举第一个要捆绑文件有无图标,有的话就用它做为最终生成文件的图标,否则用自身捆绑程序所带默认图标做最终生成文件的图标。在新建二进制文件中写入自身捆绑程序的数据和其文件长度,再写入第一个要捆绑文件的数据及其文件长度,最后直接写入第二个文件的数据既可。
捆绑涵数代码实现如下:
//绑定多个文件为一个可执行文件

bool CBindFileDlg::Bind_Files()
{FILE* myself;   //自身文件FILE* out;      //最终合成文件FILE* in;       //待绑定文件int bytesin;int totalbytes = 0;struct _stat ST;unsigned int finder = 0x12345678;unsigned int i, k;int l=1;                //状态显示char buff[20];         //状态显示his_name = strFirstFilePath; //第一个绑定的文件名_stat(my_name, &ST);modify_data.my_length = ST.st_size;if (modify_data.my_length == 0){MessageBox("绑定文件中,自身文件长度为零时出错!","错误");return false;}buf = (BYTE *)malloc(modify_data.my_length);if (buf == NULL){MessageBox("绑定文件中,分配自身文件长度时出错!","错误");return false;}myself = fopen(my_name, "rb");  //打开自身文件if (myself == NULL){free(buf);MessageBox("绑定文件中,打开自身文件时出错!","错误");return false;}bytesin = fread(buf, 1, modify_data.my_length, myself);fclose(myself);if (bytesin != modify_data.my_length){free(buf);MessageBox("绑定文件中,不能完全读取自身文件内容时出错!","错误");return false;}for (i = 0; i < modify_data.my_length - sizeof(finder); i += sizeof(finder)){for (k = 0; k < sizeof(finder); k++){if (buf[i+k] != ((BYTE*)&finder)[k])break;}if (k == sizeof(finder))   //定位并保存自身数据文件大小{memcpy(buf+ i, &modify_data, sizeof(modify_data));break;}}if (i >= modify_data.my_length - sizeof(finder)){free(buf);MessageBox("绑定文件中,不能定位自身文件时出错!","错误");return false;}if (_stat(strFirstFilePath, &ST) != 0 || ST.st_size == 0){free(buf);MessageBox("绑定文件中,读取第一个要绑定文件时出错!","错误");return false;}list_my_icons();out = fopen(strFinalFilePath, "wb"); //创建最终合成文件if (out == NULL){free(buf);MessageBox("绑定文件中,创建绑定后生成的合成文件时出错!","错误");return false;}totalbytes += fwrite(buf, 1, bytesin, out);in = fopen(strFirstFilePath, "rb");  //打开第一个要绑定的文件if (in == NULL){free(buf);MessageBox("绑定文件中,打开第一个要绑定文件时出错!","错误");return false;}//写入第一个要绑定文件的长度到合成文件中totalbytes += fwrite(&ST.st_size, 1, sizeof(ST.st_size), out);//写入最终分解后文件执行方式的标志位(同步或异步执行)UpdateData(TRUE);  //传控件值到变量m_Sync中totalbytes += fwrite(&m_Sync, 1, sizeof(int), out);while (bytesin = fread(buf, 1, modify_data.my_length, in)){totalbytes += fwrite(buf, 1, bytesin, out);}fclose(in); //关闭第一个绑定文件句柄//设置进度条显示m_Progress.SetRange(0,500);for (int m = 0; m < 500; m++)m_Progress.SetPos(m);m_Parts = _ltoa(l, buff, 10);m_Parts += _T("个文件已绑定");UpdateData(FALSE);l++;in = fopen(strSecondFilePath, "rb");   //打开第二个要绑定的文件if (in == NULL){free(buf);MessageBox("绑定文件中,打开第二个要绑定文件时出错!","错误");return false;}while (bytesin = fread(buf, 1, modify_data.my_length, in)){totalbytes += fwrite(buf, 1, bytesin, out);}//设置进度条显示m_Progress.SetRange(0,500);for (int n = 0; n < 500; n++)m_Progress.SetPos(n);m_Parts = _ltoa(l, buff, 10);m_Parts += _T("个文件已绑定");UpdateData(FALSE);l++;fclose(in);  //关闭第二个绑定文件句柄fclose(out); //关闭最终合成文件句柄free(buf);   //释放缓冲区return true;
}
2、释放最终合成文件并同时运行它们。
   打开自身文件,从中得到自身捆绑程序的文件长度,便可将文件指针定位到第一个被捆绑文件的位置,读取其文件长度和其数据,将其读出数据写入第一个新建文件中。同样,通过已读取的自身捆绑程序文件长度和第一个被捆绑文件的文件长度加上其保存这两个文件长度值的字节数,既可准确定位第二个被捆绑文件的位置,读取其数据,写入到第二个新建文件中。同时,运行这两个文件,最后再删除这两个文件既可。
释放最终合成文件的代码具体实现如下:
//分解已合并的文件,同时运行它们
void CBindFileDlg::Unbind()
{FILE* myself;         //自身文件FILE* out;            //分解后文件int bytesin;int totalbytes = 0;char temp_exe1[] = "temp1.exe";  //分解后的绑定文件名一char temp_exe2[] = "temp2.exe";  //分解后的绑定文件名二int  SyncFlag;        //文件最终执行标志buf = (BYTE*)malloc(modify_data.my_length);myself = fopen(my_name, "rb");  //打开最终合成文件if (myself == NULL){free(buf);MessageBox("分离文件中,打开自身文件时出错!","错误");return;}out = fopen(temp_exe1, "wb");   //创建第一个绑定的文件if (out == NULL){free(buf);MessageBox("分离文件中,创建第一个被绑定文件时出错!","错误");return;}//将文件指针定位到捆绑器程序长度尾部fseek(myself, modify_data.my_length, SEEK_SET);//读取第一个绑定文件的长度 if (fread(&prog1_length, sizeof(prog1_length), 1, myself) == 0){free(buf);MessageBox("分离文件中,读取第一个被绑定文件长度时出错!","错误");return;}//读取最终文件执行方式(同步或异步执行)if (fread(&SyncFlag, sizeof(int), 1, myself) == 0){free(buf);MessageBox("分离文件中,读取第一个被绑定文件长度时出错!","错误");return;}//读取第一个文件内容并写入while (bytesin = fread(buf, 1, sizeof(buf), myself)){if (totalbytes + bytesin > prog1_length)bytesin = prog1_length - totalbytes;totalbytes += fwrite(buf, 1, bytesin, out);}fclose(out);  //关闭第一个绑定文件句柄#ifdef DEBUG_PRINTfprintf(stderr, "已复制 %d 字节!\n", totalbytes);
#endif DEBUG_PRINTtotalbytes = 0;out = fopen(temp_exe2, "wb");      //创建第二个绑定的文件if (out == NULL){free(buf);MessageBox("分离文件中,创建第二个被绑定文件时出错!","错误");return;}//将文件指针定位到最终合成文件中的第二个绑定文件头部, 偏移量 ==//(捆绑器自身文件长度+保存第一个绑定文件长度所占字节数+保存最终文件执行标志所占字节数+第一个绑定文件长度)fseek(myself, modify_data.my_length + sizeof(modify_data.my_length) + sizeof(int) + prog1_length, SEEK_SET);//读取第二个绑定文件内容并写入while (bytesin = fread(buf, 1, sizeof(buf), myself)){totalbytes += fwrite(buf, 1, bytesin, out);}fclose(out);  //关闭第二个绑定文件句柄#ifdef DEBUG_PRINTfprintf(stderr, "已复制 %d 字节\n", totalbytes);
#endif DEBUG_PRINTfclose(myself); //关闭最终合成文件句柄if (totalbytes == 0){free(buf);MessageBox("分离文件中,在自身文件中没有被分离的对象!","错误");return;}free(buf);   //释放缓冲区if(!SyncFlag) //0 -- 同步执行,1 -- 异步执行{//置为分解后,为同步执行方式Create_Process(temp_exe1, false); Create_Process(temp_exe2, false);}else{//置为分解后,为异步执行方式Create_Process(temp_exe1, true); Create_Process(temp_exe2, true);}
}
其中具体实现细节问题,可在下载实例代码后,仔细查看既可(内有详细注释)。

转载于:https://www.cnblogs.com/sode/archive/2012/01/25/2329308.html

将多个文件绑在一起执行相关推荐

  1. python运行文件后缀_Python程序存储成以.py为扩展名的程序文件用Python解释器执行。(4.5分)_学小易找答案...

    [简答题]简述助跑的两种起动方式? [填空题]在跳远技术的发展过程中,曾经出现过 . . .等3中姿势. [判断题]一般情况下,Python语言中使用符号#表示程序中的注释.(4.5分) [论述题]请 ...

  2. [Oracle运维工程师手记] 如何从trace 文件,判断是否执行了并行

    [Oracle运维工程师手记系列]如何从trace 文件,判断是否执行了并行 客户说,明明指定了并行的hint,OEM 却报说没有并行,并且提供了画面. 客户的SQL文长这样: INSERT/*+ p ...

  3. linux运行不了.sh文件,linux下不能执行/bin/sh脚本的原因:command not found

    Linux下执行.sh脚本错误:bin/sh^M: bad interpreter: No such file or directory 原因是.sh脚本在windows系统下用记事本文件编写的.不同 ...

  4. 【Ubuntu16.04】解决Qt安装包(.run文件)不能用./命令执行的问题

    [Ubuntu16.04]解决Qt安装包(.run文件)不能用./命令执行的问题 参考文章: (1)[Ubuntu16.04]解决Qt安装包(.run文件)不能用./命令执行的问题 (2)https: ...

  5. 不是二进制MAT文件,请尝试执行 load -ASCII 以便以文本形式读取

    错误: 错误使用load,不是二进制MAT文件,请尝试执行load-ASCII以便以文本形式读取 解决方法 将load替换为dlmread去读取文件 原方法:data = load 路径\文件名.ma ...

  6. load函数无法打开MAT文件:不是二进制 MAT 文件。请尝试执行 load -ASCII 以便以文本形式读取。

    load函数无法打开MAT文件 问题描述 报错:不是二进制 MAT 文件.请尝试执行 load -ASCII 以便以文本形式读取. 原因分析: Matlab2021a及以下版本用load函数读取MAT ...

  7. el-upload 多文件 上传 只执行一次成功回调on-success的问题

    一.问题背景** 背景:使用element的上传组件,在使用多文件上传时,发现如果同时选择两个文件,上传完成之后,upload组件的列表只显示一个文件. 通过查看控制台发现on-success方法在上 ...

  8. Goby 漏洞更新 | 速达软件 V.NET home 文件 存在 Struts2 代码执行漏洞

    漏洞名称: 速达软件 V.NET home 文件 存在 Struts2 代码执行漏洞 English Name:Superdata Software V.NET Struts2 Code Execut ...

  9. ifix5.8 启动过程中 iFX系统未启动!Profice iFIX 启动文件末找到无法执行任务:IOCNTRL.EXE

     错误提示: iFX系统未启动! Profice iFIX启动 文件末找到 无法执行任务:IOCNTRL.EXE 未检测到SCADA冗余对 无法找到I/O启动器的配置程序 解决过程:找到以下贴子 IF ...

最新文章

  1. C++实现平衡二叉树
  2. BZOJ 2431 HAOI2009 在列的数目的顺序相反 递归
  3. 科大星云诗社动态20201210
  4. 内网通修改积分文件_转盘抽奖分享得积分,你是如何防止页面被恶意刷新的
  5. hdu 1241Oil Deposits(BFS)
  6. 建筑公司木地板WordPress企业网站模板
  7. 朋友们给《Java程序员,上班那点事儿》的赠言
  8. Fluent.TGrid.v4.0.16
  9. 如何写好一篇博客(文章)
  10. ios微信浏览器, 系统浏览器cookie 丢失问题
  11. 统计学基础——方差、协方差、标准差(标准偏差/均方差)、标准误、均方误差、均方根误差(标准误差)的区别
  12. 求出本周是第几周,本周的周一和周日时间
  13. 鸿蒙系统安兔兔,5摄镜头+鸿蒙系统!华为P40系列曝光
  14. 计算机网络实验三—— Cisco Packet Tracer 实验
  15. scp_linux之间互传文件
  16. This application failed to start because no Qt platform plugin could be initialized. 报错解决方法
  17. 备份vmware虚拟机,failed. Error 2 (Memory allocation failed. Out of memory.) (DiskLib error 802
  18. 一文了解Jeff Bezos,电商与公有云的“世界首富”
  19. mysql时间12小时制_mysql 12小时和24小时转换
  20. 什么是python 之禪

热门文章

  1. 2.vue的diff算法(2020.12.07)
  2. 动态图制作软件设计(三)
  3. 【jQuery学习】—jQuery操作元素位置
  4. 计算机网络学习(九)—应用层的概述
  5. JavaScript学习(十六)—实现购物车加减数量,计算总金额
  6. c++字符数组整数转换中文大写金额的形式_如何对PHP日期数组进行排序
  7. 越成功的人越能直面人性的欲望
  8. 餐饮创业想赚钱,这5个思维方式少不了
  9. Qt——P26 Label控件显示图片
  10. wget在进行https下载时超时不生效问题