Wirus pasożyt [C & ASM]

1

Witam, mam w ramach projektu na przedmiot Oprogramowanie Systemowe wymyślić sobie temat i zaimplementować (im bardziej niskopoziomowo tym lepiej). Wybrałem (wstępnie) napisanie wirusa typu pasożyt, który miałby się podpinać pod pliki .exe i rozprzestrzeniać. Już trochę czytałem na ten temat, poznałem różne techniki implementacji lecz... wszystkie artykuły jakie czytałem na ten temat były dość dawno opublikowane i mówiły głównie o win95. Pojawia się pytanie, czy jest możliwe podpięcie wirusa do pliku exe w Windows 7 ? W najbliższych dniach muszę podać swój temat wraz z planem implementacji więc przydałoby się wiedzieć czy to możliwe i w granicach moich możliwości :)

Pozdrawiam

0

Format pliku PE raczej się nie zmienił od czasów Win 95, więc przynajmniej niektóre tutoriale powinny działać.

0

Pojawia się pytanie, czy jest możliwe podpięcie wirusa do pliku exe w Windows 7 ?

Jest możliwe :]

Napisz czy zdecydujesz się na pisanie czegoś takiego - w sumie trafiłeś w moje zainteresowania, sam się zastanawiam nad napisaniem czegoś takiego, tylko że mnie nie goni żaden przedmiot.

0

No myślę, że napiszę takiego wirusa, w poniedziałek skonsultuję ten pomysł z prowadzącym. Jak zaakceptuje to mogę liczyć na jego pomoc.

Jak ktoś zna strony bogate w informacje o wirusach to proszę podać tutaj linki, na pewno się przydadzą.
Najciekawsza strona na jaką udało mi się trafić to: http://vxheavens.com/
Tutaj jest ładny spis treści: http://webaddicts.blogspot.com/2007/11/excellent-tutorials-on.html

0

Możliwe jest i w C++, bez grama assemblera. Kwestia znajomości języka, mechaniki kompilatorów i działania systemu operacyjnego/komputera. Jedyne, na co musisz zwrócić uwagę to prawa do wykonywania - odpada umieszczanie kodu w nagłówku pliku lub sekcji danych bez zmiany jej atrybutów (uroki DEP).

0

@autor, deus - temat mnie natchnął i zacząłem pisać coś takiego (z małym pr0 ficzerem) na własną rękę - jestem już za połową pracy, a skończyłbym gdyby nie to że w międzyczasie zajmuję się pisaniem 4 innych programów i uczeniem się 2 języków programowania... (i natrafiłem na drobny problem techniczny - jak skopiować kod funkcji w C++ do tablicy bajtów = pamięci procesu)
Tak czy inaczej piszę w C++ bo w tym języku jest biblioteka pozwalająca nie odkrywać (w miarę) koła na nowo. Czyli da się.

0

Byłem u prowadzącego zajęcia i ogólnie temat mu się spodobał, polecił mi dwie strony:
http://win32assembly.online.fr/tutorials.html - budowa pliku PE
http://amdfanatyk.w.interia.pl/download/virii/virii.pdf - tutorial

@msm, o jakiej bibliotece mówisz?

0

Dawno temu napisałem infektor plików wykonywalnych w pure C++, tylko własne szablony, makra, logika, bez zewnętrznego kodu. Dać się da, chociaż trochę gimnastyki trzeba. Co do budowy plików PE to polecałbym raczej oficjalną specyfikację...

0
Blackmoore napisał(a)

Byłem u prowadzącego zajęcia i ogólnie temat mu się spodobał, polecił mi dwie strony:
http://win32assembly.online.fr/tutorials.html - budowa pliku PE
http://amdfanatyk.w.interia.pl/download/virii/virii.pdf - tutorial

Jak chcesz cos po Polsku to Dzejo(uzytkownik tego forum, poszukaj profilu) ma fajnego pdfa na stronie o infekcjii PE i troszeczke o bootsector'ach. Natomiast ogolnie to wszystko masz w zinach grupy A29, do ktorych to link jest na pierwszej stronie, ktora podales w poprzednim poscie.

@msm: o co Ci chodzi konkretnie ? o to ?

