Упражняюсь в манипуляциях с PE файлами, и возникает такая проблема: внедряю свой код в последнюю секцию, расштряю ее, все дела, запускаю файл и получается, что некоторые работают, а некоторые нет. Выяснил, что не работают, те, у которых на том участке памяти куда внедрем код стоит аттребут NO ACESS. Можно ли как нибудь сделать так, чтобы память в этом регионе стала readeble, желательно статично, тоесть оформить это в экзешнике, а не динамически?
Код (Text): void SetAllSectionsWriteble(char* fname,IMAGE_DOS_HEADER* idh,IMAGE_NT_HEADERS* inh) { HANDLE hf; OFSTRUCT of; DWORD wr; DWORD ic=0; IMAGE_SECTION_HEADER ish; hf=(HANDLE)OpenFile(fname,&of,OF_READWRITE); while(ic<inh->FileHeader.NumberOfSections) { SetFilePointer(hf,idh->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*ic,NULL,FILE_BEGIN); ReadFile(hf,&ish,sizeof(IMAGE_SECTION_HEADER),&wr,NULL); //MessageBox(NULL,ish.Name,"Sec",0); ish.Characteristics=0xA0000020; SetFilePointer(hf,idh->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*ic,NULL,FILE_BEGIN); WriteFile(hf,&ish,sizeof(IMAGE_SECTION_HEADER),&wr,NULL); ic++; } CloseHandle(hf); } Вот скрин того, что дает PeTools. Запарывается он именно на адресе 429000, тоесть точно начиная с того адреса куда был добавлен код.
Вот опятным путём выяснил, что если увеличивать VirtualSize секции не на размер кода кооторый внедрил, а в несколько раз больше, то работает.
VirtualOffset(27000)+VirtualSize(1eae)+ImageBase(400000) = 429000. Нужно увеличивать VirtualSize. Странно то, что этот кусок вообще мапится(а маппится ли?) Уже понял да В данном конкретном файле размер на диске > размера в памяти. В таких случаях надо брать размер на диске и писать его в VirtualSize
Поле RawSize - размер секции на диске. Если он > чем VirtualSize - значит в память будет отображена только часть секции. Подробнее - кури пе-формат. з.ы. Снимать атрибут чтения с секции чревато.
>> Еще не забудь увеличить тогда и ImageSize угу, он должен быть равен VirtualAddress + VirtualSize последней секции