通行证: 用户 密码 域名空间  下载中心 社区论坛 信息公告 MY小屋
联系我们
设为首页
加入收藏

 

QQ,ASP,PHP,JSP,XML,SQL,.Net,编程 程序 网页图象 建站经验 私服
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿
论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图
专题 | 应用软件 | 聊天通讯 | Q Q 专栏 | 建站经验 | 在线工具 | 站长Club | 注 册 表 | 旧版
社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务
当前位置:首页>>编程开发>>VC编程>>正文 新版上线![旧版]
注:打开慢时请稍等

实例编程:用VC写个文件捆绑工具

http://www.iyit.net  日期:2006-5-23 11:45:33  来源:本站整理转载   点击:
参加讨论    在2002年刚学VC的时候写过文件捆绑工具,当时是配合自己写的一个QQ木马使用。后来去年在某个论坛上有人问起了文件捆绑的事,我就翻出以前的程序,写下了这篇文档,今天整理硬盘的时候,把这文章发了上来,其实很简单。

文件捆绑可以用在很多地方,比如木马。也可以在发行软件的时候把DLL捆绑在EXE文件后面,然后在EXE执行的时候动态调用DLL等等。。

编译环境:WIN2K+VC6。

先假设我们要把 test1.exe和test2.exe这两个文件捆绑成target.exe这一个文件,然后在运行target.exe的时候实现同时运行test1.exe和test2.exe。

提一个小常识,PE格式的文件只要不修改文件头和文件中间的内容,而只是在文件末尾添加数据,那么这个PE文件可以正常执行。你可以试一试在命令行方式下执行copy test1.exe+test2.exe,命令执行完成后,test2.exe被添加到test1.exe文件尾,执行合并后的test1.exe虽然正常,但是test2.exe得不到执行。OK,这就是我们今天要解决的问题。我的想法是这样的。把三个文件捆绑在一起,捆绑后target.exe实际包含三个文件,其中aaa.exe是我们自己写的程序,test1.exe和test2.exe是我们要捆绑的程序。

结构如下

---------------------------------------
|aaa.exe|test1.exe|test2.exe|
---------------------------------------

整个文件就叫target.exe,如果结构如上所示,那么我们执行target.exe的时候实际上只有aaa.exe才会得到执行,这里的aaa.exe是我们自己写的,我们就让aaa.exe多做点事,他要做的事就是:1、把test2.exe读出来另存为c:\test2.exe,把test1.exe的内容读出来另存为c:\test1.exe。2、调用CreateProcess来创建两个新进程运行test1.exe和test2.exe。3、调用ExitProcess结束自身的进程。

这样一来我们的目的就达到了。同时为了隐蔽起见,我们可以把aaa.exe的窗口界面不显示出来。

但是又有一个问题,读取的时候怎样才能分辨出哪一段数据是test1.exe,哪一段数据是test2.exe?那我们就再想办法把上面的结构再扩充一下。

-----------------------------------------------------
|aaa.exe|test1.exe|test2.exe|len2|len1|
-----------------------------------------------------

在文件最后面再加两段数据,分别用来存放test1.exe的文件长度和test2.exe的文件长度。并且固定len2和len1为30字节的长度。这样在aaa.exe得到执行的时候先后面的两个30字节内容,内容就是两个文件的长度,再根据这两个长度就可以准确读取到test1.exe和test1.exe的内容。

看看aaa.exe程序的关键代码:

     CFile fSource(_pgmptr,CFile::modeRead | CFile::modeNoTruncate); //得到target.exe的文件长度
     int iSourceLength = fSource.GetLength();
     fSource.Seek(iSourceLength-60,CFile::begin);//移动文件指针到第test2.exe文件的末尾

     char buffer[40];
     ZeroMemory(buffer,40);
     fSource.Read(buffer,30);//读取第len2的内容,也就是test2.exe的长度

     int iTargetLength = atoi(buffer);
     fSource.Seek(iSourceLength-iTargetLength-60,CFile::begin);//移动文件指针到test2.exe文件的开头

     CFile fTarget("c:\\test2.exe",CFile::modeCreate | CFile::modeWrite |

CFile::modeNoTruncate);//创建一个新文件为c:\\test2.exe

     char *pBuffer = new char[iTargetLength];//分配缓冲区
     ZeroMemory(pBuffer,iTargetLength);
     fSource.Read(pBuffer,iTargetLength);//将第test2.exe文件读到缓冲区
     fTarget.Write(pBuffer,iTargetLength);//将缓冲区内容写入c:\test2.exe
     delete []pBuffer;

好了,现在test2.exe文件已经读出来了,接下来就是要读test1.exe的内容,过程大同小异

     fSource.Seek(iSourceLength-30,CFile::begin);//将文件指针移动到len1的开头
     ZeroMemory(buffer,40);
     fSource.Read(buffer,30);//读取len1的内容,len1的内容是test1.exe文件的长度


     int filelen = atoi(buffer);
     fSource.Seek(iSourceLength-60-filelen-iTargetLength,CFile::begin);//将文件指针移动到test1.exe文件头
     fTarget.Open("c:\\test2.exe",CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate);

     pBuffer = new char[filelen];
     ZeroMemory(pBuffer,filelen);

     fSource.Read(pBuffer,filelen);//将test1.exe文件读到缓冲区
     fTarget.Write(pBuffer,filelen);//将test1.exe文件写入c:\test1.exe

     delete []pBuffer;
     fSource.Close();
     fTarget.Close();

现在我们就用CreateProcess来运行创建两个新进程就可以运行c:\test1.exe和c:\test2.exe了。创建新进程的代码很简单我就不写了。

