Maximize
Bookmark

VX Heaven

Library Collection Sources Engines Constructors Simulators Utilities Links Forum

О выравнивании секций

Z0mbie
Top Device Online [5]
Май 2000

[Вернуться к списку] [Комментарии]

Для начала кусок доков по PE формату:

PE Header:

...
...
38hDWORDObjectAlignВыравнивание программных секций, должен быть степенью 2 между 512 и 256М включительно, связано с системой памяти. При использовании других значений программа не загрузится.
3ChDWORDFileAlignФактор используемый для выравнивания секций в файле. Указывает на границу на которую секции дополняются 0 при размещении в файле. Должен быть степенью 2 в диапазоне от 512 до 64К включительно. Прочие значения вызовут ошибку загрузки файла.
...

ObjectEntry:

...
08hDWORDVirtSizeВиртуальный размер секции, именно столько памяти будет отведено под секцию. Если VirtSize превышает PhysSize, то разница заполняется нулями, так определяются секции неинициализированных данных (PhysSize=0)
0ChDWORDVirtRVAРазмещение секции в памяти, ее виртуальный адрес относительно ImageBase. Позиция каждой секции, обычно, выровнена на границу ObjectAlign.
10hDWORDPhysSizeРазмер секции (ее инициализированной части) в файле, кратно полю FileAlign.
14hDWORDPhysOffsФизическое смещение относительно начала EXE файла, выровнено на границу FileAlign. Смещение используется загрузчиком как seek значение.
...

Теперь об выравнивании.

При заражении PE файлов иногда возникает необходимость выровнять какие-нибудь из вышеприведенных элементов структуры ObjectEntry в соответствии с полями PE Header'а FileAlign и/или ObjectAlign.

При рассмотрении хуевой кучи исходников, была найдена примерно такая вот мысль, в виде куска кода распространяющаяся от сорца к сорцу, причем быстрее самих вирусов:

CORR_SIZE:      PUSH    EDX
                XOR     EDX,EDX
                DIV     [PEH_OBJALIGN.ESI]
                AND     EDX,EDX
                JE      NO_ALIGN
                INC     EAX
NO_ALIGN:       MUL     [PEH_OBJALIGN.ESI]
                POP     EDX
                MOV     [OT_VIRTSIZE.EDI],EAX
                RETN

AlignF proc
       push ebp edx
       mov ebp, [esi+60]
  _align:
       sub edx, edx
       div ebp
       test edx, edx
       jz @@1
       inc eax
       sub edx, edx
  @@1:
       mul ebp
       pop edx ebp
       ret
AlignF endp

Calc1:          mov     eax, CodeSize
Calc2:          xor     edx, edx
                div     ecx
                or      edx, edx
                jz      $+3
                inc     eax
                mul     ecx
                ret
 

и так далее... Ну, кто узнал свое? ;-)

Теперь рассмотрим ситуацию, когда в делитель пришел 0. Ответ ясен: ваш вирус сглючит, и маздай выдаст поинтер на с таким трудом написанный код. А может быть, это антивирусная эвристика спецом подсунула такой хуевый файл и только и ждет DIV 0, а?

Да, можно вставить проверку на 0. Но не красивее ли ВООБЩЕ не использовать DIV, прочитав наконец доку, и поняв, что делитель, он же File/ObjectAlignment суть степень двойки?

        mov     eax, FileOrObjectAlign
        dec     eax
        add     SomethingToBeAligned, eax
        not     eax
        and     SomethingToBeAligned, eax
 
By accessing, viewing, downloading or otherwise using this content you agree to be bound by the Terms of Use! vxer.org aka vx.netlux.org
deenesitfrplruua