Сейчас на форуме: UniSoft, _MBK_, laslo, bartolomeo (+7 невидимых)

 eXeL@B —› Программирование —› Отрезать секцию релоков PE файла
Посл.ответ Сообщение

Ранг: 31.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 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(&sections[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]




Ранг: 88.2 (постоянный), 111thx
Активность: 0.070.01
Статус: Участник

Создано: 13 июля 2011 02:28
· Личное сообщение · #2

--> Link <--

Оно?

Либо если кодесом, то смотри на последующие секции, VA/VS чтобы сохранялись




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 13 июля 2011 09:46
· Личное сообщение · #3

Да всё тут неправильно делается. Хедер секции нулями забивается зачем-то. А если она не последняя? Всё сползёт в заголовке, всё сползёт в файле.
Как вариант-после перестройки скорми файл чему-нить типа плагина PE Verify для HIEW и посмотри, что он тебе скажет. А заодно док по пе почитай.



Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 13 июля 2011 11:28
· Личное сообщение · #4

Когда-то я почти целый день убил из-за того что систем лоадер не принимал мой файл как валидный.
Оказалось что не совпадало указанное и реальное число релоков. Причем это не детектит ни один валидатор или ре-редактор.
Накидал скрипт для иды. Файло грузить в мануал моде, все секции.

7f3f_13.07.2011_EXELAB.rU.tgz - Ida.CheckRelocs.idc

-----
старый пень





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 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(&sections[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

Ранг: 31.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 13 июля 2011 18:31
· Личное сообщение · #6

LordPE фиксит размер образа и все работает.Это что значит? Что последняя секция может невыравниватся?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 13 июля 2011 18:39
· Личное сообщение · #7

Это значит, что ты не прочитал ничего из того, что написали выше. И не пытался разобраться сам.


 eXeL@B —› Программирование —› Отрезать секцию релоков PE файла
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати