Для начала кусок доков по 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ами пусть сосут.
* * *
Z0MBiE, http://z0mbie.cjb.net
Статья для журнала Top Device
|