在十六进制编辑器中写入程序内存,并以编程方式读取

Writing to program memory in hex editor and reading programmatically

本文关键字:编程 读取 方式 内存 程序 编辑器 十六进制      更新时间:2023-10-16

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

我能够进入之前写给内存的文件的地址,但是当我尝试从那里阅读时,我会被访问拒绝。我该如何从那里阅读?

基本上,我只想拥有一个自用的PE文件。是的,我知道,我可以做自我提取的档案 - 提取自己。这是代码:

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 WORLDn");
    getchar();
    return 0;
}

在存储包装文件的文件结束后调用setFilePointer文件指针点后,我无法从ther

中读取。

Microsoft的PE可执行二进制文件包含一个单独的部分,用于 resources ,可以将其放置在文件中 - 如上所示,资源用于在可执行文件中运送数据。这是您很可能想要将数据放入的地方。

看一下:http://www.devsource.com/c/a/architecture/resources-from-pe-i/

可能的另一个解决方案是将标头结构持续存储在文件中,其中包含偏移到数据启动的文件中,以及数据的长度。然后,您的程序可以轻松地寻找文件的末尾(减去标头的大小),并读取数据的位置和长度。


您要做的就是将可执行文件,将其写入第二个文件,可能写入填充,写入数据,写更多的填充物,最后写入数据的长度以及数据在文件中的位置。

文件将(在磁盘上)看起来像:

 --------------- |可执行||程序| --------------- |填充| --------------- |数据| --------------- |填充| --------------- |数据长度||数据pos。| --------------- 

现在,可执行文件可以将文件作为常规文件打开,仅读取。寻求最终减去data lengthdata position fields的大小(通常是sizeof(DWORD)(第二次))。读取两个字段的长度和位置。现在,您可以查找数据所在位置的实际位置(data pos.)并读取data length字节以读取实际数据。