自解压程序的实现 之 从Exe文件结构中算出exe文件大小

本文介绍了如何通过编程计算包含资源的exe文件的实际大小,主要关注从EXE结构中提取信息,包括DOS头、PE头和每个节的偏移量和大小。
摘要由CSDN通过智能技术生成

参考: Self-extracting executables - strchr.com

用途

        将exe和资源文件组合一个文件, 运行时自解压资源

        本文只关注: 从Exe文件结构中算出exe文件大小

        可参考顶部链接获取其他部分,

        需注意修改_IMAGE_NT_HEADERS32为_IMAGE_NT_HEADERS64

组合方法        

copy /b sfx.exe+archive.zip sfx_ready.exe

从Exe文件结构中算出exe文件大小

const DWORD ERR_OK = 0, ERR_READFAILED = 1, ERR_NOINFO = 2, ERR_BADFORMAT = 3;

DWORD ReadFromExeFile(const char* path)

{

    BYTE buff[4096]; DWORD read; BYTE* data;



    // Open exe file

    HANDLE hFile = CreateFileA((CHAR*)path, GENERIC_READ, FILE_SHARE_READ,

        NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    if (INVALID_HANDLE_VALUE == hFile)

        return ERR_READFAILED;

    ReadFile(hFile, buff, sizeof(buff), &read, NULL);

    IMAGE_DOS_HEADER* dosheader = (IMAGE_DOS_HEADER*)buff;



    // Locate PE header

    _IMAGE_NT_HEADERS64* header =

        (_IMAGE_NT_HEADERS64*)(buff + dosheader->e_lfanew);

    if (dosheader->e_magic != IMAGE_DOS_SIGNATURE ||

        header->Signature != IMAGE_NT_SIGNATURE) {

        CloseHandle(hFile);

        return ERR_BADFORMAT;

    }



    // For each section

    IMAGE_SECTION_HEADER* sectiontable =

        (IMAGE_SECTION_HEADER*)((BYTE*)header + sizeof(_IMAGE_NT_HEADERS64));

    DWORD maxpointer = 0, exesize = 0;

    for (int i = 0; i < header->FileHeader.NumberOfSections; i++) {

        if (sectiontable->PointerToRawData > maxpointer) {

            maxpointer = sectiontable->PointerToRawData;

            exesize = sectiontable->PointerToRawData +

                sectiontable->SizeOfRawData;

        }

        sectiontable++;

    }

   

    return exesize;

}

 main函数代码


int main(int argc, char* argv[])
{
    const char* path = argv[1];
    path = "C:\\test\\a_b.exe";
    std::cout << "Path: " << path << std::endl;

    std::cout << "FileSize: " << FileSize(path) << " GetFileAttributesExA" << std::endl;

    std::cout << "ExeSize: " << ReadFromExeFile(path) << " Get form PE Header" << std::endl;
}

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
exe文件制作是一种将文件程序合并到一个可执行文件的技术。它的主要目的是方便用户在没有其他软件的情况下,直接运行exe文件来快速缩大文件。 制作exe文件的过程可以简单概括为以下几个步骤: 1. 准备文件:将需要缩的文件文件夹进行缩,可以使用常见的缩格式如zip或rar,确保文件大小。 2. 选择程序:选择一个合适的程序,可以是常见的缩软件或者专门用于制作自文件的工具。这个程序将被合并到exe文件,用于在运行时文件。 3. 合并文件:使用制作自文件的工具,将文件程序合并到一个exe文件。这个工具通常提供了一些选项,如是否设置密码、自定义路径等。 4. 测试和发布:测试生成的exe文件是否可以正常缩,并确保能够在各种操作系统和环境正常运行。如果一切正常,将exe文件发布给用户使用。 exe文件制作的优点是方便用户快速缩大文件,不需要额外的软件。同时,制作的exe文件可以直接在各种操作系统运行,大大提高了可移植性。 当然,也有一些注意事项。首先,由于将程序合并到exe文件,可能会导致生成的exe文件较大,需要在考虑文件大小和用户使用方便性之间做权衡。此外,一些安全软件可能会对exe文件产生误报,用户需要注意安全性并根据需要进行配置。 总之,通过exe文件制作技术,可以方便快速地缩大文件,提供更好的用户体验,减少对其他软件的依赖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值