dopisanie kodu do pliku

Odpowiedz Nowy wątek
2011-07-31 22:25
mev
0

Witam, mam pytanie odnośnie dopisywania kodu do pliku. Wiem jak to zrobić, ale załóżmy, że dawniej pisane wirusy same dopisywały swój kod do innych plików i go wywoływały. Moje pytanie brzmi: jak dopisać kod do jakiegoś pliku (np exe) i go wywołać, skoro wcześniej musiałby być skompilowany by został uruchomiony ? Dla przypomnienia tak działały przykładowe wirusy, które wstrzykiwały swój kawałek kodu. Pozdrawiam.

Poszukaj sobie zinów vx, np. Lorda Julusa (1 tutek znalazłem tutaj http://www.thehackademy.net/madchat/vxdevl/papers/vxers/pe_infection__tutorial.txt), poczytaj zinki 29A - Bartosz Wójcik 2011-08-01 01:44

Pozostało 580 znaków

2011-07-31 22:39
Kumashiro
3

Piszesz wirusa? To już niemodne.

Pozostało 580 znaków

2011-07-31 22:42
O_o
0

Podsumowując: przeczytałeś gdzieś jak to niby działa i zachciało się wirusa napisać?
Jak już wyżej zauważono, to już niemodne. Idź się poucz czegoś kreatywnego.


O̾..͠o

Pozostało 580 znaków

2011-07-31 22:53
Rev
4

Mistrzem w RE nie jestem, ale w przypadku plików PE będzie to mniej więcej tak: tworzysz nową sekcję, oznaczasz ją jako wykonywalną, wrzucasz tam kod swojego wirusa, zmieniasz pole AddressOfEntryPoint w nagłówku na początek dodanej sekcji, później trzeba na koniec kodu wstawić adres skoku pod oryginalny kod. W praktyce jest to jeszcze bardziej skomplikowane, kod musi być odpowiednio przygotowany (nie możesz tam po prostu wrzucić wyniku kompilacji delphi/c++ ;)), trzeba pamiętać o ewentualnych relokacjach, importach. Jeżeli to wszystko ma modyfikować sam kod wirusa to jest to jeszcze trudniejsze.

Rzecz na pewno ciekawa, ale IMO nie poradziłbyś sobie z czymś 10 razy prostszym. Polecam ^ rady kolegów :).


Twoja odpowiedź jest taka jakaś zbyt poważna ;). A do rzeczy - sam kiedyś pisałem coś podobnego (robaka kopiującego się do innych plików .exe -> w przeciwieństwie do naszego hax0ra w celach edukacyjnych i z ciekawości jak to działa). Projekt nieskończony ale jeszcze do tego kiedyś wrócę (skończyłem kiedy okazało się że trzeba pobawić się z tablicą importów żeby cokolwiek kod mógł zrobić) :) - msm 2011-07-31 23:18
bez problemu możesz tam wrzucić całą aplikację w delphi czy czymkolwiek innym, tylko musisz zadbać o to, żeby była odpowiednio obsłużona, sekcje załadowane w pamięci, importy wypełnione, hooki obsługujące dostęp do zasobów (od Win2k nawet nie trzeba), obsłużone relokacje (wymagana ich obecność!), emulacja TLS, hooki korygujące działanie różnych funkcji, mówiąc krótko jest to możliwe, ale wymaga sporej wiedzy, może kolega, który pisze tego wirka zainteresuje się binderami, to chyba będzie najlepsze rozwiązanie hehe :P - Bartosz Wójcik 2011-08-01 01:41
to już lepiej wkleić całego exeka do zasobów, a ze wstrzykniętego kodu tylko go załadować i odpalić jako osobny proces. - Azarien 2011-08-01 09:28

Pozostało 580 znaków

2011-07-31 23:36
mf
0

A nie prościej napisać złośliwy program i udostępnić go jako hot_naked_teens_xxx_blondie.exe?

Pozostało 580 znaków

2011-08-01 01:35
1

@MSM
Wystarczy, że masz dostęp do LoadLibrary() / GetModuleHandle() (obie funkcje siedzą w bibliotece KERNEL32.dll), funkcję pobierającą adres z załadowanych bibliotek (oryginalnie GetProcAddress() ) można z łatwością samemu napisać lub znaleźć na google.

Metoda 1 - bazę kernela sobie pobierz przez skanowanie modułów z PEB, potem skanujesz eksporty KERNEL32.dll własną procedurą GetProcAddress() w poszukiwaniu LoadLibrary() w kernelu i masz wszystko czego potrzebujesz, BEZ tablicy importów, proste jak drut i używane od lat w exe-pakerach / protektorach / wirusach i innych ustrojstwach mieszających w formacie PE

http://www.ragestorm.net/blogs/?p=369

Zalety - nie wymaga ingerencji w oryginalne struktury PE-ka
Wady - jakby nie patrzeć pobieranie bazy bibliotek przez PEB jest nieudokumentowaną metodą

Metoda 2 - skanujesz tabele importów PE-ka i szukasz wpisów LoadLibrary() / GetModuleHandle() / GetProcAddress() w 99% przypadkach znajdziesz te funkcje w każdym exeku i dllce i potem w dopisanym kodzie, po prostu odwolujesz się bezpośrednio do ich adresów

Zalety - ładna integracja z oryginalną aplikacją
Wady - tych funkcji może tam po prostu nie być

Metoda 3 - dopisujesz te funkcje do istniejącej tablicy importów

