Хочу отредактировать файл так что бы потом загрузчик выделял под его образ больше места чем обычно нужно.Т.е. что бы можно было пространство за последней секцией без проблем использовать под определенные нужды.Тупое редактирование IMAGE_NT_HEADERS.OptionalHeader.SizeOfImage дает только "битый" файл,который системный загрузчик обрабатывать нехочет.Я так понимаю что нужно отредактировать ещё что то кроме SizeOfImage? Или это ложный путь?
Если нужно просто сделать так, чтобы файл был "жирнее" в памяти - установи IMAGE_SECTION_HEADER::VirtualSize последней секции больше, чем SizeOfRawData, выравненный на IMAGE_OPTIONAL_HEADER::SectionAlignment. Тогда "лишние" байты будут считаться uninitialized и будут автоматически выделены и проинициализированы нулями загрузчиком при старте. Ну и есесно увеличить SizeOfImage на число байт (опять же, выравненное на SectionAlignment) Если нужно добавить свои данные, то нужно увеличить IMAGE_SECTION_HEADER::SizeOfRawData на нужное число байт (обязательно выравненное на FileAlignment), дописать к секции это число байт, увеличить SizeOfImage на число добавленных байт, выравненное на SectionAlignment.
По всей видимости этого не достаточно,так как "Bad Command or file name". Код (Text): HANDLE f=CreateFileW(exe,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); LARGE_INTEGER sz; GetFileSizeEx(f,&sz); char *buf=new char[sz.QuadPart]; DWORD rb; ReadFile(f,buf,sz.QuadPart,&rb,0); CloseHandle(f); DWORD toNT= ((IMAGE_DOS_HEADER*)buf)->e_lfanew; IMAGE_NT_HEADERS *image; buf+=toNT; image=(IMAGE_NT_HEADERS *)buf; buf-=toNT; IMAGE_SECTION_HEADER *sections=new IMAGE_SECTION_HEADER[image->FileHeader.NumberOfSections]; buf+=toNT; buf+=sizeof(IMAGE_NT_HEADERS); memcpy(sections,buf,image->FileHeader.NumberOfSections*sizeof(IMAGE_SECTION_HEADER)); buf-=toNT; buf-=sizeof(IMAGE_NT_HEADERS);; buf+=toNT; //((IMAGE_NT_HEADERS *)buf)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress=0; //((IMAGE_NT_HEADERS *)buf)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size=0; ((IMAGE_NT_HEADERS *)buf)->OptionalHeader.SizeOfImage=((IMAGE_NT_HEADERS *)buf)->OptionalHeader.SizeOfImage+(1024*64)+NewByts; buf+=sizeof(IMAGE_NT_HEADERS)+ ((image->FileHeader.NumberOfSections-1)*sizeof(IMAGE_SECTION_HEADER)); ((IMAGE_SECTION_HEADER*)buf)->SizeOfRawData=((IMAGE_SECTION_HEADER*)buf)->Misc.VirtualSize=((IMAGE_SECTION_HEADER*)buf)->Misc.VirtualSize+(1024*64)+NewByts; buf+=sizeof(IMAGE_NT_HEADERS)+ ((image->FileHeader.NumberOfSections-1)*sizeof(IMAGE_SECTION_HEADER)); buf-=toNT; char newexe[1024]; strcpy(newexe,exe); strtok(newexe,"."); strcat(newexe,"changed.exe"); f=CreateFileA(newexe,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); DWORD w; WriteFile(f,buf,sz.QuadPart,&w,0); CloseHandle(f);