我试图增加可执行文件的.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部分的大小?
答案 0 :(得分:0)
您没有更改部分在内存中加载的位置,所以是的,以下部分将在扩展的.text部分的末尾加载。
在一般情况下,您尝试做的事情是不可能的。您无法在可执行文件的中间插入任何内容,因为您需要更改后续所有内容的加载地址。更改部分的加载地址将使该部分内任何指针的指针无效,因为它们仍然指向内存中该部分的位置。