望麓自卑—湖南大学最具潜力的校园传媒

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4425|回复: 24

[资源共享] leave

 关闭 [复制链接]
发表于 2007-5-29 00:12:51 | 显示全部楼层 |阅读模式
发表于 2007-5-29 10:45:51 | 显示全部楼层
呵呵,师弟,你抄袭转载我多年前的文章也不注明一下。
要尊重别人的知识产权。<a href=[[[SQ]]][[[www.wlzb.net/phpwind/read.php?tid=67804%26position=1]]]></a>
发表于 2007-5-29 10:48:11 | 显示全部楼层
引用第0楼阿兵哥于2007-05-29 00:12发表的 exe文件捆绑 :
今天下午到晚上真的给exe文件捆绑原理给迷住了。在百度上不停的搜索,但是能搜索到的结果却少得可怜。会的人三言两语就给概括了,不会的人甚至都异想天开,他想一打开一个图片文件时,里面捆绑的exe文件就能运行!这样的话,电脑上的一切资源没得安全的了。
  终于功夫不负我这好学人呀。搜索到了一个比较全的,例子也用。他的这篇文章也证实了我的想法,但是他的却很仔细并且用VC实现了。好,我就来讲下这个原理,代码以后有时间再给出。
  先假设我们手头有这么一个已经捆绑了的exe文件。格式如下:
  ------------------------------------------------------
|common.exe | test1.exe | test2.exe |
-------------------------------------------------------
这个合成的文件是由三个文件组成的,common.exe,test1.exe,test2.exe,暂时给这个合成的文件取名叫target.exe。这个很容易做到,只需要将三个文件读出来,然后写到一个新的文件下,名字就叫target.exe。当这个target.exe被运行的时候,实际上只有common.exe能运行,后面的两个程序只是一堆的二进制流。不信你可以做个实验:在命令行输入,copy test1.exe+test2.exe,然后运行test1.ext,看是否有test2.exe的结果输出。没有的话那是正确的,不必担心。捆绑后的文件只能运行第一个,那怎么办呢?关键就在第一个程序了。所以我们要做的就是让第一个程序common.exe来重新分离这个捆绑的文件,并且使后面的两个程序运行起来。我们一步一步来:
1>分离文件
根据上面的格式我们还不能够将后面的两个程序(实际上是二进制流)分离出来,因为我们不知道上面的格式中没有记录任何一个文件的长度,我们不知道从哪开始读出程序。为此,上面的格式需要修改。
  --------------------------------------------------------------------------------
|common.exe | test1.exe | test2.exe | length1 | length2 |
---------------------------------------------------------------------------------
在整个捆绑的文件后我们加上了test1.ext和test2.exe的长度。这样common.exe只要先将文件读指针方在文件最后,读出length2(文件长度所占字节自己可以设置,比如20bytes),然后再把指针移到test2.exe的开始处,读出length2个字节的数据,将这些数据保存在一个文件中,可以取名test2.exe。test1.exe的读出和test2.exe的原理一样。
2>运行文件
在common.exe将捆绑在一起的文件读出后,就要运行它们了。这时就可以用些API来调用他们。这是相当容易做到的。如果涉及到隐身运行的话,那需要更多的API。此处暂无法给出。

------------------------------------------------------------------------------------------------------------------------
综上,有两个程序是自己必须要写的,第一个就是bind-file.exe。这个程序是将多个文件捆绑在一起的。第二个就是common.exe。这个程序必须在捆绑文件的开始处。它的作用就是运行时,将捆绑在一起的文件分离出来,并且运行他们。
最后,至于你想捆绑什么文件我就不管了...被逮了别说我是你师傅就OK了。

.......

呵呵,师弟,你抄袭转载我多年前的文章也不注明一下出处。
要尊重别人的知识产权。<a href=[[[SQ]]][[[www.wlzb.net/phpwind/read.php?tid=67804%26position=2]]]></a>
发表于 2007-5-29 22:58:51 | 显示全部楼层
呵呵, 建议从原理角度去说明;

