dopisanie kodu do pliku

dopisanie kodu do pliku
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.

Bartosz Wójcik
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
3

Piszesz wirusa? To już niemodne.

OO
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 13 lat
  • Postów:98
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
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:około rok
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 :).

msm
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ć) :)
Bartosz Wójcik
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
Azarien
to już lepiej wkleić całego exeka do zasobów, a ze wstrzykniętego kodu tylko go załadować i odpalić jako osobny proces.
MF
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:9
0

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

Bartosz Wójcik
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 4 lata
  • Postów:439
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

msm
Administrator
  • Rejestracja:około 16 lat
  • Ostatnio:5 miesięcy
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...

Bartosz Wójcik
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.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:mniej niż minuta
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.

Bartosz Wójcik
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.
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.

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:mniej niż minuta
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
Bartosz Wójcik
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 :)
Azarien
ale dałem linka :-)
Bartosz Wójcik
Dałeś linka do dokładnie tej samej metody pobierania uchwytu kernela przez PEB ;) ogarnij się ziom :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.