C ++无法增加.text部分的大小

时间:2015-04-15 19:18:36

标签: c++ portable-executable

我试图增加可执行文件的.text部分的大小。

int main()
{
    DWORD dwSize,
          dwFileOffset,
          dwFileSize;

    ifstream in;

    BYTE* pData,
        * pContents;

    bool bAdjust = false;

    DWORD dwDataPointer;

    IMAGE_DOS_HEADER* dosHeader;

    IMAGE_NT_HEADERS* ntHeader;

    IMAGE_SECTION_HEADER* sectionHeader;

    vector<byte> data;

    vector<byte>::iterator dataIterator;


    in.open("C:\\MineSweeper.exe", ios::in | ios::binary);

    if(in.is_open() == true)
    {
        in.seekg(0, ios::end);
        dwFileSize = in.tellg();
        in.seekg(0, ios::beg);

        pContents = new BYTE[dwFileSize];
        in.read((char*)pContents, dwFileSize);
        in.close();


        for(int i = 0; i < dwFileSize; i++)
            data.push_back(pContents[i]);


        dosHeader = (IMAGE_DOS_HEADER*)&data[0];

        if (dosHeader->e_magic == IMAGE_DOS_SIGNATURE)
        {
            ntHeader = (IMAGE_NT_HEADERS*)((DWORD)&data[0] + dosHeader->e_lfanew);

            if(ntHeader->Signature == IMAGE_NT_SIGNATURE)
            {
                sectionHeader = IMAGE_FIRST_SECTION(ntHeader);

                if(sectionHeader != NULL)
                {
                    for (unsigned int i = 0; i < ntHeader->FileHeader.NumberOfSections; i++)
                    {
                        printf("In section %s %d/%d\n", sectionHeader->Name, i, ntHeader->FileHeader.NumberOfSections);

                        if(bAdjust == true)
                        {
                            if(sectionHeader->PointerToRawData > dwDataPointer)
                            {
                                sectionHeader->PointerToRawData += 0x1000;
                                //sectionHeader->VirtualAddress += 0x1000;
                            }
                        }

                        if(strcmp((char*)sectionHeader->Name, ".text") == 0)
                        {
                            BYTE* pTemp;

                            pTemp = new BYTE[0x1000];


                            char* szStartMessage = "This is the start";

                            for(int k = 0; k < strlen(szStartMessage); k++)
                                pTemp[k] = szStartMessage[k];

                            for(int k = strlen(szStartMessage); k < 0x1000; k++)
                                pTemp[k] = k;


                            data.insert(data.begin() + sectionHeader->PointerToRawData + sectionHeader->SizeOfRawData, pTemp, pTemp + 0x1000);

                            dwDataPointer = sectionHeader->PointerToRawData;

                            ntHeader->OptionalHeader.SizeOfCode += 0x1000;
                            ntHeader->OptionalHeader.BaseOfData += 0x1000;
                            sectionHeader->SizeOfRawData += 0x1000;

                            bAdjust = true;
                        }

                        sectionHeader++;
                    }
                }

                ofstream out;

                out.open("C:\\test2.exe", ios::out | ios::binary);

                if(out.is_open() == true)
                {
                    out.write((char*)&data[0], data.size());
                    out.close();
                }
                else
                    printf("Couldn't write\n");
            }
        }
    }

    delete[] pContents;

    printf("Done\n");

    return 0;
}

我将Minesweeper读成字节向量。然后我将0x1000字节插入.text部分的底部。我将所有相关的偏移量增加了0x1000,包括其后的其他部分的指针。

然而,当我在RAM中查看进程时。它似乎只显示我插入的1024个字节(0x400)。接下来的事情似乎会削弱结局。 可能是.data部分,因为它的虚拟地址是0x5000。

如何增加.text部分的大小?

1 个答案:

答案 0 :(得分:0)

您没有更改部分在内存中加载的位置,所以是的,以下部分将在扩展的.text部分的末尾加载。

在一般情况下,您尝试做的事情是不可能的。您无法在可执行文件的中间插入任何内容,因为您需要更改后续所有内容的加载地址。更改部分的加载地址将使该部分内任何指针的指针无效,因为它们仍然指向内存中该部分的位置。