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;
}

 

posted @ 2022-02-24 12:36  farmer3301  阅读(274)  评论(0)    收藏  举报