2006-03-01, 22:13
  #1
Medlem
Mr_Ypzilons avatar
Jag tvekade länge om jag skulle ställa denhär frågan i Programmering eller här, och om nån tycker att den inte passar in får ni gärna flytta på den.

Jag har i massvis med år funderat på hur ett virus egentligen sprider sig vidare. Det jag menar med virus här är alltså ett program som infekterar t.ex. .exe-filer med en egen kodsnutt.
När jag var ung och dum försökte jag experimentera med att öppna två exefiler i notepad/edit och klistra ihop dem, men det gick ju inget vidare. Så hur gör virusprogrammet egentligen för att fixa detta? För på nåt vis är det väl klippa-klista-metoden som det använder? Hur gör man i så fall det i kompilerad kod?

Vill påpeka att jag alltså inte är ute efter att programmera virus, men jag är himla nyfiken på hur det funkar egentligen... Hoppas att någon tycker att frågan är intressant och kan komma med ett svar!
Citera
2006-03-01, 22:47
  #2
Medlem
^swestres^s avatar
Citat:
Ursprungligen postat av Mr_Ypzilon
Jag tvekade länge om jag skulle ställa denhär frågan i Programmering eller här, och om nån tycker att den inte passar in får ni gärna flytta på den.

Jag har i massvis med år funderat på hur ett virus egentligen sprider sig vidare. Det jag menar med virus här är alltså ett program som infekterar t.ex. .exe-filer med en egen kodsnutt.
När jag var ung och dum försökte jag experimentera med att öppna två exefiler i notepad/edit och klistra ihop dem, men det gick ju inget vidare. Så hur gör virusprogrammet egentligen för att fixa detta? För på nåt vis är det väl klippa-klista-metoden som det använder? Hur gör man i så fall det i kompilerad kod?

Vill påpeka att jag alltså inte är ute efter att programmera virus, men jag är himla nyfiken på hur det funkar egentligen... Hoppas att någon tycker att frågan är intressant och kan komma med ett svar!
Själva spridningen sker oftast via någon aktuell sårbarhet som viruskodaren dragit ner exploiten till från Internet. Sen kombinerar man det med en scanningmodul för just den sårbarheten man utnyttjar och så har man en fungerande spridningsmodul!

Man kan infektera filer på ett antal olika sätt, man kan använda tomt utrymme i PE-ramarna, man kan skriva över programmet (vilket är korkat), man kan skriva viruset så att det fungerar som en kombinerad packer/unpacker, men det vanligaste är nog att man sätter en entrypoint i det existerande programmet som pekar på slutet där man infogar koden man vill köra och sen kör en jmp tillbaks till orginalfilen. Jag är ingen viruskodare, så jag ber om ursäkt för eventuella fel.
Citera
2006-03-01, 23:05
  #3
Medlem
förlåt att jag går lite offtopic, men fan va lustigt att jag såg ditt inlägg här swestres. jag vet inte om du kommer ihåg mig men jag tror jag hette "c4" på telhack för massvis med år sen.. hittade till och med ett gammalt dokument du skrev till mig förr i tiden. så du håller fortfarande på med de här datatjofräset

hoppas allt e bra med dig! hej
Citera
2006-03-01, 23:13
  #4
Medlem
Mr_Ypzilons avatar
Citat:
Ursprungligen postat av ^swestres^
...packer/unpacker, men det vanligaste är nog att man sätter en entrypoint i det existerande programmet som pekar på slutet där man infogar koden man vill köra och sen kör en jmp tillbaks till orginalfilen. Jag är ingen viruskodare, så jag ber om ursäkt för eventuella fel.

Hmm, hur funkar entrypoints? Jag har ju redan konstaterat att ett rent klippa-klistra-förfarande inte funkar, så min fråga är väl hur viruset/programmet gör just den biten. Det borde väl vara något motsvarande som crack-patchar gör, och dem förstår jag inte heller. Hade man källkod/assembler att arbeta mot vore det ju lugnt att klistra in egna funktioner, men hur funkar det i redan kompilerad kod?
Citera
2006-03-02, 08:35
  #5