这部分是写完了,但是我们捆绑文件的部分还没写完,重新新建一个基于对话框的程序。

     CFile fSource("c:\\aaa.exe",CFile::modeReadWrite | CFile::modeNoTruncate); //就是上面我们写的aaa.exe
     fSource.SeekToEnd();//移动文件指针到文件尾

     CFile fFirstFile(m_FirstFile,CFile::modeRead | CFile::modeNoTruncate); //这段代码是把test1.exe添加到aaa.exe尾部
     int ilen = fFirstFile.GetLength();
     int len = ilen;
     char *pBuffer = new char[ilen];
     ZeroMemory(pBuffer,ilen);

    fFirstFile.Read(pBuffer,ilen);
     fSource.Write(pBuffer,ilen);
     fFirstFile.Close();
     delete pBuffer;


     CFile fSecondFile(m_SecondFile,CFile::modeRead | CFile::modeNoTruncate); //这段代码是捆绑test2.exe的
     ilen = fSecondFile.GetLength();
     pBuffer = new char[ilen];
     ZeroMemory(pBuffer,ilen);
     fSecondFile.Read(pBuffer,ilen);
     fSource.Write(pBuffer,ilen);
     fSecondFile.Close();
     delete pBuffer;



     char tempbuffer[30];//将test2.exe的长度转换成字符串,如果长度不够30就添加空格至30,再添加到文件尾部
     ZeroMemory(tempbuffer,30);
     itoa(ilen,tempbuffer,10);

     while (strlen(tempbuffer) < 30)
     {
         strcat(tempbuffer," ");
     }

     fSource.Write(tempbuffer,30);

     ZeroMemory(tempbuffer,30);//将test2.exe的长度转换成字符串,如果长度不够30就添加空格至30,再添加到文件尾部
     itoa(len,tempbuffer,10);

     while (strlen(tempbuffer) < 30)
     {
         strcat(tempbuffer," ");
     }

     fSource.Write(tempbuffer,30);

     fSource.Close();

     ::MessageBox(NULL,"捆绑完成","提示",MB_ICONINFORMATION);

OK,这样我们就生成了一个新文件target.exe,这个target.exe的结构上面已经说了。执行target.exe后,aaa.exe首先得到执行,然后test1.exe和test2.exe都会执行。为了增强隐蔽性,我们在aaa.exe的OnInitDialog()函数里写下如下代码:

     ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);
     ::MoveWindow(m_hWnd,0,0,0,0,TRUE);
这样aaa.exe执行的时候没窗口,也不会在任务栏上显示任务条。

编辑:黑鹰 [发送给好友] [打印本页] [关闭窗口] [返回顶部]
上一篇:浅谈内存泄漏(二)
下一篇:VC++实例:晚捆绑的实现过程
转载请注明来源:www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

 相关文章
用VC++自制王码五笔输入法安装包  使用Visual C++工具条 在VC++项目中为MDI主框架窗口添加位图
VC++编程实现对火焰的计算机动态仿真 VC下ADO开发实践之一 开发工具大比拚之Visual C++ vs. Delph
开发工具大比拚之Visual C++ vs. Delph 开发工具大比拚之Visual C++ vs. Delph VC制作具有声音效果的动画桌面精灵
VC中如何等比例缩放图像 如何禁止对话框关闭按钮和浮动工具条上 在VC中调用DirectShow全屏播放视频
『VC++技术内幕』学习笔记(10) 『VC++技术内幕』学习笔记(9) 『VC++技术内幕』学习笔记(7)
『VC++技术内幕』学习笔记(6) 『VC++技术内幕』学习笔记(5) 『VC++技术内幕』学习笔记(4)
『VC++技术内幕』学习笔记(3) 『VC++技术内幕』学习笔记(2) 『VC++技术内幕』学习笔记(1)
『VC++技术内幕』学习笔记(目录) 如何利用VC的Remote Debug功能 如何把VC++代码转换成VB代码?
最新更新 热点排行 推荐新闻
用VC++自制王码五笔输入法安装包 
在线资源指导
实用组件介绍
如何以最佳方式购买组件
ActiveX和OCX组件资源
用VC++自制王码五笔输入法安装包 
在线资源指导
实用组件介绍
如何以最佳方式购买组件
ActiveX和OCX组件资源
建立安装程序
收 集 文 件
理解各种打包类型
打包应用程序
向应用程序增加基于HTML的帮助
VC++实现对远程计算机屏幕的监视
用VC++6.0的Sockets API实现一个聊天室
多线程技术在VC++串口通信程序中的应用
用VC++制作一个简单的局域网消息发送工
用VC 6.0实现串行通信的三种方法
优秀公益广告作品欣赏(8)
java数据类型转换
Windows XP专业版IIS连接数的更改
新开放QQ免费挂级网站
优秀公益广告作品欣赏(7)
免费在QQ上看在线电影电视听音乐
WEB服务器配置全攻略(三)
QQ珊瑚虫外挂4.0版本发布!
免费把QQ炫铃设为本机QQ的系统提示音
Office2007简体中文版浮出水面 美图抢
微软将在华推分期付款,充值卡PC 可低价
 AMD处理器AM2测试 风扇竟运行7分钟
exeplorer.exe错误的问题的总结、解决
ASP.NET 2.0 中的异步页功能应用
硬盘坏道修复及数据恢复宝典
免费登录搜索引擎入口大全
搜索引擎注册九大秘法
小心摄像头成为黑客偷窥你的眼睛
内存混插常见问题和解决方法
Office2007简体中文版浮出水面 美图抢
 友情链接
设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyrights © 2004-2006 iYiT.Net All Rights Reserved.
网站合作、广告联系QQ:147007642、466949678
易特网络技术 点击这里给我发消息