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

北京的雾霾天 2009-11-03 06:25:20
我有什么方法能在我的EXE中生成另一个EXE程序呢?
就像RAR那样可以生成另一个自解压的EXE程序,这个程序可能每次生成都是不一样的,由我的条件来决定。

我知道在。Net中有动态编译,可是在VC++中怎么样解决呢?会不会是把编译和链接程序打包到程序中?
...全文
444 点赞 收藏 16
写回复
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
cocoabird 2011-09-21
[Quote=引用 8 楼 stjay 的回复:]

写一个PE文件模板
然后在文件尾或资源区写上数据

文件补丁程序,自解压exe,内存修改器(金山游侠有个生成内存补丁功能吧),等等...,都是这样的原理
[/Quote]
能不能详细说下,谢谢了
回复
wfx_net 2009-11-04
EXE无非也就是一个特殊的文件格式。
只要你按PE格式写生成一个文件就可以了。
关于PE的格式你可以Google一下,网上有很多。
回复
blpluto 2009-11-04
这个原来我做过。。。最简单的方法是写一个PE文件头和自解压模块,然后把其他文件的内容写入这个文件末尾,就可以了。
回复
哈利路亚1874 2009-11-04
可以使用打包工具,也可以捆绑资源!
回复
qqwweerraahh 2009-11-04
捆绑文件在资源里导入二进制自定义资源就行了,解压时当做二进制资源输出到文件里,一些可变的配置参数可以先声明成特定的值,然后在输出时查找这些值,并把它们替换成需要的值就行了,下面是释放资源的例子:

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
回复
WaistCoat13 2009-11-04
直接把数据加到EXE的尾巴上就可以了
回复
feng0hua0 2009-11-04
MFC中有个方法,把要生成的EXE添加到资源里,然后在你的EXE程序中调用,修改,最后生成目标EXE.可以参考下.
回复
顶起
回复
stjay 2009-11-03
写一个PE文件模板
然后在文件尾或资源区写上数据

文件补丁程序,自解压exe,内存修改器(金山游侠有个生成内存补丁功能吧),等等...,都是这样的原理
回复
tcbhj 2009-11-03
<Reversing> 第6章
回复
MoXiaoRab 2009-11-03
算了,我补全下#4的解压缩伪代码吧,刚吃晚饭也没事情

int nBeginNo=0;
while(nBeginNo<nCount)
{
ReadFileList(nBeginNo,&FileInfo);
WriteFile(hFile,FileInfo->BaseAddress,FileInfo->nLength);

}
回复
MoXiaoRab 2009-11-03
[Quote=引用 3 楼 jackyjkchen 的回复:]
不是吧,大多数时候仅仅是包含了一个exe资源,到时候释放,而所谓的自解压程序其实很简单,大部分都是导出模块(即压缩后的信息),就是文件头那里不太一样,每次构造文件头和自解压模块(一个exe或函数)就行了,找pe文件格式吧,winnt.h里定义了dos和pe文件的头部,一个结构体,把内容按照需要填好,直接二进制保存,就是一个exe了
[/Quote]
不是通过资源的方式的。那样会浪费空间
回复
MoXiaoRab 2009-11-03
伪代码如下

压缩:
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;
}

自解压文件执行的时候进行逆推就好了
回复
jackyjkchen 2009-11-03
不是吧,大多数时候仅仅是包含了一个exe资源,到时候释放,而所谓的自解压程序其实很简单,大部分都是导出模块(即压缩后的信息),就是文件头那里不太一样,每次构造文件头和自解压模块(一个exe或函数)就行了,找pe文件格式吧,winnt.h里定义了dos和pe文件的头部,一个结构体,把内容按照需要填好,直接二进制保存,就是一个exe了
回复
MoXiaoRab 2009-11-03
[Quote=引用楼主 hbxtlhx 的回复:]
我有什么方法能在我的EXE中生成另一个EXE程序呢?
就像RAR那样可以生成另一个自解压的EXE程序,这个程序可能每次生成都是不一样的,由我的条件来决定。

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

他那个只是PE的组合罢了。都拼在一起。自解压文件的PE执行作用就是读取自己的文件列表偏移,然后算法解压,拷贝缓冲区写出来
回复
这不是鸭头 2009-11-03
exe安装文件有专门的打包工具
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告