Medlem
Caecigenuss avatar
Du bör undersöka hur en exekverbar fil (allmänt känd som *.exe-filen) är uppbyggd. Den är nämligen inte endast ren och rak kod utan bygger på en struktur där man hanterar:
* Minnet - strängar, konstanter osv. som ett program behöver.
* Kod - för att utföra något med x86 processorn du använder.
* Länkning - för att kunna utnyttja Windows API's som används vid all programmering i Windowsmiljö.
* Headers - ligger först i exe-filen och används av operativsystemet för att ta reda på vad det är för sorts exeverbar fil; drivrutin, dll-fil eller en vanlig rak exe-fil som vi behandlar här. Headers kan också innehålla annan information, som checksums, sektorer, osv. (Mycket tekniskt och ointressant tjaffs där när vi nu snackar virus).

Minnet, koden och länkningen ligger i olika sektorer som brukar kallas .code, .text, och .itext osv. beroende på vad de innehåller (testa att öppna en exe-fil i notepad så ska du nog kunna hitta någon av dem, spara den inte sen bara för då ändrar du i filen - och det vill du inte).

Det sätt man använder i Windows för att strukturera upp sin exe-fil kallas för PE (Portable Executable). Och ser ut på följande vis:

[DOS-header][PE-header][Sektioner m. data eller kod]

...

Det swestres nämnde om att ändra entrypoint görs i PE-headern och gör att där du startar koden flyttas till ett annat index i filen, där du givetvis lagt till din egen kod. Kruxet är att du ofta måste lägga till / utöka en sektion för detta och då krävs väldigt goda kunskaper om PE-formatet.

Du kan också klämma in en jmp-instruktion (x86 Assembler) och på så vis också flytta kodflödet till din kod, här måste du också lägga till / utöka sektioner. Det stora problemet här är att du måste flytta alla pekare (hänvisningar i minnet så att de blir rätt) annars kommer programmet att krascha - exe-filer är väldigt känsliga för fel och ibland undrar om man varför de över huvudtaget. kan fungera som de gör...

Dessa sätt kan kombinera på ett otal vis och få fram egna skapelser, som använder sig av avancerade tekniker som att kryptera, packa och/eller att hoppa flera gånger i koden för att få den att göra det virusskaparen vill.

Jag är inte heller viruskodare så jag ber också om ursäkt för eventuella fel.
Citera
2006-03-02, 10:27
  #6
Medlem
seb-s avatar
Vill du programmera ett tvättäkta virus som infekterar PE-filer, eller en mask (eller kombination av de två)?

Som andra påpekat så finns det en del sätt du kan infektera via:

* Skriver över destination filen totalt
* "Appendar" virusets kod till filen och modifierar därefter entry-pointen som skall finnas i någon av IMAGE_X_HEADER strukturerna
* "Prependar" destination filen med virus koden så virusets körs först. Du kan därefter använda dig av en JMP (E9) och sedan hoppa till programmets originella kod för att undvika misstanke hos användaren
* Du kan öka den virtuella storleken på den sista sektionen, som det kallas, i PE-filen tills den är stor nog att hålla viruses kod med. Därefter skriver du helt enkelt till slutet av sektionen och modifierar entry-pointen eller använder dig av en JMP

Det finns även andra sätt, men dessa är de mesta populära skulle jag tro.

Vill du infektera filer så borde du studera PE-filformatet samt bli bekant med dessa APIs:

CreateFile
CreateFileMapping
MapViewOfFile
...

Angående spridning; det är rätt så vanligt att maskar/virus bär på sin egna SMTP-motor för att massprida sig via e-mail, vilket inte är så svårt.

