Asembler virus

Asembler virus

Din capitol veți învăța cum să puneți temporar virusul în memorie, cum să îi dați controlul, cum să încercați să găsiți fișierul.

Vom infecta NUMAI * .COM-fișiere! Dacă există timp și dorință de la dvs., atunci putem scrie un virus care infectează și fișierele * .EXE.







  • Cum se atașează virusul fișierului fără a încălca performanța acestuia?
  • Ce ar trebui să facă mai întâi virusul?
  • Cum pot transfera controlul unui virus dintr-un program străin?

Se pare ca aceasta:

Program după infecție:

Complicată? Comparați două bucăți de cod: un program neinfectat și unul infectat. Ar trebui să fie clar.

Acum vom practica.

Prima linie, .286, spune Assembler că vom folosi instrucțiuni (instrucțiuni, instrucțiuni) ale procesorului 286. Ie pe data de 8086 computerul virusul nostru deja nu va funcționa!

Din primul octet, accesați eticheta Init (inițializarea virusului nostru).

Imediat există o problemă: atunci când căutăm un fișier cu funcția DOS, suprascriem DTA "programe de victimă".

Și apoi apare a doua problemă sau, mai degrabă, întrebarea: ce este DTA și pentru ce este? Acest lucru vom lua în considerare mai târziu.

format afd.exe c: / s / u

De ce toate astea? Da la faptul că atunci când încercăm să căutăm primul fișier, atunci, găsindu-l, vom șterge linia de comandă (L_c: / s / u). Se pare că programul "victimă", la care ne-am "luat", nu va putea citi parametrii pe care le-a transferat utilizatorul. În acest caz, este L_ / s / u.

Există două moduri de a obține acest lucru.

1. Salvați programul PSP înainte de a căuta fișierul. Și apoi, pe măsură ce virusul a funcționat, restabiliți-l.

2. Instalați DTA într-o altă locație de memorie și apoi restaurați-o. Aceasta vă permite să efectuați întreruperea funcției 1Ah 21h:

Vom alege a doua cale.

mov dx, String offset

Asamblatorul va introduce în DX decalajul șirului de caractere din memorie. De fapt - după asamblare - va arăta astfel:

1234: 0200h mov dx, 400h --- 200h deoarece 100h octeți ocupă "fișierul victimă", și suntem în "coada" ei.
.
1234: 0400h --- nimic, dar nu linia noastră.
.
1234: 0500h "String" --- acolo va fi!

Puteți, bineînțeles, obține lungimea fișierului victimă înainte de infectare și apoi înlocuiți mov dx, 400h cu mov dx, 500h. Dar dacă există multe astfel de referințe? Vă puteți imagina cât de mare va crește virusul nostru?

Vom face altfel: purtați și transferați virusul (și numai virusul!) De la "coada" fișierului victimă la segmentul liber cu o deplasare de 100 de ore. Iată ce se întâmplă:







1234: 0200h mov dx, 400h --- suntem la sfârșitul programului
.
1234: 0500h "String"

5678: 0100h mov dx, 400h --- s-au mutat la segmentul 5678h, la decolarea 0100h
.
5678: 0400h "String" --- șirul a devenit în locul său (offset).

O altă întrebare: unde este garanția că nimeni nu este în acest segment și nu vom șterge codul vreunui program?

0B800 - zero
0B900 - primul
0BA00 - al doilea
0BB00 - al treilea
0BC00 - al patrulea
0BD00 - a cincea
0BE00 - al șaselea
0BF00 este a șaptea

Să calculam mărimea unei pagini. Avem suficient spațiu pentru a pune codul de virus pe el? Virusul nostru va ocupa nu mai mult de 300-400 octeți.

Luați bine-cunoscut modul 3: o linie conține 80 de caractere, linii pe ecran 25. Un singur caracter ocupă două octeți (atribut / offset). Obținem: 80 x 25 x 2 = 4000 octeți. E suficient pentru noi? Bineînțeles că e de ajuns! Chiar dacă nu ar fi de ajuns, ai putea folosi două, trei, patru pagini.

Cred că nu va fi dificil să înțelegeți noile operații ale operatorului. Principiul muncii sale corespunde în totalitate comenzii stos. Iată descrierea lui:

În acest caz, DS: SI indică unde să obțină datele, ES: DI unde să o copieze și CX - numărul de octeți / cuvinte trimise.


mov cx, 10, numărul de octeți transferați
mov si, offset Str1; unde ajungem
mov di, offset Str2; unde să copiați
rep movsb; Trimitem prin byte, de atunci movsB. Acum Str1 = Str2
.
Str1 db '0123456789'
Str2 db '9876543210'


mov cx, 5, numărul de cuvinte trimise (două octeți)
mov si, offset Str1; unde ajungem
mov di, offset Str2; unde să copiați
rep movsw; Noi trimitem cuvânt cu cuvânt (câte doi octeți fiecare), pentru că movsW. Acum Str1 = Str2
.
Str1 db '0123456789'
Str2 db '9876543210'

Deci, acum virusul nostru se află în două locuri în memorie: 1. imediat după "programul victimei"; 2. În zona celei de-a șaptea pagini (0BF00: 0100h).

jmp dword ptr cs: [Off_move]

Acum puteți încerca să găsiți primul fișier * .com din directorul curent. Pentru aceasta, se folosește funcția 4Eh a întreruperii 21h:

AH = 4Eh
CX - atributele pentru căutarea fișierelor: avem 0 (normal, nu numai pentru citire și ascuns!)
DS: DX este o mască pentru căutare. De exemplu, *. *, * .exe, com. c. c: \ *. asm etc.

CF = 1 - nu există un astfel de fișier
CF = 0: DTA este completat cu informații despre fișierul găsit

CF este steagul de transport. Dacă este scrisă CF = 1, înseamnă că stegul de transfer este setat (egal cu 1), iar dacă CF = 0, acesta este resetat (egal cu 0). Steagul de migrare este utilizat de DOS pentru a indica o eroare de funcționare sau pentru alte scopuri.

În acest caz, dacă funcția 4Eh a instalat steagul de transfer, înseamnă că nu s-au găsit fișiere care corespund condiției (masca de căutare).

Dacă pavilionul de transfer este resetat (zero), informațiile fișierului sunt introduse în DTA. Vom analiza acest lucru în următoarele capitole.

Dacă CF = 0 (resetați semnalul de transfer), atunci puteți face ceva cu fișierul găsit.

Pentru a găsi următorul fișier care satisface condiția noastră (masca de căutare), trebuie să utilizați funcția 4Fh a întreruperii 21h:

AH = 4Fh
CX - atributele pentru căutarea fișierelor: avem 0 (normal, nu numai pentru citire și ascuns!)
DS: DX este o mască de căutare (ca în funcția 4Eh).

CF = 1 - nu mai sunt fisiere care satisfac conditia (masca de cautare)
CF = 0: DTA este completat cu informații despre fișierul găsit

Este la fel ca și funcția 4Eh.

Vreau să observ că virusul nu funcționează încă. Ie el nu infectează deloc nimic! Puteți să o asamblați ușor și să o executați. Doar puțin pe care o veți vedea pe ecran. Este mai bine să te uiți sub debugger.

Apoi, totul este simplu! Cred că descrierile din program sunt suficiente pentru a înțelege principiul programului.







Articole similare

Trimiteți-le prietenilor: