Путеводитель по написанию вирусов под Win32

         

Веселье с push'ами


Почти то же, что и выше, но с push'ем. Давайте посмотрим, что надо и не надо делать:

mov eax,dword ptr [ebp+variable] ; 6 байтов push eax ; 1 байт

Мы можем сделать то же самое, но на 1 байт меньше. Смотрите.

push dword ptr [ebp+variable] ; 6 байтов

Круто, правда? ;) Ладно, если нам нужно push'ить много раз (если значение велико, более оптимизированно, будет более оптимизированно push'ить значение 2+ раза, а если значение мало, более оптимизированно будет push'ить его, когда вам нужно сделать это 3+ раза) одну и ту же переменную, более выгодно будет поместить ее в регистр и push'ить его. Например, если нам нужно заpushить он 3 раза, более правильным будет сксорить регистр сам с собой и затем заpushить регистр. Давайте посмотрим:

push 00000000h ; 2 байта push 00000000h ; 2 байта push 00000000h ; 2 байта

И давайте посмотрим, как прооптимизировать это:

xor eax,eax ; 2 bytes push eax ; 1 byte push eax ; 1 byte push eax ; 1 byte

Часто во время использования SEH нам бывает необходимо запушить fs:[0] и так далее: давайте посмотрим, как это можно оптимизировать:

push dword ptr fs:[00000000h] ; 6 байтов ; 666? Хахаха! mov fs:[00000000h],esp ; 6 байтов [...] pop dword ptr fs:[00000000h] ; 6 байтов

Вместо это нам следует сделать следующее:

xor eax,eax ; 2 байта push dword ptr fs:[eax] ; 3 байта mov fs:[eax],esp ; 3 байта [...] pop dword ptr fs:[eax] ; 3 байта

Кажется, что у нас на 7 байтов меньше! Вау!!!



Содержание раздела