Pitanje:
Koje korake mogu poduzeti kako bi moj zahtjev za C ++ bio teži za obrnuti inženjering?
WilliamKF
2013-03-21 16:05:11 UTC
view on stackexchange narkive permalink

Ako izrađujem aplikaciju C ++ i želim otežati obrnuti inženjering, koje korake mogu poduzeti da to učinim?

  • Utječe li na to izbor kompajlera?
  • Što je sa zastavicama kompajlera, vjerojatno bi pomogla visoka razina optimizacije, što je s ostalim zastavicama?
  • Pomažu li simboli za uklanjanje, a ne grade se simbolima za otklanjanje pogrešaka?
  • Treba li Šifriram sve interne podatke kao što su statički nizovi?
  • Koje bih druge korake mogao poduzeti?
Jedan odgovor:
#1
+36
Peter Andersson
2013-03-21 17:24:09 UTC
view on stackexchange narkive permalink

Izbor kompajlera ima minimalne učinke na poteškoće s povratnim inženjeringom vašeg koda. Sve najvažnije stvari koje je potrebno smanjiti povezane su s curenjem informacija iz vašeg koda. Želite barem onemogućiti sve informacije o vrsti izvođenja (RTTI). Curenje podataka o tipu i jednostavnost skupa uputa virtualnog stroja jedan su od razloga zbog kojih je CLR i JVM kôd lakše inženjerirati. Oni također imaju JIT koji primjenjuje optimizacije na kod koji mogu smanjiti snagu zamagljenosti. Zamagljivanje je u osnovi suprotno od optimizacije i mnoštvo zamagljivanja rješava se prvo primjenom optimizacijskog prolaza.

Informacije o otklanjanju pogrešaka

Savjetovao bih vam i da isključite sve informacije o otklanjanju pogrešaka, čak i ako danas ne propuštaju neke najvažnije informacije, to bi moglo učiniti sutra. Količina curenja informacija iz podataka o otklanjanju pogrešaka razlikuje se od prevoditelja do prevoditelja i od binarnog formata do binarnog formata. Na primjer, Microsoft Visual C ++ čuva sve važne informacije o otklanjanju pogrešaka u vanjskoj bazi podataka, obično u obliku PDB-a. Najviše što bi vam moglo procuriti je put koji ste koristili prilikom izrade softvera.

Nizovi

Kada su u pitanju nizovi, trebali biste ih definitivno šifrirati ako trebate. njih uopće. Želio bih zamijeniti sve one koji su za traženje pogrešaka i evidentiranje pogrešaka numeričkim nabrajanjem. Žice koje otkrivaju bilo kakve informacije o tome što se trenutno događa u vašem binarnom zapisu moraju biti nedostupne. Ako šifrirate nizove, oni će se dešifrirati. Pokušajte ih izbjegavati što je više moguće.

Sistemski API-ji

Još jedan jak izvor curenja informacija je uvoz sistemskih API-ja. Želite biti sigurni da je bilo koja uvezena funkcija koja ima poznati potpis dobro skrivena i da je nije moguće pronaći pomoću automatske analize. Dakle, niz pokazivača na funkcije s nečega poput LoadLibrary / GetProcAddress ne dolazi u obzir. Svi pozivi uvezenih funkcija moraju proći jednosmjernu funkciju i moraju biti ugrađeni u zamagljeni blok.

Standardne runtime knjižnice

Nešto puno ljudi zaboravljaju uzeti u obzir informacije koje propuštaju standardne knjižnice, poput vremena izvođenja vašeg C ++ kompajlera. U potpunosti bih izbjegao njegovu upotrebu. To je zato što će najiskusniji inverzni inženjeri pripremiti potpise za puno standardnih knjižnica.

Zamućivanje

Također biste trebali kritični kod pokrivati ​​nekom vrstom teške zamagljenosti. Neke od težih i jeftinijih zamućenja trenutno su CodeVirtualizer / Themida i VMProtect. Imajte na umu da ovi paketi ipak imaju obilje nedostataka. Oni će ponekad transformirati vaš kôd u nešto što neće biti ekvivalent izvorniku što može dovesti do nestabilnosti. Također značajno usporavaju zamućeni kod. Faktor od 10000 puta sporiji nije rijetkost. Tu je i problem pokretanja više lažnih pozitivnih rezultata pomoću antivirusnog softvera. Savjetovao bih vam da svoj softver potpišete uglednim tijelom za izdavanje certifikata.

Odvajanje funkcionalnih blokova

Podjela koda na funkcije je još jedna stvar koja olakšava obrnuto inženjerstvo programa. To se posebno odnosi na skrivanje funkcija jer stvara granice oko kojih inverzni inženjer može rasuđivati ​​o vašem softveru. Na ovaj način inverzni inženjer može riješiti vaš program na način podijeli i osvoji. U idealnom slučaju želite da vaš softver bude u jednom učinkovitom bloku s zamućenjem koji se jednoliko primjenjuje na cijeli blok kao jedan. Dakle, smanjite broj blokova, vrlo obilno koristite inlining i umotajte ih u dobar algoritam zamućenja. Prevoditelj može lako izvršiti neke teške optimizacije i redoslijed slaganja što će otežati blok za povratno projektiranje.

