Spørgsmål:
Er der et navn til denne form for "obfuscation" for maskinkoden fra C ++?
Y M
2017-07-06 12:21:33 UTC
view on stackexchange narkive permalink

Jeg prøvede at reverse engineer en android ndk (arm) ved hjælp af ida pro på en statisk analyse. Det ser imidlertid ud til, at der er mange ubrugelige spring til det samme sted og med tilfældige værdier indstillet til R1 for at sammenligne og hoppe igen. Ligesom følgende billede. Næsten hver funktion gør noget lignende - Initialisering først (ting som push-registre), så hopper det til kode et eller andet sted (som højre hjørne af billedet), indlæser tilfældige værdier til R1-register og sammenligner det med R0 og gør springene , men det springer altid tilbage til det øverste hjørne igen

Code graph

Her er en anden sag, det ser ud til, at loc_FFBA og de følgende grene fungerer som en stor switch, men hvad der ikke giver mening er, at næsten hver gren til sidst hopper tilbage til loc_FFBA igen. Der kan være en strøm rød-> grøn-> blå-> rød, men det giver ikke engang mening ... Du kan se springet i blåt er endda ubrugeligt, for hvis det tager spring til blått (R0> 0x6fe5e521), det vil helt sikkert tage springet til det røde (R0> 0x661cf941) ...

enter image description here

Mit spørgsmål er, er dette gjort med vilje forfatteren til at forhindre reverse engineering? I bekræftende fald, hvordan opnås det? For mig lyder det som om forfatteren har brug for en masse if-else og goto-klausul i sin C ++ - kode, men det vil også bremse udviklingen, fordi han måske forvirrer sig selv ... Og det ser ikke ud til .so ndk er pakket, da jeg ved hjælp af en debugger generelt fandt ud af, hvad det rent faktisk gør er bare at afkode en ressourcefil til en apk og indlæse den dynamisk, men al dekryptering sker ved at kalde JNI-funktioner for at lave en AES-dekryptering for at indlæse APK , snarere end at gøre det i C ++, så de rodede spring synes heller ikke at være noget relateret til dekrypteringen ...

Måske er der en slags kompilator, der vil generere skibene, hvis dette virkelig er en forsætlig tilslørelse?

Dette ser ud til at være [CFG fladning obfuscation] (https://reverseengineering.stackexchange.com/questions/2221/what-is-a-control-flow-flattening-obfuscation-technique)
To svar:
w s
2017-07-06 19:35:13 UTC
view on stackexchange narkive permalink

Desværre er det ikke nok kode til at sige nøjagtigt, hvad det er, men som @ 0xec sagde, det ligner meget fladning af kontrolflow. Normalt sker en sådan type kodetransformationer automatisk med obfuscators.

Der er nogle tilslørende compilere, og en af ​​dem gør CFG-fladning. Så vidt jeg ved, er denne kompilator ikke enestående, der er mange andre. Denne specifikke tilslørende kompilator er baseret på LLVM framework, og hvis du vil se, hvordan den kan implementeres - koden til CFG-udfladning er her. Du kan også finde et eksempel på, hvordan du deobfuskerer små programmer her.

Meget interessant, men det lyder for mig, at tilsløringen er mere modstandsdygtig end pakning i statisk analyse, fordi den originale maskinkode til pakning næsten altid kan gendannes indfødt, men for tilsløring er det bare hvad det er ...
Igor Skochinsky
2017-07-07 00:23:33 UTC
view on stackexchange narkive permalink

Her er et blogindlæg, der beskriver denne teknik lidt mere detaljeret samt nogle tip til, hvordan du fortryder den:

https://blog.quarkslab.com/deobfuscation-recovering- an-ollvm-protected-program.html

EDIT

En anden artikel fra 2017:

https://blog.rpis.ec/2017/12/dissection-llvm-obfuscator-p1.html



Denne spørgsmål og svar blev automatisk oversat fra det engelske sprog.Det originale indhold er tilgængeligt på stackexchange, som vi takker for den cc by-sa 3.0-licens, den distribueres under.
Loading...