Du behöver en EML fil för att studera dess struktur (ifall du inte redan kan det) eller så kan du nog ladda hem en tutorial om e-mail formatet på nätet. Därefter är det bara att konstruera ett e-mail med en Base64-kodning av sig själv och använda sig av ett lockande ämne samt text för att lura användaren till att öppna ditt e-mail eller den bifogade fil.

Du kan även skapa en sisådär 100 kopior av dig själv i KaZaA's share katalog eller någon av de andra populära fildelningsprogrammen (dock inget jag skulle göra).

Det går även att sprida sig via nätverket med WNet* API:na, men detta orkar jag inte gå igenom just nu.

Angående s.k exploits; arbeta på de ämnena jag tidigare nämnde, sedan kan du börja med exploits. Dock är det inte lika vanligt (såvitt jag vet) med användarkritiska exploits idag, i alla fall inte som på gamla goda Klez tiden.

Lycka till!
Citera
2006-03-02, 11:08
  #7
Medlem
Här finns en (historisk) intressant utläggning om virus i datorprogram:
http://www.cs.bell-labs.com/who/dmr/tdvirus.pdf
Citera
2006-03-02, 13:26
  #8
Medlem
Realizes avatar
Intressant!
Citera
2006-03-02, 14:48
  #9
Medlem
^swestres^s avatar
henqe right? Jag hoppas du brännt det där dokumentet, för såhär i efterhand så är det pinsamt dåligt Ha det fint själv.

Här är ett microsoftiskt dokument angående PE formatet:
http://www.microsoft.com/whdc/system...re/PECOFF.mspx

Följdfråga, hur är det, används COFF i andra format som tex ELF?
Citera
2006-03-02, 19:35
  #10
Medlem
Mr_Ypzilons avatar
Citat:
Ursprungligen postat av seb-
Vill du programmera ett tvättäkta virus som infekterar PE-filer, eller en mask (eller kombination av de två)?

Jag är faktiskt mest intresserad av hur det går till att leta igenom .exe-filen och hitta rätt ställe att skriva till - inte av att faktiskt genomföra det. (även om jag såklart kommer att testa, dock inte nödvändigtvis med smittsam kod).
Men jag förstår nog fortfarande inte hur man faktiskt gör för att läsa den exekverbara filen på ett sätt som ger vettig information. Jag har laddat ner nån PE-läsare där man ju ser PE-strukturen i en fil och kan läsa assemblerkoden, men en exefil öppnad i notepad eller läst med fopen är ju fortfarande bara rappakalja. Jag får känslan av att ha missat något grundläggande.

Så vill jag passa på att säga att jag tycker verkligen det är jätteintressanta utläggningar ni har kommit med - jag är väldigt fascinerad och känner att jag lär mig en massa spännande saker! Mer sånt! =)
Citera
2006-03-02, 20:46
  #11
Medlem
Viruset kan lägga till en sektion och lägga till sin egna kod.
Om orginalfilen ser ut såhär

.text
.data
.rsrc

Ser den ut så här när den är infekterad. Namnet kan vara vadsomhelst.


.text
.data
.rsrc
.VIRUS


Entrypointen ändras sen till den nya sektionen och viruset körs innan programmet. Det hela går så snabbt så man hinner knappast märka någonting.

Eller så lämnar man Entrypointen på filen och lägger till en JMP till viruskoden. En fördel om man inte lägger till nya sektioner är att storleken på filen blir oförändrad. Man kan förvisso ändra storleken på en annan sektion och få det att gå jämt ut :P

De flesta filer har ställen där ingenting händer, NULL bytes. (Om de inte är mappade i minnet fungerar de inte). Där lägger man till kod. I ASM förstås. Ett virus kan därför scanna efter tomma ställen att lägga till sig själv, eller göra lite mer avancerade beräkningar, tex
Virtual Adress + Virtual Size

00409E17 00 DB 00
00409E18 00 DB 00
00409E19 00 DB 00
00409E1A 00 DB 00
00409E1B 00 DB 00

Behöver inte vara 00, huvudsaken att det är överflödig kod.



Många tricks finns det
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in