而不是使用;

学习技术,更应该know why?<a href=[[[SQ]]][[[www.wlzb.net/phpwind/read.php?tid=67804%26position=4]]]></a>
舒一 该用户已被删除
发表于 2007-5-29 23:01:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2007-5-29 23:02:14 | 显示全部楼层
舒一你应该去面壁<a href=[[[SQ]]][[[www.wlzb.net/phpwind/read.php?tid=67804%26position=7]]]></a>
发表于 2007-5-29 23:03:41 | 显示全部楼层
引用第1楼roamer于2007-05-29 10:45发表的 :
呵呵,师弟,你抄袭转载我多年前的文章也不注明一下。
要尊重别人的知识产权。

好奇roamer的身份, 毕业多久了?<a href=[[[SQ]]][[[www.wlzb.net/phpwind/read.php?tid=67804%26position=8]]]></a>
发表于 2007-5-29 23:41:09 | 显示全部楼层
呵呵,不知这几个帖子看过没有;

http://topic.csdn.net/t/20020325/20/599328.html

http://topic.csdn.net/t/20010413/09/96232.html#

感觉这类资料很多,具体没去关注;<a href=[[[SQ]]][[[www.wlzb.net/phpwind/read.php?tid=67804%26position=11]]]></a>
发表于 2007-5-30 00:03:56 | 显示全部楼层
引用第5楼阿兵哥于2007-05-29 22:59发表的 :
经过多年了,想必有了更高级的了,给大伙瞧瞧撒!

你用不着阴阳怪气
抄袭侵犯了别人的作品就要老老实实承认,这和作品高级不高级没有关系。

小朋友,做技术做学问前,先做好人。

另外,我现在早已经不做安全方面的了,如果你有兴趣,尽可以去
湖大查找我毕业设计坐的NDIS防火墙,去问问计算机学院当年的那个
老师周找一我的防火墙如何、<a href=[[[SQ]]][[[www.wlzb.net/phpwind/read.php?tid=67804%26position=13]]]></a>
发表于 2007-5-30 00:05:35 | 显示全部楼层
引用第9楼阿兵哥于2007-05-29 23:09发表的 :
本人也很好奇?
偶原创的居然成了他的抄袭版本! [s:187]


你的原创? 修改一下就叫原创?

这是我的原文:

http://blog.csdn.net/elssann/archive/2004/02/22/21847.aspx




如何编写一个文件捆绑工具
在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:\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:        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了。创建新进程的代码很简单我就不写了。

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

    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执行的时候没窗口,也不会在任务栏上显示任务条。<a href=[[[SQ]]][[[www.wlzb.net/phpwind/read.php?tid=67804%26position=14]]]></a>
发表于 2007-5-30 00:06:46 | 显示全部楼层
引用第12楼阿兵哥于2007-05-29 23:43发表的 :
这些都看过了,其实这中方式并不怎么好!但对捆绑原理来是个简单的入门,很容易理解.本人也正在着手例外的一种方式.


不要顾左右而言它。

现在讨论的不是技术的简单与复杂。
我关注的只是你的这种抄袭别人东西的行为。<a href=[[[SQ]]][[[www.wlzb.net/phpwind/read.php?tid=67804%26position=15]]]></a>
发表于 2007-5-30 00:08:21 | 显示全部楼层
引用第8楼fee于2007-05-29 23:03发表的 :


好奇roamer的身份, 毕业多久了?


04年毕业的、<a href=[[[SQ]]][[[www.wlzb.net/phpwind/read.php?tid=67804%26position=16]]]></a>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

每日推荐上一条 /1 下一条

小黑屋|手机版|湖南大学望麓自卑校园传媒 ( 湘ICP备14014987号 )

GMT+8, 2025-2-20 11:37 , Processed in 0.078277 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表