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

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

我知道在。Net中有动态编译,可是在VC++中怎么样解决呢?会不会是把编译和链接程序打包到程序中?
...全文
589 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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安装文件有专门的打包工具

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