Стэк и оптимизация - 21:07 - by No
 
Полномерно используя стэк вы можете сократить размер
вируса на хуеву тучу байт. Размер стэка по умолчанию
примерно равен 4м килобайтам. Если учесть что вызовы
процедур используют за всю работу максимум 3-4% от всего
стэка, то не сложно догадаться что остальное место
можно потратить на собственные нужды. Вот дешевенький
примерчик: Вы когда-нибудь задумывались сколько байт занимает
всего лишь один вызов api из переменной.

call    [ebp+offset ThisIsAPI1RVA]

вот такого типа вызов равняется 6!ти байтам! Сделаете 10 вызовов -
будет 60 байт! Не экономно это. Если у вас стэк будет выглядеть
вот типа этого:
[API1],[API2],[API3],[API4],[APIX]
 <------------------------------- возрастание адреса стэка
то вы можете очень нихреново сократить размер вируса.

Пусть в EDI адрес стэка APIX. Тогда
call    [edi+4*api_n-1]         ; это если начинать считать с 1цы
такой вызов занимает 3 байта! + то, что вам не придется выделять
место для адресов внутри вируса(если нихрена не понятно, см. исходник)
хах! 20 адресов - 20 DWORD`ов - 20*4 = 80 байтам!!

Но это еще далеко не все приколы. 4 килобайта даны не зря.
Вы можете их использовать под структуры и какое-либо другое дерьмо.
Вообщем, хороший кодер должен выжимать из стэка все, что можно и
чего нельзя. Если вы думаете типа "да похую на оптимизацию, я же
не на Си пишу" а вот и хуй. Неоптимизированный вирус - признак
вирмэйкерского непрофессионализма. Такие вирусы часто встерчаются
у людей из 29a, вы же не хотите быть такими-же ;)
Вирус и огромный размер - вещи несовместимые, не пытайтесь
доказывать обратное.

Возникает заморочка как бы не потерять ту базу, с которой в стэке
идут API адреса.. а не сложно. держите этот адрес в EDI, и сохраняйте
его в стэк в тех местах, где его будут херить API или другое дерьмо.

Это конечно не все, что можно предпринять в целях оптимизации.
Но при использования такого подхода к делу эффект получается
вполне ощутимый.