Проблема при добавлении новой секции в ехе

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by jimbo, 1 Mar 2012.

  1. jimbo

    jimbo New Member

    Joined:
    29 Feb 2012
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Здраствуйте!Возникли проблемы при програмном добавлении секции в PE файл.Проблемы связаны только с файлами
    скомпилеными компилятором MS Visual C++.А именно,после добавления новой секции в конец файла.При запуске ехе
    выводиться сообщение об ошибке "*.*.ехе не являеться приложеним Win32".Я думаю что это связано с тем что я
    секции не правильно выравниваю.

    Добавляю секцию по принципу Lord Pe.В конец файла дописуються нули.В таблице секций прописую VA и Physical адрес
    свободного места которое я добавил.После этого изменяю количество секций,и исправляю размер ImageSize(пока ручками).Вот собствено все.

    P.S да еще пробывал ехе шниках скомпиленых в MS VC++ после добавления секции востанавливать CRC32 предыдущий,но всеравно без результатно.

    Может мне кто-то помочь?Спасибо


    Code:
    AddNewSection(char exename[100],DWORD bytes,char secname[8])
    {
      HINSTANCE  lib=LoadLibrary(exename);
      PIMAGE_DOS_HEADER dos=(PIMAGE_DOS_HEADER)lib;
      PIMAGE_NT_HEADERS nt=(PIMAGE_NT_HEADERS)((DWORD)dos+dos->e_lfanew);
      IMAGE_FILE_HEADER fil=(IMAGE_FILE_HEADER)nt->FileHeader;
      IMAGE_OPTIONAL_HEADER opt=(IMAGE_OPTIONAL_HEADER)nt->OptionalHeader;
      PIMAGE_SECTION_HEADER sec=(PIMAGE_SECTION_HEADER)((BYTE*)nt+sizeof(IMAGE_NT_HEADERS));
      DWORD offsetV=0;
      DWORD offsetR=0;
      DWORD fileadd=0;
      fileadd=dos->e_lfanew+6;
      DWORD NumbOfSec=0;
      NumbOfSec=fil.NumberOfSections+1;
      //Get Full NTHeaders size
      offsetV=fil.SizeOfOptionalHeader+24+dos->e_lfanew;
      for(int i=0;i<fil.NumberOfSections-1;i++)
      {
       sec=(IMAGE_SECTION_HEADER*)((DWORD)sec+sizeof(IMAGE_SECTION_HEADER));
       offsetV=offsetV+40;
      }
      offsetV=offsetV+40;
      //Writing nulls
       DWORD addr=0;
       addr=DWORD(sec->PointerToRawData+sec->SizeOfRawData);
       offsetR=DWORD(sec->VirtualAddress+sec->Misc.VirtualSize);
       char byt[1000];
       //
      FreeLibrary(lib);
      DWORD f=0;
      HANDLE file=CreateFileA(exename,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_WRITE|FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
      //AddFreeSpaceForSection
      for(int i=0;i<bytes;i++)
        {
         byt[i]=0x88;
        }
       SetFilePointer(file,addr,0,0);
       WriteFile(file,&byt,bytes,&f,0);
       //Add new section name
       SetFilePointer(file,offsetV,0,0);
       WriteFile(file,secname,5,&f,0);
    
       //AddingSectionVoffset
       offsetV=offsetV+12;
       SetFilePointer(file,offsetV,0,0);
       WriteFile(file,&offsetR,sizeof(offsetR),&f,0);
    
       //AddingSectionVSize
       DWORD newRSize=0;
       offsetV=offsetV-4;
       newRSize=bytes;
       SetFilePointer(file,offsetV,0,0);
       WriteFile(file,&newRSize,sizeof(newRSize),&f,0);
       //AddingSectionRSize
       offsetV=offsetV+8;
       newRSize=bytes;
       SetFilePointer(file,offsetV,0,0);
       WriteFile(file,&newRSize,sizeof(newRSize),&f,0);
       //AddingSectionRoffset
       offsetV=offsetV+4;
       SetFilePointer(file,offsetV,0,0);
       WriteFile(file,&addr,sizeof(addr),&f,0);
       //AddingSectionFlags
       offsetV=offsetV+16;
       //Write & Read & InitializeData
       DWORD flag=0xc0000040;
       SetFilePointer(file,offsetV,0,0);
       WriteFile(file,&flag,sizeof(flag),&f,0);
    
       //UpdateNumberofSections
       SetFilePointer(file,fileadd,0,0);
       WriteFile(file,&NumbOfSec,sizeof(NumbOfSec),&f,0);
    }
    int main(int argc, char* argv[])
    {
      AddNewSection("d:\\ascii.exe",200,".test");
      Sleep(30000);
            return 0;
    }
    
     
  2. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    В коде разбираться не буду, но я писал упаковщик файлов, который использует класс для работы с PE, который тоже я писал, и который реализует добавление новых секций в PE. Скачай исходники и посмотри, как это делается.
    http://kaimi.ru/2011/12/упаковщик-pe-файлов-exe-dll/
     
  3. jimbo

    jimbo New Member

    Joined:
    29 Feb 2012
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    спс,посмотрю