2012-02-08 9 views
9

Zrobiłem projekt Xcode gdzie zrobiłem kilka rzeczy bezpieczeństwa i poprosili mnie, aby zaciemniać nazwy metodyObjective-C zaciemniania metod działa w DEBUG ale wywala w wersji

jak tak

#define specialMethod a9328238 
+(void) specialMethod 
{ 
    // do security stuff 
} 

ja stworzyła bibliotekę .framework z projektu (projekt A) i umieściła go w innym projekcie (projekt B).

ale po uruchomieniu (projekt B) z konfiguracją Release build zawsze się tak kończy.

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[SecurityClass a9328238]: unrecognized selector sent to class 0x337cc4' 

powoduje awarię, gdy próbuje uzyskać dostęp do metody.

Ale gdy uruchamiam (projekt b) o konfiguracji Debug build biegnie gładka

(mam zachowywała wszystkie moje ustawienia konfiguracyjne zbudować jako domyślne)

+0

co zawiera Flagi kompilatora? – CarlJ

+1

Czy działa w wersji wydania bez zaciemnionych nazw metod? –

+4

Co oni mówią o bezpieczeństwie przez zapomnienie? – JeremyP

Odpowiedz

7

Gdzie umieścił #define dla zaciemnianie? Czy jest w pliku nagłówkowym (.h) lub w pliku implementacji (.m) z frameworka?

Aby zaciemnianie było skuteczne, musi zostać umieszczone w pliku dołączonym zarówno przez implementację, jak i wywołującego.

Można również sprawdzić, czy wstępne przetwarzanie jest prawidłowe, sprawdzając wstępnie przetworzony plik. Wybierz plik implementacji i przejdź do menu Product > Generate Output > Generate Preprocessed File (możesz wybrać konfigurację u dołu ekranu).

+0

Podgląd wstępnie przetworzonego wyniku można również uzyskać za pomocą edytora asystenta. – Danra

1

Wygląda na to, że plik wykonywalny, który importuje zaciemnioną strukturę, próbuje uzyskać dostęp do niezakodowanych metod.

Powinieneś sprawdzić symbole w ramach. Użyj biblioteki nm w bibliotece statycznej w strukturze, aby wyświetlić wyeksportowane symbole (oznaczone symbolem "t"). Upewnij się, że symbole są zaciemnione.

2

Moje przeczucie to także lokalizacja/widoczność #define.

Ale możesz rozważyć to z innej perspektywy. Można zmienić:

#define specialMethod a9328238 
+(void) specialMethod 
{ 
    // do security stuff 
} 

do:

@interface SecurityClass : NSObject 

// private obfuscated interface: 
+ (void)a9328238; 
// { 
// do security stuff in a9328238's definition 
// } 

@end 

// here is the public interface: 
static inline void SecurityClass_LogIn() { 
    [SecurityClass a9328238]; 
} 

upuszczenie #define całkowicie.

W użyciu:

SecurityClass_LogIn(); 
… 

Ponieważ jest to metoda klasy, można napisać zaciemniony funkcję zawinięte w czytelnej inline zamiast. Dobrze wykonane wykonanie C będzie znacznie trudniejsze do odróżnienia niż objęcie.

Bardziej kompletny przykład pomoże nam zawęzić możliwości.

Sprawdź również, czy nie ma żadnych ostrzeżeń - kompilator może ostrzegać, jeśli wywołałeś niezadeklarowany selektor.Możliwe, że metoda jest wywoływana, gdy #define nie jest widoczny w innych przypadkach.

1

Jeśli wszystko zawinąłeś w ramy, czy upewniłeś się, że odpowiednie nagłówki są wyeksponowane poza strukturą? Nagłówki wewnątrz frameworka nie są wyeksponowane w taki sam sposób jak zwykłe pliki. Przejdź do swojego projektu Project-> Build Phases, w prawym dolnym rogu powinieneś zobaczyć "Add Copy Headers". Spowoduje to dodanie nowej sekcji w fazach kompilacji. Wewnątrz tej sekcji kliknij "+" i nagłówki, które definiują twoje nazwy metod.

Powiązane problemy