2012-02-08 24 views
9

tôi đã thực hiện một dự án xcode nơi tôi đã làm một số công cụ an ninh và họ yêu cầu tôi xáo trộn những tên phương phápObjective-c obfuscation các phương pháp làm việc trong DEBUG nhưng tai nạn trong CHÍ

như vậy

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

i đã thực hiện một thư viện .framework từ dự án (dự án A) và đưa nó vào một dự án khác (dự án B).

nhưng khi tôi chạy (dự án B) với cấu hình Bản phát hành bản phát hành, nó luôn luôn bị treo như vậy.

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

để nó gặp sự cố khi cố gắng truy cập phương pháp.

Nhưng khi tôi chạy (dự án B) nó với một cấu hình Debug xây dựng nó chạy trơn tru

(i đã giữ tất cả các thiết lập xây dựng cấu hình của tôi như là mặc định)

+0

những gì có trong Cờ biên dịch của bạn? – CarlJ

+1

Tính năng này có hoạt động trong phiên bản phát hành không có tên phương thức bị làm mờ không? –

+4

Họ nói gì về an ninh bởi sự tối tăm? – JeremyP

Trả lời

7

ở đâu bạn đặt #define cho obfuscation? Có trong tệp tiêu đề (.h) hoặc trong tệp triển khai (.m) của khung không?

Để việc tối ưu hóa có hiệu quả, nó phải được đặt trong một tệp vừa được thực hiện vừa là người gọi.

Bạn cũng có thể kiểm tra xem quá trình xử lý trước có ổn không bằng cách kiểm tra tệp được xử lý trước. Chọn tệp triển khai và chuyển đến menu Product > Generate Output > Generate Preprocessed File (bạn có thể chọn cấu hình ở cuối màn hình).

+0

Xem kết quả được xử lý trước cũng có thể thông qua trình chỉnh sửa trợ lý. – Danra

1

Dường như tệp thực thi nhập khẩu khung làm việc cố gắng truy cập các phương pháp không bị làm phiền.

Bạn nên kiểm tra các biểu tượng trong khung. Sử dụng nm trên thư viện tĩnh trong khung để xem các ký hiệu đã xuất (được đánh dấu bằng 't'). Hãy chắc chắn rằng các biểu tượng được obfuscated.

2

Linh cảm của tôi cũng là địa điểm #define cũng như khả năng hiển thị.

Nhưng bạn có thể muốn cân nhắc điều này từ góc độ khác. Bạn có thể thay đổi:

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

tới:

@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]; 
} 

thả #define hoàn toàn.

Trong sử dụng:

SecurityClass_LogIn(); 
… 

Vì đây là một phương pháp học, bạn có thể viết một chức năng obfuscated bọc trong một inline có thể đọc được con người thay thế. Việc triển khai C được thực hiện tốt sẽ khó hơn nhiều so với objc.

Ví dụ hoàn chỉnh hơn sẽ giúp chúng tôi thu hẹp các khả năng.

Đồng thời xác minh không có cảnh báo - trình biên dịch có thể cảnh báo bạn nếu bạn đã gọi là công cụ chọn không khai báo.Có thể phương thức này được gọi là nơi các #define không hiển thị trong các trường hợp khác.

1

Nếu bạn đã đưa mọi thứ vào một khuôn khổ, bạn có đảm bảo rằng các tiêu đề thích hợp được hiển thị bên ngoài khuôn khổ không? Tiêu đề bên trong khung không được hiển thị giống như các tệp bình thường. Chuyển đến dự án Project-> Giai đoạn xây dựng của bạn, ở góc dưới cùng bên phải, bạn sẽ thấy "Thêm tiêu đề sao chép". Điều này sẽ thêm một phần mới trong các giai đoạn xây dựng của bạn. Bên trong phần này, hãy nhấp vào dấu "+" và tiêu đề xác định tên phương thức của bạn.

Các vấn đề liên quan