Пририсовть байтов к последней секции(PE файл)

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 10 дек 2010.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Хочу отредактировать файл так что бы потом загрузчик выделял под его образ больше места чем обычно нужно.Т.е. что бы можно было пространство за последней секцией без проблем использовать под определенные нужды.Тупое редактирование IMAGE_NT_HEADERS.OptionalHeader.SizeOfImage дает только "битый" файл,который системный загрузчик обрабатывать нехочет.Я так понимаю что нужно отредактировать ещё что то кроме SizeOfImage? Или это ложный путь?
     
  2. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    Виртуальный размер последней секции
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Если нужно просто сделать так, чтобы файл был "жирнее" в памяти - установи IMAGE_SECTION_HEADER::VirtualSize последней секции больше, чем SizeOfRawData, выравненный на IMAGE_OPTIONAL_HEADER::SectionAlignment. Тогда "лишние" байты будут считаться uninitialized и будут автоматически выделены и проинициализированы нулями загрузчиком при старте.
    Ну и есесно увеличить SizeOfImage на число байт (опять же, выравненное на SectionAlignment)

    Если нужно добавить свои данные, то нужно увеличить IMAGE_SECTION_HEADER::SizeOfRawData на нужное число байт (обязательно выравненное на FileAlignment), дописать к секции это число байт, увеличить SizeOfImage на число добавленных байт, выравненное на SectionAlignment.
     
  4. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    По всей видимости этого не достаточно,так как "Bad Command or file name".
    Код (Text):
    1. HANDLE f=CreateFileW(exe,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    2.     LARGE_INTEGER sz;
    3.     GetFileSizeEx(f,&sz);
    4.     char *buf=new char[sz.QuadPart];
    5.     DWORD rb;
    6.     ReadFile(f,buf,sz.QuadPart,&rb,0);
    7.     CloseHandle(f);
    8.     DWORD toNT= ((IMAGE_DOS_HEADER*)buf)->e_lfanew;
    9.     IMAGE_NT_HEADERS *image;
    10.     buf+=toNT;
    11.     image=(IMAGE_NT_HEADERS *)buf;
    12.     buf-=toNT;
    13.     IMAGE_SECTION_HEADER *sections=new IMAGE_SECTION_HEADER[image->FileHeader.NumberOfSections];
    14.     buf+=toNT;
    15.     buf+=sizeof(IMAGE_NT_HEADERS);
    16.     memcpy(sections,buf,image->FileHeader.NumberOfSections*sizeof(IMAGE_SECTION_HEADER));
    17.     buf-=toNT;
    18.     buf-=sizeof(IMAGE_NT_HEADERS);;
    19.     buf+=toNT;
    20.     //((IMAGE_NT_HEADERS *)buf)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress=0;
    21.     //((IMAGE_NT_HEADERS *)buf)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size=0;
    22.     ((IMAGE_NT_HEADERS *)buf)->OptionalHeader.SizeOfImage=((IMAGE_NT_HEADERS *)buf)->OptionalHeader.SizeOfImage+(1024*64)+NewByts;
    23.     buf+=sizeof(IMAGE_NT_HEADERS)+ ((image->FileHeader.NumberOfSections-1)*sizeof(IMAGE_SECTION_HEADER));
    24.     ((IMAGE_SECTION_HEADER*)buf)->SizeOfRawData=((IMAGE_SECTION_HEADER*)buf)->Misc.VirtualSize=((IMAGE_SECTION_HEADER*)buf)->Misc.VirtualSize+(1024*64)+NewByts;
    25.     buf+=sizeof(IMAGE_NT_HEADERS)+ ((image->FileHeader.NumberOfSections-1)*sizeof(IMAGE_SECTION_HEADER));
    26.     buf-=toNT;
    27.     char newexe[1024];
    28.     strcpy(newexe,exe);
    29.     strtok(newexe,".");
    30.     strcat(newexe,"changed.exe");
    31.     f=CreateFileA(newexe,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
    32.     DWORD w;
    33.     WriteFile(f,buf,sz.QuadPart,&w,0);
    34.     CloseHandle(f);