Pitanje:
Statička analiza C ++ binarnih datoteka
user1354557
2013-03-20 23:09:55 UTC
view on stackexchange narkive permalink

Kada se binarne datoteke obrnutog inženjeringa kompajliraju iz C ++-a, uobičajeno je vidjeti mnogo neizravnih poziva na pokazivače na funkcije u vtables. Da biste odredili kuda vode ti pozivi, uvijek morate biti svjesni tipova objekata koje očekuje pokazivač this u virtualnim funkcijama, a ponekad i mapirati hijerarhiju klase.

U kontekstu statičke analize, koje alate ili tehnike bilježenja koristite za pojednostavljivanje virtualnih funkcija prilikom rastavljanja? Rješenja za sve alate za statičku analizu su dobrodošla.

Jedan odgovor:
#1
+24
Igor Skochinsky
2013-03-21 00:49:02 UTC
view on stackexchange narkive permalink

Držao sam govor u Reconu 2011. godine ("Praktična C ++ dekompilacija") o upravo toj temi. Dostupni su dijapozitivi i video ( ogledalo).

Osnovni pristup je jednostavan: klase predstavite kao strukture i tablice kao strukture pokazivača na funkcije. Postoje neki trikovi koje sam opisao i koji vam omogućuju rukovanje nasljeđivanjem i različitim vtables za klase u istoj hijerarhiji. Ti su trikovi također opisani na ovom blogu; Nisam siguran je li se temeljilo na mojem razgovoru ili samostalnom radu.

Još jednu stvar koju radim je dodavanje ponovljivog komentara u svaki utor u strukturi vtable s adresom implementacije. To vam omogućuje da brzo prijeđete na implementaciju kada primijenite strukturu na opterećenje vtable utora:

enter image description here

Pitanja o ovome: 1) Kako (osobno) komentirate neizravne pozive kada vtable na koji se upućuje nije određen? (točnije, kada postoji više mogućih ciljnih adresa za poziv?) 2) Kako (osobno) imenujete svoje strukture klasa prije nego što odredite njihovu svrhu i dokle dopuštate da se njihova privremena imena šire kroz bazu podataka prije nego što ih promijenite ?
Ja (obično) stvorim jednu strukturu vtable po stvarnoj instanci vtable, tako da adrese uvijek upućuju na stvarnu implementaciju. Međutim, ništa vas ne sprječava da u komentar dodate nekoliko adresa. Što se tiče imenovanja, zapravo nemam fiksni skup pravila, u jednu bazu podataka mogu miješati mađarske, CamelCase i unsescored_words. Preimenovanje stvari je dosadno, pa obično odgađam preimenovanje klasa i metoda dok ne budem razumno siguran što klasa radi (ili imam RTTI ili informacije o otklanjanju pogrešaka).
Izvrsno. Što se tiče drugog pitanja, pitao sam vas imate li neki sustavan način generiranja i rukovanja privremenim imenima. U nedostatku kontekstualnih informacija, ono što radim je da odaberem "slučajno" fonetsko troznakovno ime za razred. Budući da se ovo privremeno ime širi na komentare, nazive funkcija, članove strukture, imena varijabli itd. Neću se uvijek zamarati preimenovanjem, ali umjesto toga napravit ću bilješku u podpregledu Notepad koja objašnjava što je klasa zapravo.


Ova pitanja su automatski prevedena s engleskog jezika.Izvorni sadržaj dostupan je na stackexchange-u, što zahvaljujemo na cc by-sa 3.0 licenci pod kojom se distribuira.
Loading...