#include <stdio.h>

void procka(void)
{
	printf("haha\n");
}


int main(void)
{
	unsigned char buff[0x100], *ptr = (unsigned char*)procka;
	int i;

	i = 0;
	while(*ptr != 0xC3) {
		buff[i] = *ptr;
		ptr++; i++;
	}

	i = 0;
	while(buff[i])
		printf("%3.2X", buff[i++]);
	printf("\n");

	return 0;
}
0

@t0m_k, chyba 29A, po Twojemu 666. Co to za kod i po jaką cholerę?

0
deus napisał(a)

@t0m_k, chyba 29A, po Twojemu 666. Co to za kod i po jaką cholerę?

tak, tak 29A, a kod po to, zeby dowiedziec sie o co chodzi mniej wiecej, <ort>na pewno</ort> nie do uzycia ;p

0

Ja po tym kodzie absolutnie nie wiem o co chodzi, chociaż infektor lata temu napisałem...

0
deus napisał(a)

Ja po tym kodzie absolutnie nie wiem o co chodzi, chociaż infektor lata temu napisałem...

Ja tez za bardzo nie wiem o co chodzi dlatego probuje skreslic najlatwiejsza ewentualnosc, czyli skopiowanie kodu funkcji do ret(co prawda ostatnie powinno byc, a nie pierwsze ale niech bedzie) w inne miejsce tej samej przestrzeni adresowej.
MSM nie wspomnial, ze do innej przestrzeni adresowej, wiec albo problem jest z okresleniem kiedy sie ta funkcja konczy, a kopiowanie pozostaje podobne albo doslownie jak MSM napisal kodu C++ skopiowanie do pamieci, co sie wiaze z kompilacja tego kodu, ale to bylaby bzdura. Chyba, ze o skopiowanie do innej przestrzeni sie rozchodzi.

0

Widzę że mały flame rozpętałem...

@msm, o jakiej bibliotece mówisz?

tylko własne szablony, makra, logika, bez zewnętrznego kodu.

Nic specjalnego, po prostu kilka funkcji do najprymitywniejszej obsługi plików PE (przypomniałem sobie o nich dobrą chwilę po rozpoczęciu pisania, i dobrze)
Dobre tutoriale o RE, może ci pomogą (BTW ten z czarnym awatarem powyżej mi kiedyś je polecił i od tego się zaczęła moja walka z niskopoziomem.)
http://re.coldwind.pl/
A odnośnie biblioteki konkretnie chodziło mi o plik PE.cpp w źródłach dołączonych do odcinka 5 - http://re.coldwind.pl/dl/packer_005.zip - dosłownie dwie funkcje publiczne i kilka pól.

@tom_k - ale przecież raz - funkcja może mieć więcej niż jeden ret (żadna specyfikacja nie zabrania, co więcej ret to tylko "syntax sugar" dla pobrania adresu ze stosu i skoczenia do niego, jakiś cholerny obfuskujący kompilator mógłby to równie dobrze użyć np. do wykonania skoku, więc to wcale niekoniecznie miejsce gdzie funkcja się kończy) a dwa - nikt nie powiedział że funkcja nie może być porozrzucana po pamięci (najoczywistsza rzecz - gdybym chciał użyć "stałych łańcuchów tekstowych" to kompilator mógłby je wyrzucić do sekcji danych.)

0
MSM napisał(a)

@tom_k - ale przecież raz - funkcja może mieć więcej niż jeden ret (żadna specyfikacja nie zabrania, co więcej ret to tylko "syntax sugar" dla pobrania adresu ze stosu i skoczenia do niego, jakiś cholerny obfuskujący kompilator mógłby to równie dobrze użyć np. do wykonania skoku, więc to wcale niekoniecznie miejsce gdzie funkcja się kończy) a dwa - nikt nie powiedział że funkcja nie może być porozrzucana po pamięci (najoczywistsza rzecz - gdybym chciał użyć "stałych łańcuchów tekstowych" to kompilator mógłby je wyrzucić do sekcji danych.)

Tak, ale jak kopiujesz swoja funkcje to wiesz jak ona wyglada i gdzie sie konczy, wiec w czym problem ? Piszesz infektor i chcesz z nieswojego kodu pozyczac funkcje ?

