hur.cn - 华软网

 热门搜索

像自解压这样的EXE文件是怎么生成的?

  作者:未知    来源:网络    更新时间:2009/11/3
我有什么方法能在我的EXE中生成另一个EXE程序呢?
就像RAR那样可以生成另一个自解压的EXE程序,这个程序可能每次生成都是不一样的,由我的条件来决定。

我知道在。Net中有动态编译,可是在VC++中怎么样解决呢?会不会是把编译和链接程序打包到程序中?
---华软 网友回答---
exe安装文件有专门的打包工具
---华软网友回复---
引用楼主 hbxtlhx 的回复:
我有什么方法能在我的EXE中生成另一个EXE程序呢?
就像RAR那样可以生成另一个自解压的EXE程序,这个程序可能每次生成都是不一样的,由我的条件来决定。

我知道在。Net中有动态编译,可是在VC++中怎么样解决呢?会不会是把编译和链接程序打包到程序中?


他那个只是PE的组合罢了。都拼在一起。自解压文件的PE执行作用就是读取自己的文件列表偏移,然后算法解压,拷贝缓冲区写出来
---华软网友回复---
不是吧,大多数时候仅仅是包含了一个exe资源,到时候释放,而所谓的自解压程序其实很简单,大部分都是导出模块(即压缩后的信息),就是文件头那里不太一样,每次构造文件头和自解压模块(一个exe或函数)就行了,找pe文件格式吧,winnt.h里定义了dos和pe文件的头部,一个结构体,把内容按照需要填好,直接二进制保存,就是一个exe了
---华软网友回复---
代码如下

压缩:
LPVOID Base;
Buffer1=ReadFile(File1)
Buffer1=LZMA(Buffer1)
length1=len(Buffer1)

Buffer2=ReadFile(File2)
Buffer2=LZMA(Buffer2)
length2=len(Buffer2)





然后在前步维护一个数据结构链表

struct FileListElement
{
  LPVOID BeginAddress;
  int nLength;
  FileListElement *next;
}

自解压文件执行的时候进行逆推就好了
---华软网友回复---
引用 3 楼 jackyjkchen 的回复:
不是吧,大多数时候仅仅是包含了一个exe资源,到时候释放,而所谓的自解压程序其实很简单,大部分都是导出模块(即压缩后的信息),就是文件头那里不太一样,每次构造文件头和自解压模块(一个exe或函数)就行了,找pe文件格式吧,winnt.h里定义了dos和pe文件的头部,一个结构体,把内容按照需要填好,直接二进制保存,就是一个exe了

不是通过资源的方式的。那样会浪费空间
---华软网友回复---
算了,我补全下#4的解压缩伪代码吧,刚吃晚饭也没事情

int nBeginNo=0;
while(nBeginNo<nCount)
{
   ReadFileList(nBeginNo,&FileInfo);
   WriteFile(hFile,FileInfo->BaseAddress,FileInfo->nLength);
   
}
---华软网友回复---
<Reversing> 第6章
---华软网友回复---
写一个PE文件模板
然后在文件尾或资源区写上数据

文件补丁程序,自解压exe,内存修改器(金山游侠有个生成内存补丁功能吧),等等...,都是这样的原理
---华软网友回复---
顶起
---华软网友回复---
这个原来我做过。。。最简单的方法是写一个PE文件头和自解压模块,然后把其他文件的内容写入这个文件末尾,就可以了。
---华软网友回复---
EXE无非也就是一个特殊的文件格式。
只要你按PE格式写生成一个文件就可以了。
关于PE的格式你可以Google一下,网上有很多。
---华软网友回复---
MFC中有个方法,把要生成的EXE添加到资源里,然后在你的EXE程序中调用,修改,最后生成目标EXE.可以参考下.
---华软网友回复---
直接把数据加到EXE的尾巴上就可以了
---华软网友回复---
捆绑文件在资源里导入二进制自定义资源就行了,解压时当做二进制资源输出到文件里,一些可变的配置参数可以先声明成特定的值,然后在输出时查找这些值,并把它们替换成需要的值就行了,下面是释放资源的例子:

C++">BOOL UseCustomResource()
{
//定位我们的自定义资源,这里因为我们是从本模块定位资源,所以将句柄简单地置为NULL即可
HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(ITEMID), TEXT(MyType));
if (NULL == hRsrc)
return FALSE;
//获取资源的大小
DWORD dwSize = SizeofResource(NULL, hRsrc); 
if (0 == dwSize)
return FALSE;
//加载资源
HGLOBAL hGlobal = LoadResource(NULL, hRsrc); 
if (NULL == hGlobal)
return FALSE;
//锁定资源
LPVOID pBuffer = LockResource(hGlobal); 
if (NULL == pBuffer)
return FALSE;

//我们用刚才得到的pBuffer和dwSize来做一些需要的事情。可以直接在内存中使
//用,也可以写入到硬盘文件。这里我们简单的写入到硬盘文件,如果我们的自定
//义资源是作为嵌入DLL来应用,情况可能要复杂一些。
BOOL bRt = FALSE;
FILE* fp = _tfopen(_T(demo.exe), _T(wb));
if (fp != NULL)
{
if (dwSize == fwrite(pBuffer, sizeof(char), dwSize, fp))
bRt = TRUE;
fclose(fp);
}

//FreeResource(hGlobal);
return bRt;
}

http://suprole.cn/Display_Article.asp?type=Article&id=44
---华软网友回复---
可以使用打包工具,也可以捆绑资源!
---华软网友回复---
引用 8 楼 stjay 的回复:
写一个PE文件模板
然后在文件尾或资源区写上数据

文件补丁程序,自解压exe,内存修改器(金山游侠有个生成内存补丁功能吧),等等...,都是这样的原理

能不能详细说下,谢谢了      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。