Pitanje:
Mogu li stvoriti objektnu datoteku pomoću gcc-a koja se ne može reverzirati?
asheeshr
2013-03-20 14:43:12 UTC
view on stackexchange narkive permalink
Mogu li stvoriti objektnu datoteku pomoću gcc-a koja se ne može reverzirati?
ako ga stroj može pročitati ... može i čovjek. možete ljudima otežati ... ali na kraju, oni to mogu / i dalje će čitati.
http://stackoverflow.com/questions/4111808/c-c-compiler-generating-obfuscated-code , http://stackoverflow.com/questions/1025494/obfuscating-c-c-code
Tri odgovori:
#1
+25
Mike
2013-03-20 17:42:14 UTC
view on stackexchange narkive permalink

AFAIK to nije moguće. Međutim, možete imati na umu i druge stvari:

Korištenje zastavica za optimizaciju GCC-a pomoći će da kod čovjeku izgleda mnogo manje čitljiv. Kada kompajlirate s najvišom razinom optimizacije gcc -O3 , kompajler će premještati stvari tako da "protok" možda neće biti onakav kakav očekujete.

Također možete upotrijebiti zastavicu -static koja će prisiliti gcc da uzima male funkcije i čini ih ugrađenim. To će ih ugraditi u vaš kod umjesto da se prikazuju kao pozivi funkcija .. otežat će ih razlikovanje.

Jedna stvar koju morate imati na umu previše je važna da se riješite nepotrebnih simbola. Gcc nudi -fvisibility = hidden i -fvisibility-inlines-hidden za pomoć u tome. Također možete proslijediti zastavicu -s gcc-u kako biste uklonili simbole.

Mislim da je to otprilike sve što možete učiniti s gcc kako biste spriječili obrnuto inženjering. Osim toga, možete se koristiti i zamagljivanjem koda, ali i tu postoje problemi, osim ako ga sami ne implementirate. Ako koristite lako dostupnu metodu ili alat za sprečavanje obrnutog inženjeringa, vjerojatno već postoji alat za njegovo suočavanje.

Imajte na umu da će konačni izvršni program sadržavati i podatke poput toga s kojom verzijom gcc-a je kompiliran. I ovo se može ukloniti naredbom strip .

Ako imam izvršnu datoteku ( myprog ), mogu pokrenuti objdump na njoj kako bih provjerio neke informacije:

  mike @ mike-VirtualBox: ~ / C $ objdump --full-contents --section = .comment myprog | headmyprog: format datoteke elf64-x86-64Sadržaj odjeljka .komentar: 0000 4743433a 20285562 756e7475 2f4c696e GCC: (Ubuntu / Lin 0010 61726f20 342e362e 332d3175 62756e74 aro 4.6.3-1ubunt 0020 75352e.3342e u2053535e20 342 u. 

Ups, možete vidjeti koju sam verziju / kompajler koristio. Pa, to možemo popraviti:

  mike @ mike-VirtualBox: ~ / C $ strip -R .comment -R .note myprogmike @ mike-VirtualBox: ~ / C $ objdump --full-contents --section = .comment myprog | headobjdump: odjeljak '.comment' spomenut u opciji -j, ali nije pronađen ni u jednoj ulaznoj datotecimyprog: format datoteke elf64-x86-64  

Postoje i drugi dijelovi koje možete skinuti, kao što je .note.ABI-tag , ali gubite prenosivost

Ne bih preporučio uklanjanje `.note.ABI-tag` jer će spriječiti pokretanje izvršne datoteke na FreeBSD-u ili drugom OS-u s podrškom za emulaciju Linuxa.
@IgorSkochinsky - dobra napomena za prenosivost, u to vrijeme nisam razmišljao o tome, ali sada sam ažurirao. Hvala.
Uklanjanjem se ne uklanja GCC verzija iz datoteke obj ...
@Mellowcandle - Nisam rekao da jest. Rekao sam da ga je uklonilo iz izvršne datoteke.
BTW, nisam siguran zašto preporuka o imenima varijabli. Ako to učinite ispravno, u konačnom binarnom zapisu ne bi trebalo biti * imena *, osim možda javno izvezenih, a ona obično moraju imati ispravna, čitljiva imena.
Igor je u pravu. Kompajlator bi ta imena trebao uništiti kada se kreira binarni objekt. U tom slučaju nema razlike. U slučaju da šaljete binarne datoteke sa teškim simbolima za otklanjanje pogrešaka, imate puno većih problema od onoga što ste imenovali svojim varijablama.
Trebali biste ažurirati svoj odgovor u vezi s imenima varijabli jer to ne čini razliku u uklonjenom binarnom formatu.
#2
+21
perror
2013-03-20 14:56:04 UTC
view on stackexchange narkive permalink

Kratki odgovor : Ne.

Dugi odgovor : O (ne) mogućnosti zamagljivanja programa autora Boaz Barak, Oded Goldreich, Rusell Impagliazzo, Steven Rudich, Amit Sahai, Salil Vadhan i Ke Yang.

Srednji odgovor : Ako svoj program date korisniku koji kontrolira platformu tamo gdje će se vaš program izvoditi, ne postoji način da se spriječi njegovo obrnuto inženjerstvo. Jedino čemu se možete nadati jest prisiliti korisnika da pristupi analizi crnog okvira vašeg softvera (što znači da će korisnik moći promatrati izlaz vašeg programa samo na odabranom ulazu).

Ali, čak je i ovu analizu crnog okvira izuzetno teško provesti bez dodatnog hardverskog dijela (npr. Pametne kartice) jer bi korisnik trebao biti u mogućnosti napraviti međuprostorne snimke memorije tijekom izvršavanja vašeg programa.

Uz hardversku sigurnost: Google "U silikonu nema tajni"
Ne zaboravite da ćete u jednom trenutku i vi morati otkloniti pogreške. Što više zamutite i preuredite binarni zapis, to će biti teže analizirati ako nešto krene po zlu na terenu. Postaje posebno triksi ako neupravičena verzija savršeno radi, ali zamućena verzija BSOD-ovi zbog neviđenog vremena ili drugih interakcija koje uvodi sama zamućenost.
#3
+8
Igor Skochinsky
2013-03-20 15:13:15 UTC
view on stackexchange narkive permalink

Pa, možda je nemoguće RE datoteku obnoviti na točan izvorni izvorni kod (npr. ne postoji način za oporavak komentara ili makronaredbi pretprocesora), ali to vjerojatno nije ono što ste htjeli pitati.

Definitivno je uvijek moguće (iako ponekad teško) stvoriti ekvivalentni izvorni kod, koji se ponaša isto kao i kompilirani kôd. Uz neki dodatni rad možda bi čak bilo moguće proizvesti kôd koji se kompajlira u potpuno isti bajt kod (sve dok nije bilo dodatne naknadne obrade sastavljenog binarnog teksta). Ova prezentacija opisala je neke pristupe tome, ali ne mogu pronaći slajdove.



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