0
t0m_k-tmp napisał(a)

Tak, ale jak kopiujesz swoja funkcje to wiesz jak ona wyglada i gdzie sie konczy, wiec w czym problem ?

Na pewno wiesz? Przy bardziej skomplikowanym kodzie CL potrafi sam z siebie kilka epilogów wygenerować, jako optymalizację pod względem szybkości, zaś GCC potrafi kilka epilogów złączyć w jeden przy -Os, kilka epilogów różnych funkcji. To nie takie proste jak na pierwszy rzut oka się wydaje.

Poza tym wartość 0xC3 może się pojawić przypadkowo i wcześniej, chociażby przy tworzeniu ramki stosu.

0

Piszesz infektor i chcesz z nieswojego kodu pozyczac funkcje ?

Piszę infektor i chcę ze swojego kodu skopiować funkcję (chociaż twój pomysł też jest ciekawy :) ). Martwię się tylko po prostu co z moim kodem zrobi kompilator. Dopóki nie napiszę całości kodu w asemblerze (a nie napiszę, wiadomo czemu) nie będę miał pewności co się naprawdę stanie.

edit: uprzedzony.

0

hehe, zaciekawil mnie ten problem :>

0

Już dosyć teorii się naczytałem, wziąłem się za implementację i pojawił się problem. Głupie pytanie:
Jak odczytać dane z dysku w Assemblerze? :) Jak dotąd używałem tylko adresów pamięci operacyjnej, w jaki sposób mogę się dostać do adresu na dysku twardym, żeby np. sprawdzić plik czy zaczyna się od 'MZ' ?

Chcę skorzystać z tego tutoriala
http://amdfanatyk.w.interia.pl/download/virii/virii.pdf
ale bez adresu tego pliku nic nie zdziałam :P

0

A skad wiesz gdzie konkretnie plik lezy na dysku ? W systemie FAT12/16/32 masz na pierwszym sektorze bootloader, na nastepnych tablice fat, ktora jest tak jakby lista numerow kolejnych klastrow opisujacych dany plik. Numery sa zapisane w adresacji logicznej LBA. W systemie plikow NTFS masz tablice MFT. W EXT2/3/4 i-wezly, wiec proponuje zmienic sposob podejscia do problemu, poniewaz najpierw musisz wiedziec gdzie ten plik lezy na dysku, a zeby to wiedziec musisz juz miec jakies informacje o nim, wiec podejscie z poziomu user-mode troche bezsensu, poniewaz tylko kernel ma dostep do tych struktur.

Masz do dyspozycji natomiast odpowiednie wywolania systemowe, typu open, close, createfile, za pomoca ktorych mozesz sie dobrac do pliku i to ich radze Ci uzyc. Zaleznie od systemu inaczej bedzie wygladal import bibliotek udostepniajacych te wywolania do Twojej przestrzeni adresowej, ale pod Windowsem przewaznie zaladowany bedzie kernel32.dll, wiec cos z tym pokombinuj. Moze GetProcAddress() i LoadLibrary() ?

Poza tym masz to wszystko wyjasnione w linkach ktore dostales i sam znalazles.

0

Adres odczytałem za pomocą programu HxD. Chciałem na sztywno wpisać adres i wypróbować ten kod assemblerowy

0

Nie wiesz chyba za bardzo co robisz. Nie mozesz sie prawie-bezposrednio odwolac do dysku w systemie Windows na poziomie ring3, poniewaz dostep do kontrolera masz zablokowany przez kernel.

0

Inaczej troche: to co widzisz w HxD widzisz jest odczytywane z pliku urzadzenia(nie wiem jak to sie pod Windowsem nazywa), ten plik masz dostepny do tylko do odczytu, ale zeby go odczytac musisz sie odwolac do dysku czego juz nie mozesz zrobic samemu, ale mozesz za pomoca wywolan systemowych.

0

Niskopoziomowe czytanie z dysku to przerost treści nad formą ;-) oczywiście należy użyć funkcji WinAPI.

1 użytkowników online, w tym zalogowanych: 0, gości: 1