2

好吧,我有 .exe 应用程序和其他一些文件。我想要做的是将这个其他文件写入 .exe 文件的末尾。.exe 文件应该在它的内存中找到这个文件的地址,从那里读取它并做一些事情。

我能够访问我之前写入内存的文件的地址,但是当我尝试从那里读取时,我得到拒绝访问异常。我怎样才能从那里阅读?

基本上我只想拥有一个自解压的 PE 文件。是的,我知道,我可以制作自解压存档,但这不是我想要的,因为我需要 .exe 和 .dll 但自解压存档只能是 .exe,所以看起来唯一的方法是让我的应用程序自己- 提取自身。这是代码:

int main(void)
{
    HMODULE hBegin = GetModuleHandle(NULL);

    PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)hBegin;
    PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)((PBYTE)hBegin + dosHeader->e_lfanew);
    PIMAGE_SECTION_HEADER pSectionTable = (PIMAGE_SECTION_HEADER)(ntHeaders + 1);


    // get size of each section
    DWORD dwSize = 0;

    for(int i = 0; i < ntHeaders->FileHeader.NumberOfSections; i++)
    {
        dwSize += pSectionTable[i].SizeOfRawData;
    }

    //get size of PE headers
    dwSize += ntHeaders->OptionalHeader.SizeOfHeaders;

    WCHAR lpszSfxPath[MAX_PATH];
        GetModuleFileNameW(NULL, lpszSfxPath, MAX_PATH);
    HANDLE hFile = CreateFileW(lpszSfxPath,
            GENERIC_READ,
            FILE_SHARE_READ,
            NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL);
    SetFilePointer(hFile, dwSize, NULL, FILE_BEGIN);
    BYTE BUF[10];
    if(!ReadFile(hFile,BUF,sizeof(BYTE),NULL,NULL))
        printf("FAIL!\n");

    printf("HELLO WORLD\n");
    getchar();
    return 0;
}

在存储我的打包文件的文件末尾之后调用 SetFilePointer 文件指针指向,但我无法从中读取

4

2 回答 2

5

Microsoft 的 PE 可执行二进制文件包含一个单独的资源部分,可以放置在文件中 - 例如,资源用于在可执行文件中传送数据。这是您最可能想要放置数据的地方。

看看: http: //www.devsource.com/c/a/Architecture/Resources-From-PE-I/

于 2012-11-12T14:25:33.053 回答
1

另一种可能的解决方案是在文件中最后存储一个标题结构,其中包含数据开始的文件中的偏移量以及数据的长度。然后你的程序可以很容易地寻找到文​​件的末尾(减去标题的大小),并读取数据的位置和长度。


您所做的是获取可执行文件,将其写入第二个文件,可能写入填充,写入数据,写入可能的更多填充,最后写入数据的长度和数据在文件中的位置。

该文件看起来(在磁盘上)类似于:

+--------------+
| 可执行文件 |
| 程序 |
+--------------+
| 填充 |
+--------------+
| 数据 |
+--------------+
| 填充 |
+--------------+
| 数据长度 |
| 数据位置 |
+--------------+

现在可执行文件可以将文件作为常规文件以只读方式打开。寻找到末尾减去data lengthand的大小data position fields(通常是sizeof(DWORD)(乘以 2))。读取长度和位置的两个字段。现在您可以寻找数据所在的实际位置 ( data pos.) 并读取data length字节以读取实际数据。

于 2012-11-12T14:21:09.037 回答