PE操作—合并节表
节表是用来描述节属性的数据结构,合并节表即是用一个节表来描述多个节。这其中就涉及到节表的 VirtualAddress 属性,每个节表的 VirtualAddress 都不一样,节中的代码或数据都依赖于 VirtualAddress,合并以后不能破坏这种依赖关系。所以要将多个节的按照“节” 对齐的方式保存到文件中。具体过程如下:
a. 仿照 windows 加载器载入 PE 文件
b. 节表.SizeOfRawData = 文件对齐(合并节在内存中的对齐大小)
c. 节表.Misc.VirtualSize = 节表.SizeOfRawData
d. 节表.Characteristics = 合并节属性的集合
e. FileHeader.NumberOfSections = 1
合并前节表

合并后节表

合并前 .data 节位置

合并后 .data 节 的位置

伪代码
bool merge_section(void* image) { auto first_section = get_pe_section(image); auto nt_ptr = get_pe_nt32(image); auto number_section = get_number_sections(image); //----------------------------> SizeOfRawData first_section->SizeOfRawData = file_alignment(image, get_sizeof_image(image) - first_section->VirtualAddress); //----------------------------> Misc.VirtualSize first_section->Misc.VirtualSize = first_section->SizeOfRawData; //----------------------------> Characteristics for (decltype(number_section) i = 0; i < number_section; i++) first_section->Characteristics |= first_section[i].Characteristics; //----------------------------> zero for (decltype(number_section) i = 1; i < number_section; i++) memset(&first_section[i], 0, sizeof(decltype(first_section[i]))); //----------------------------> FileHeader.NumberOfSections set_number_sections(image, 1); return true; }

浙公网安备 33010602011771号