О ВЫРАВНИВАНИИ СЕКЦИЙ ~~~~~~~~~~~~~~~~~~~~~ Для начала кусок доков по PE формату: PE Header: ... 38h DWORD ObjectAlign Выравнивание программных секций, должен быть степенью 2 между 512 и 256М включительно, связано с системой памяти. При использовании других значений программа не загрузится. 3Ch DWORD FileAlign Фактор используемый для выравнивания секций в файле. Указывает на границу на которую секции дополняются 0 при размещении в файле. Должен быть степенью 2 в диапазоне от 512 до 64К включительно. Прочие значения вызовут ошибку загрузки файла. ... ObjectEntry: ... 08h DWORD VirtSize Виртуальный размер секции, именно столько памяти будет отведено под секцию. Если VirtSize превышает PhysSize, то разница заполняется нулями, так определяются секции неинициализированных данных (PhysSize=0) 0Ch DWORD VirtRVA Размещение секции в памяти, ее виртуальный адрес относительно ImageBase. Позиция каждой секции, обычно, выровнена на границу ObjectAlign. 10h DWORD PhysSize Размер секции (ее инициализированной части) в файле, кратно полю FileAlign. 14h DWORD PhysOffs Физическое смещение относительно начала 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 А DIVы, процедуры с PUSHем EDXа и условными JMPами пусть сосут. * * *