2014-07-15 20 views
7

App chúng tôi đang làm việc trên đã bị từ chối vì các thiết bị trong quá trình xem xét đã được phát hiện như jailbroken ^^App với phát hiện Jailbreak từ chối của Apple

Để phát hiện một thiết bị jailbroken, một số thử nghiệm đã được thực hiện:

NSString* bundlePath = [[NSBundle mainBundle] bundlePath]; 

// scan for itunes metadata 
BOOL isDirectory = NO; 
NSString* directoryPath = [bundlePath stringByAppendingPathComponent:@"SC_Info/"]; 
BOOL directoryIsAvailable = [[NSFileManager defaultManager] fileExistsAtPath:directoryPath isDirectory:&isDirectory]; 
BOOL contentSeemsValid = ([[[NSFileManager defaultManager] contentsOfDirectoryAtPath:directoryPath error:NULL] count] == 2); 
if (directoryIsAvailable && contentSeemsValid) { 
    return YES; 
} 
contentSeemsValid = [[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithFormat:@"%@/iTunesMetadata.​plist", bundlePath]]; 
if (contentSeemsValid) { 
    return YES; 
} 

// scan for cydia app 
NSURL* testURL = [NSURL URLWithString:@"cydia://"]; 
if ([[UIApplication sharedApplication] canOpenURL:testURL]) { 
    return YES; 
} 

// scan for paths available 
NSArray* paths = @[@"/Applications/Cydia.app", @"/Applications/RockApp.app", @"/Applications/Icy.app", @"/usr/sbin/sshd", @"/usr/bin/sshd", @"/private/var/lib/apt", @"/private/var/lib/cydia", @"/private/var/stash", @"/usr/libexec/sftp-server"]; 
for (NSString* string in paths) { 
    if ([[NSFileManager defaultManager] fileExistsAtPath:string]) { 
     return YES; 
    } 
} 

// scan for forking 
int forkValue = fork(); 
if (forkValue >= 0) { 
    return YES; 
} 

// try to write in private space 
NSString* testString = @"test"; 
NSError* error = nil; 
[testString writeToFile:@"/private/test.txt" atomically:YES encoding:NSUTF8StringEncoding error:&error]; 
if (error == nil) { 
    return YES; 
} 

// seems not jailbroken 
return NO; 

Một (hoặc nhiều) Thử nghiệm này trả về CÓ trên Thiết bị Apple sử dụng để Xem xét, nhưng không có Thiết bị nào trong số các Thiết bị của chúng tôi. Mà nó có thể là ai? Có ai biết thêm chi tiết về các thiết bị mà Apple sử dụng cho Đánh giá không? Bất kỳ gợi ý hoặc các Guesses khác? (Bối cảnh từ App là HealthCare trong bệnh viện, vì vậy chúng tôi cần phải chắc chắn rằng các dữ liệu bệnh nhân đã tiết kiệm)

Best Regards,
Zeek

+1

Những xét nghiệm dường như không phải là rất vững chắc và rằng 'fork()' test trông rất nguy hiểm ... Không phải là có bất cứ điều gì để làm với câu hỏi của bạn ... – trojanfoe

+3

Tại sao bạn không chỉ kháng cáo từ chối, chỉ cần nói rằng bạn phát hiện jailbreak để đảm bảo an toàn dữ liệu. – rckoenes

+0

@rckoenes: Dữ liệu bệnh nhân rất nhạy cảm, vì vậy chúng tôi xóa tất cả dữ liệu và thoát khỏi ứng dụng. – Zeek

Trả lời

4

Từ https://www.theiphonewiki.com/wiki/Bypassing_Jailbreak_Detection

Trong khi có vô số các ứng dụng có thể thực hiện kiểm tra các thiết bị đã bẻ khóa, chúng thường đun sôi xuống các mục sau:

Tính tồn tại của các thư mục - Kiểm tra hệ thống tệp của bạn cho các đường dẫn như /Applications/Cydia.app//private/var/stash, trong số ít người khác. Thông thường, chúng được kiểm tra bằng cách sử dụng phương pháp -(BOOL)fileExistsAtPath:(NSString*)path trong NSFileManager, nhưng các ứng dụng lén lút hơn như sử dụng các chức năng C cấp thấp hơn như fopen(), stat() hoặc access().

mục điều khoản - Kiểm tra các điều khoản tập tin Unix các tập tin và thư mục cụ thể sử dụng NSFileManager phương pháp cũng như chức năng C như statfs(). Các thư mục xa hơn có quyền truy cập ghi trên thiết bị được bẻ khóa hơn là trên một thiết bị vẫn còn trong tù.

Process forking - sandboxd không phủ nhận các ứng dụng App Store khả năng sử dụng fork(), popen(), hay bất kỳ chức năng C khác để tạo ra các tiến trình con trên thiết bị không jailbreak. sandboxd từ chối rõ ràng quá trình forking trên các thiết bị trong tù. nếu bạn kiểm tra pid trả về trên fork(), ứng dụng của bạn có thể biết liệu nó đã được chia thành công hay chưa, tại thời điểm đó, ứng dụng có thể xác định trạng thái bẻ khóa của thiết bị.

kết nối SSH loopback * - Do phần lớn các thiết bị jailbroken có OpenSSH cài đặt, một số ứng dụng sẽ cố gắng để kết nối với 127.0.0.1 trên cổng 22. Nếu kết nối thành công, nó có nghĩa là OpenSSH được cài đặt và chạy trên thiết bị, do đó nó đã được bẻ khóa.

hệ thống() - Gọi hàm system() với tham số NULL trên thiết bị trong tù sẽ trả về 0; làm tương tự trên một thiết bị bẻ khóa sẽ trả về 1. Đây là vì chức năng sẽ kiểm tra xem có tồn tại /bin/sh hay không và đây chỉ là trường hợp trên các thiết bị đã bẻ khóa. [1]

chức năng dyld - Cho đến nay khó khăn nhất để di chuyển. Các chức năng gọi như _dyld_image_count()_dyld_get_image_name() để xem các dylib nào hiện đang được tải. Rất khó vá, vì bản thân các bản vá là một phần của dylibs.

* Chỉ có một số rất nhỏ các ứng dụng thực hiện điều này (vì nó không phải là gần như hiệu quả như những người khác)

Những phương pháp này có vẻ như họ sẽ ít có khả năng bị từ chối bởi táo và rất đơn giản để sử dụng.

Đoạn văn trên đã được chỉnh sửa cho ngắn gọn

+0

Tôi biết điều này là cũ, nhưng làm thế nào là nó tất cả các chức năng chống tù là các hàm boolean đơn giản mà có thể dễ dàng được nối và neutered? Tôi thích thực hiện chức năng tương tự, nhưng tôi dường như không thể tìm thấy bất cứ điều gì như bất cứ khi nào tôi tìm kiếm, tôi tìm thấy những gì tôi đang cố gắng ngăn chặn. –

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