Уроки Iczelion'а



Урок 2. Правильность PE файла - часть 4


add edi, [edi].e_lfanew assume edi:ptr IMAGE_NT_HEADERS .if [edi].Signature==IMAGE_NT_SIGNATURE mov ValidPE, TRUE .else mov ValidPE, FALSE .endif

Чтобы добраться до PE-заголовка, нам нужно значение, находящееся в e_lfanew DOS-заголовка. Это поле содержит смещение в файле PE-заголовка, относительно начала файла. Поэтому мы добавляем это значение к edi и получаем первый байт PE-заголовка. Это то место, где может произойти ошибка. Если файл на самом деле не PE-файл, значение в e_lfanew будет неверным и использование его будет подобно использованию случайного указателя. Если мы не используем SEH, мы должны сравнить e_lfanew с размером файла, что некрасиво. Если все идет хорошо, мы сравниваем первое двойное слово PE-заголовка со строкой "PE". Снова мы можем использовать уже определенную константу под названием IMAGE_NT_SIGNATURE. Если результат сравнения верен, мы предполагаем, что файл является правильным PE.

Если значение в e_lfanew неверно, может произойти ошибка и наш SEH-обработчик получит управление. Он просто восстанавливает указатель на стек, bsae-указатель и продолжает выполнение программы с метки FinalExit.

FinalExit: .if ValidPE==TRUE invoke MessageBox, 0, addr FileValidPE, addr AppName, MB_OK+MB_ICONINFORMATION .else invoke MessageBox, 0, addr FileInValidPE, addr AppName, MB_OK+MB_ICONINFORMATION .endif

Вышеприведенный код сам по себе очень прост. Он проверяет значение в ValidPE и отображает соответствующее сообщение.

push seh.PrevLink pop fs:[0]

Когда SEH больше не используется, мы убираем его из SEH-цепи.

[C] Iczelion, пер. Aquila.






Содержание  Назад  Вперед