Runtime

Kada sakrijete podatke, važno je da su informacije dobro skrivene i tijekom izvođenja. Nadležni inženjer obrnutog sustava ispitati će stanje vašeg programa dok je pokrenut. Dakle, upotreba statičkih varijabli koje se dešifriraju pri učitavanju ili pak pakiranje koje se potpuno raspakira pri utovaru dovesti će do brzog pronalaska. Pazite što rasporedite na hrpu. Sve operacije hrpe odvijaju se putem API poziva i mogu se lako prijaviti u datoteku i obrazložiti. Operacije slaganja obično je teže pratiti samo zbog njihove učestalosti. Dinamička analiza jednako je važna kao i statička. Morate biti svjesni kakvo je stanje vašeg programa u svakom trenutku i koje se informacije nalaze.

Protiv otklanjanja pogrešaka

Zaštita od otklanjanja pogrešaka ne vrijedi. Ne trošite vrijeme na to. Provedite vrijeme osiguravajući da su vaše tajne dobro skrivene, neovisno o tome miruje li vaš softver ili ne.

Pakiranje i šifriranje segmenta koda

Šifriranje i pakiranje grupirat ću u istu kategoriju. Oboje imaju istu svrhu i obojica imaju iste probleme. Da bi izvršio kod, CPU mora vidjeti običan tekst. Dakle, morate dati ključ u binarnom obliku. Jedini daljinski učinkovit način šifriranja i pakiranja segmenata koda je ako ih šifrirate i dešifrirate na funkcionalnim granicama i samo ako se dešifriranje dogodi nakon ulaska u funkciju, a zatim se ponovno šifriranje dogodi kada napustite funkciju. Ovo će pružiti malu prepreku odbacivanju vašeg binarnog programa dok je pokrenut, ali mora biti praćeno snažnom zamagljenošću.

Napokon

Proučite svoj softver u nečemu poput besplatne verzije IDA-e. Vaš je cilj osigurati da inženjeru unatrag postane gotovo nemoguće pronaći stabilnu mentalnu podlogu. Što manje informacija curi i što se više mijenja okruženje, to će biti teže proučavati. Ako niste iskusni inženjer obrnutog dizajniranja, gotovo je nemoguće osmisliti nešto što je teško inverzirati.

Ako dizajnirate sustav zaštite od kopiranja, pripremite se za njegov mentalni slom. Provjerite imate li plan kako ćete se nositi s prekidom i kako osigurati da sljedeća verzija vašeg softvera doda dovoljno vrijednosti za pokretanje nadogradnji. Izgradite svoj sustav na čvrstom terenu koji se ne može slomiti, ne pribjegavajte generiranju vlastitih licencnih ključeva pomoću nekog prilagođenog algoritma skrivenog na gore opisani način. Sustav mora biti izgrađen na zdravim kriptografskim temeljima radi nezaboravnosti poruka.

"velikodušno koristite inlining i umotajte ih u dobar algoritam zamućenja" <- samo dodajte Boost. Boost + inlining + LTCG = pakao na kotačima. Deseci kopija istih funkcija s različitim registrima koristili su se za prosljeđivanje argumenata i različito ugrađenih podfunkcija, dvadeset vrsta pametnih pokazivača, argh!
Haha, da, definitivno možete odabrati složeni kod s jako predloškom kako biste dobili besplatnu zamagljenost. Nije li postojao članak na / r / re koji prikazuje upotrebu predložaka samo kako bi se stvorio čisti C ++ okvir zamućenja s neprozirnim predikatima i pomoću metaprogramiranja predloška za generiranje slučajnih brojeva pomoću linearnog kongruencijskog generatora? Čini se da se barem jednog sjećam.
"Dakle, upotreba statičkih varijabli koje se dešifriraju kada se učitaju [..] dovest će do brzog pronalaska". Koja je alternativa?
@Sosukodo Stavio bih varijable u lokalnu predmemoriju, vjerojatno na stogu, tamo ih dešifrirao, upotrijebio, a zatim memoriju poništio. Također bih osigurao da su algoritam, upotreba i ključ dešifriranja u potpunosti ugrađeni u zamagljivanje na temelju VM-a. Važno je da ne postoji jednostavan način pronalaska i dešifriranja svih varijabli nekim automatiziranim sredstvima. Ugrađivanje ključa u virtualizirani kod, a ne u podatke, to čini puno težim. To je naravno vrlo teško onemogućiti, ali trudimo se inženjera unatrag učiniti što zamornijim i dosadnijim.
Slažem se - samo pokušavamo izgraditi bolju bravu. Možete li dati linkove na članke koji raspravljaju o tim stvarima koje spominjete?


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...