Здраствуйте!Возникли проблемы при програмном добавлении секции в 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; }
В коде разбираться не буду, но я писал упаковщик файлов, который использует класс для работы с PE, который тоже я писал, и который реализует добавление новых секций в PE. Скачай исходники и посмотри, как это делается. http://kaimi.ru/2011/12/упаковщик-pe-файлов-exe-dll/