Zalety - jeszcze łądniejsza integracja z aplikacją
Wady - cała masa, przepisanie oryginalnej tabeli importów, ewentualne rozszerzenie sekcji importów (co pociąga inne konsekwencje)

Metoda 4 - tworzysz własną tablicę importów z wpisami LoadLibrary() / GetProcAddress(), ewentualnie wszystkimi innymi bibliotekami i funkcjami jakie chcesz, a oryginalną tabelę importów wypełniasz przed skokiem do OEP, jest to chyba najpopularniejsza metoda.

Zalety - prostota, zbudowanie własnej tabeli importów jest po prostu wygodne
Wady - konieczność wypełnienia oryginalnej tabeli importów aplikacji, konieczność zadbania o statyczne podlinkowanie oryginalnych bibliotek z oryginalnej tabeli importów


Pozostało 580 znaków

2011-08-01 03:25
msm
0

@Bartosz Wójcik - Dzięki!

O tym że wystarczy LoadLibrary / GetModuleHandle wiedziałem, to że GetProcAddress można sobie samemu napisać już nie, ale to i tak tylko jedna funkcja więcej.

Co innego metody - szczerze mówiąc wpadłem tylko na metodę 2 i 3, przy czym 2 odrzuciłem, nie pamiętam dlaczego ale chyba załadowałem jakiś program i nie znalazłem tych funkcji albo po prostu odrzuciłem na wszelki wypadek. Zostało mi tylko 3 i po prostu na myśl o przepisaniu całej tablicy importów i dopasowaniu reszty programu do niej (rozmiar się w końcu zmieni) się poddałem (wiadomo że prędzej czy później bym to zrobił, ale jakoś po prostu nie miałem zapału do grzebania w tym)...

Za to 1 (szczególnie) i 4 wyglądają ciekawie, nawet jeśli tego w końcu nie napiszę to warto będzie o tym poczytać. Chociaż chyba jak już mam wszystko na tacy to zrobię jeszcze jedno podejście, w końcu modyfikowanie programu na dysku jest pozbawione sensu jeśli nie można wywołać żadnej funkcji...

Jeśli to projekt amatorski to metoda 1 wystarczy, ale lepiej unikać takich metod, bo wyjdzie nowy Windows, zmienią wewnętrzne struktury i będzie zwis, pakery/protekty korzystają w większości z 4ki, bardzo fajnie to widać na przykładzie skompresowanych aplikacji po UPX, z oryginalnej tabeli importów wyciągane są nazwy DLL-i i wkładane do nowej tabeli importów (żeby system Windows je automatycznie ładował), dodatkowo dodawane są właśnie funkcje LoadLibrary (wiąże się z tym pewien bug niepotrzebnego zwiększania referencji http://blog.rewolf.pl/blog/?p=80) i GetProcAddress. - Bartosz Wójcik 2011-08-01 12:52

Pozostało 580 znaków

2011-08-01 09:34
0

A czy nie jest tak, że kernel32.dll jest zawsze dostepne i załadowane? przykładowo, zawsze można zrobić GetProcAddress na funkcji z kernel32.dll bez uprzedniego LoadLibrary i zadziała. Wydaje mi się, że LoadLibrary można wykreślić z listy funkcji potrzebnych na początku.

GetProcAddress jest funkcją z biblioteki KERNEL32.dll, więc skoro masz do niej dostęp to KERNEL32.dll jest już załadowany hehe :), LoadLibrary nie można wykreślić, bo jak inaczej załadujesz biblioteki inne? Zresztą, polecam analizę różnych pakerów/protektów. - Bartosz Wójcik 2011-08-01 12:58

Pozostało 580 znaków

2011-08-01 15:03
mev
0

Kumashiro, O_o, mf, gdzie napisałem że chce pisać wirusa ? Po pierwsze chodziło mi o zasade a po drugie nie pisze wira tylko chciałem wiedzieć jak to było wcześniej robione więc nie dopowiadajcie sobie historyjki.

Pozostało 580 znaków

2011-08-01 15:50
0
Bartosz Wójcik napisał(a)

LoadLibrary nie można wykreślić, bo jak inaczej załadujesz biblioteki inne?
Może wyrażę się jaśniej. Potrzebne są dwie funkcje: zestaw LoadLibrary+GetProcAddress, albo GetModuleHandle+GetProcAddress. W drugim przypadku zakładamy że kernel32.dll jest już załadowany, a dalsze funkcje, w tym LoadLibrary, pobieramy przez GetProcAddress.

GetProcAddress jest funkcją z biblioteki KERNEL32.dll, więc skoro masz do niej dostęp to KERNEL32.dll jest już załadowany hehe :)
Jak już wspomniano, nie muszą to być prawdziwe te funkcje, mogą być napisane samodzielnie (nie wnikam tu na ile łatwe bądź trudne to będzie).

PS. a tutaj pokazano, jak pobrać "handelek" na kernel32.dll bez GetModuleHandle, jest i gotowiec na GetProcAddress. Nie sprawdzałem, ale jeśli to działa, to "jesteśmy w domu".

edytowany 3x, ostatnio: Azarien, 2011-08-01 15:55
Azarien przeczytaj jeszcze raz mój post [Metoda 1] o pobieraniu uchwytu kernela przez PEB, a stwierdzisz, że to co piszesz zostało już napisane :) - Bartosz Wójcik 2011-08-01 16:34
ale dałem linka :-) - Azarien 2011-08-01 23:56
Dałeś linka do dokładnie tej samej metody pobierania uchwytu kernela przez PEB ;) ogarnij się ziom :) - Bartosz Wójcik 2011-08-02 16:11

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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