文章目录
- 前言
- 一、怎么扩展最后一个节?
- 二、扩大节
- 1.扩展节
- 2.保存文件
前言
通过分析和解析Windows PE格式,并使用qt进行图形化显示
一、怎么扩展最后一个节?
在PE文件中,扩大最后一个节通常是通过修改PE文件头中的节表来实现的。具体来说,可以通过以下步骤来扩大最后一个节:
1、打开PE文件,并读取其DOS头、NT头和节表。
2、找到节表中的最后一个节,并计算其在文件中的偏移和大小。
3、修改最后一个节的大小,使其增加所需的额外空间。这可以通过修改节表中的SizeOfRawData和VirtualSize字段来实现。
4、如果需要,还可以修改最后一个节的虚拟地址和文件偏移,以确保它们与其他节保持一致。
5、将修改后的节表写回到PE文件中。
6、如果需要,还可以修改PE文件头中的其他字段,例如SizeOfImage和SizeOfCode,以反映新的节大小。
需要注意的是,在扩大最后一个节时,可能需要调整PE文件中的其他部分,以确保它们与新的节大小保持一致。例如,如果扩大了代码节,可能需要调整导入表、导出表和资源表等部分的位置和大小。此外,还需要确保在扩大节时不会覆盖PE文件中的其他部分,例如节表、导入表和导出表等。
二、扩大节
1.扩展节
void PEParser::expandEndSection(int size, char fillData)
{QByteArray data(size, fillData);if (m_sections.size() > 0){//修改节区属性IMAGE_SECTION_HEADER section = m_sections[m_sections.size() - 1];section.SizeOfRawData += alignment(size, m_fileAlignment);//修改节表在内存中的大小int addImageSize = alignment(size, m_sectionAlignment);;section.Misc.VirtualSize += addImageSize;//修改最后一个节表m_sections[m_sections.size() - 1] = section;//修改文件在内存中的大小if (m_x86Flag){m_optionalHeader32.SizeOfImage += addImageSize;}else{m_optionalHeader64.SizeOfImage += addImageSize;}//添加填充内容m_fileData.append(data);}
}
2.保存文件
QByteArray PEParser::getFileData()
{//替换DOS头memcpy(m_fileData.data(), &m_dosHeader, sizeof(IMAGE_DOS_HEADER));//替换标准PE头memcpy(m_fileData.data() + m_fileHeaderIndex, &m_fileHeader, sizeof(IMAGE_FILE_HEADER));//替换扩展PE头if (m_x86Flag){memcpy(m_fileData.data() + m_optionHeaderIndex, &m_optionalHeader32, sizeof(IMAGE_OPTIONAL_HEADER32));}else{memcpy(m_fileData.data() + m_optionHeaderIndex, &m_optionalHeader64, sizeof(IMAGE_OPTIONAL_HEADER64));}//替换节表for (int i = 0; i < m_sections.size(); ++i){memcpy(m_fileData.data() + m_sectionHeaderIndex + i * sizeof(IMAGE_SECTION_HEADER),&m_sections[i], sizeof(IMAGE_SECTION_HEADER));}return m_fileData;
}void MainWindow::on_btn_expandEndSection_clicked()
{m_peParser.expandEndSection(0x200, 0);QFile file("123.exe");file.open(QFile::WriteOnly | QFile::Truncate);file.write(m_peParser.getFileData());file.close();
}