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

王响亮1

王响亮1

2016-02-19 14:27

下面是个超简单的实例编程:用VC写个文件捆绑工具教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

  在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:est2.exe,把test1.exe的内容读出来另存为c:est1.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:est2.exe",CFile::modeCreate | CFile::modeWrite |

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

    char *pBuffer = new char[iTargetLength];//分配缓冲区
    ZeroMemory(pBuffer,iTargetLength);
    fSource.Read(pBuffer,iTargetLength);//将第test2.exe文件读到缓冲区
    fTarget.Write(pBuffer,iTargetLength);//将缓冲区内容写入c:est2.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:est1.exe
    
    delete []pBuffer;
    fSource.Close();
    fTarget.Close();

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

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

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

    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);

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  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执行的时候没窗口,也不会在任务栏上显示任务条。

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
实例编程:用VC写个文件捆绑工具

VC++实例:晚捆绑的实现过程

编程语言 网络编程
VC++实例:晚捆绑的实现过程

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

vc网络编程

编程语言 网络编程
vc网络编程

VC常用编程经验

编程语言 网络编程
VC常用编程经验

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

vc开发html编程

编程语言 网络编程
vc开发html编程

vc用于网络编程

编程语言 网络编程
vc用于网络编程

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

VC使用CRT调试功能来检测内存泄漏

VC使用CRT调试功能来检测内存泄漏

VC中ftp协议实现多线程断点续传

VC中ftp协议实现多线程断点续传
下拉加载更多内容 ↓