Сейчас на форуме: UniSoft, _MBK_, laslo, bartolomeo (+7 невидимых) |
eXeL@B —› Программирование —› Отрезать секцию релоков PE файла |
Посл.ответ | Сообщение |
|
Создано: 13 июля 2011 01:23 · Поправил: Yotsi · Личное сообщение · #1 Системный загрузчик после моих манипуляций не воспринимает файл.Видимо какие проверки на целостность образа не проходят.Только вот какие никак непойму.Пытаюсь делать вот так: [Сcode] void ChopSec(char *exebody) { DWORD toNT=((IMAGE_DOS_HEADER*)exebody)->e_lfanew; IMAGE_NT_HEADERS *image; exebody+=toNT; image=(IMAGE_NT_HEADERS *)exebody; exebody+=sizeof(IMAGE_NT_HEADERS); IMAGE_SECTION_HEADER* sections=(IMAGE_SECTION_HEADER*)exebody; exebody-=toNT+sizeof(IMAGE_NT_HEADERS); DWORD ToRelocs=0; DWORD RawRelSz=0; for(int i=0;i<image->FileHeader.NumberOfSections;i++) { if(sections[i].VirtualAddress==image->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress) { ToRelocs=sections[i].PointerToRawData; RawRelSz=sections[i].SizeOfRawData; } } /*.................................................................................................................................*/ image->OptionalHeader.SizeOfImage=image->OptionalHeader.SizeOfImage-sections[image->FileHeader.NumberOfSections-1].Misc.VirtualSize;//проблемі начинаются уже отсюда memset(§ions[image->FileHeader.NumberOfSections-1],NULL,sizeof(IMAGE_SECTION_HEADER)); image->FileHeader.NumberOfSections=image->FileHeader.NumberOfSections-1; image->OptionalHeader.SizeOfHeaders=image->OptionalHeader.SizeOfHeaders-sizeof(IMAGE_SECTION_HEADER); memset(relocs,NULL,RawRelSz); } [/Сcode] |
|
Создано: 13 июля 2011 02:28 · Личное сообщение · #2 |
|
Создано: 13 июля 2011 09:46 · Личное сообщение · #3 |
|
Создано: 13 июля 2011 11:28 · Личное сообщение · #4 Когда-то я почти целый день убил из-за того что систем лоадер не принимал мой файл как валидный. Оказалось что не совпадало указанное и реальное число релоков. Причем это не детектит ни один валидатор или ре-редактор. Накидал скрипт для иды. Файло грузить в мануал моде, все секции. 7f3f_13.07.2011_EXELAB.rU.tgz - Ida.CheckRelocs.idc ----- старый пень |
|
Создано: 13 июля 2011 15:35 · Поправил: PE_Kill · Личное сообщение · #5 Yotsi пишет: exebody+=sizeof(IMAGE_NT_HEADERS); Это неправильно, читайте маны по ПЕ формату Yotsi пишет: OptionalHeader.SizeOfImage-sections[image->FileHeader.NumberOfSections-1].Misc.VirtualSize VirtualSize всех секций может быть равен 0 (см. Watcom) или не выровнен на границу VirtualAligment (см. Delphi) Yotsi пишет: memset(§ions[image->FileHeader.NumberOfSections-1],NULL,sizeof(IMAGE_SECTION_HEADER)); Почему затирается заголовок именно последней секции, релоки могут быть хоть где? Где отрезание самой секции я так и не увидел. Yotsi пишет: memset(relocs,NULL,RawRelSz); Затирать всю секцию нулями нельзя, там могут быть не только релоки. Да и OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].* нигде не обнуляется, что вызовет ошибку загрузчика. Так же желательно в хедере указать что релоки стрипнуты, или что их и не было. В общем всё неправильно. ----- Yann Tiersen best and do not fuck | Сообщение посчитали полезным: Kylak |
|
Создано: 13 июля 2011 18:31 · Личное сообщение · #6 |
|
Создано: 13 июля 2011 18:39 · Личное сообщение · #7 |
eXeL@B —› Программирование —› Отрезать секцию релоков PE файла |