2010-11-12 26 views
21

जेलब्रोकन आईफ़ोन मेरे तंत्रिका पर आते हैं क्योंकि यह मोबाइल सब्सट्रेट का उपयोग करके आईओएस पर कुछ मौलिक एपीआई को टेंट करता है।रनटाइम पर आईफोन पर यूडीआईडी ​​स्पूफिंग का पता लगाएं

http://www.iphonedevwiki.net/index.php/MobileSubstrate

मैं कई क्षुधा एक युक्ति है और/या एक उपयोगकर्ता को प्रमाणित करने के बाद से यह अर्द्ध स्वचालित और आसान है एक मतलब के रूप में UDID का उपयोग विश्वास करते हैं, लेकिन आप इस समस्या से अवगत होना चाहिए: UIDevice रूप tamper- नहीं है यह सबूत होना चाहिए। यूडीआईडी ​​फेकर नामक एक ऐप है, जो आसानी से रनटाइम पर किसी और के यूडीआईडी ​​को धोखा देने में सक्षम बनाता है।

http://www.iphone-network.net/how-to-fake-udid-on-ios-4/

यहाँ यह के स्रोत कोड है:

// 
// UDIDFaker.m 
// UDIDFaker 
// 

#include "substrate.h" 

#define ALog(...) NSLog(@"*** udidfaker: %@", [NSString stringWithFormat:__VA_ARGS__]); 
#define kConfigPath @"/var/mobile/Library/Preferences/com.Reilly.UDIDFaker.plist" 

@protocol Hook 
- (NSString *)orig_uniqueIdentifier; 
@end 

NSString *fakeUDID = nil; 

static NSString *$UIDevice$uniqueIdentifier(UIDevice<Hook> *self, SEL sel) { 

    if(fakeUDID != nil) { 
       ALog(@"fakeUDID %@", fakeUDID); 
     /* if it's a set value, make sure it's sane, and return it; else return the default one */ 
       return ([fakeUDID length] == 40) ? fakeUDID : [self orig_uniqueIdentifier]; 

    } 
    /* ... if it doesn't then return the original UDID */ 
    else { 
     return [self orig_uniqueIdentifier]; 
    } 
} 

__attribute__((constructor)) static void udidfakerInitialize() { 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
     NSString *appsBundleIdentifier = [[NSBundle mainBundle] bundleIdentifier]; 
     ALog(@"Loading UDID Faker into %@", appsBundleIdentifier); 


     NSDictionary *config = [NSDictionary dictionaryWithContentsOfFile: kConfigPath]; 
     fakeUDID = [config objectForKey: appsBundleIdentifier]; 
     [fakeUDID retain]; 

     if(fakeUDID != nil) { 

       ALog(@"Hooking UDID Faker into %@", appsBundleIdentifier); 
       MSHookMessage(objc_getClass("UIDevice"), @selector(uniqueIdentifier), (IMP)&$UIDevice$uniqueIdentifier, "orig_"); 
     } 

    [pool release]; 
} 

आप देख सकते हैं, UIDevice कक्षा में uniqueidentifier विधि अब fakeUDID किसी भी क्षुधा पर देता है।

ऐसा लगता है कि स्काइप और कुछ अन्य ऐप्स इस तरह के रंग का पता लगाते हैं, लेकिन मुझे नहीं पता कि यह कैसे करना है।

मैं जो करना चाहता था वह है: जब लॉन्च, अलर्ट और बाहर निकलने पर UIDevice का पता लगाया जाता है (0)।

विचार?

+2

दोस्त .. आप इन विचारों को अन्य लोगों को दे रहे हैं .. मेरा मतलब है कि आप सैंपल कोड और सटीक एपीआई/स्पूफिंग के लिए लिंक के बिना केवल प्रश्न पोस्ट कर सकते थे। अब सभी SO उपयोगकर्ता जानते हैं कि UDID को कैसे धोखा देना है .. – lukya

+2

ऐसे इरादे वाले लोगों के पास उपर्युक्त कोड को समझने की क्षमता नहीं है, या क्षमता है और इसके बारे में पहले ही पता है। –

+0

चलो, प्रत्येक SO उपयोगकर्ता को Google का उपयोग करने का तरीका पता होना चाहिए। सिर्फ इसलिए कि लिंक यहां नहीं हैं, इसका मतलब यह नहीं है कि इसमें रुचि रखने वाले किसी को यह नहीं मिलेगा। – JustSid

उत्तर

35

यह जांचने का वास्तव में सुरक्षित तरीका नहीं है कि यूडीआईडी ​​वास्तविक है या नहीं।

+-----------+ 
| your code | 
+-----------+ 
     | 
+----------+  +-------------+  +-----------+ 
| UIDevice |<----->| liblockdown |<=====>| lockdownd | (trusted data) 
+----------+  +-------------+  +-----------+ 
     untrusted user     trusted user 

जब डिवाइस जेलब्रेक है, सभी 4 घटकों बदला जा सकता है: UDID liblockdown है, जो एक सुरक्षित चैनल के माध्यम से lockdownd को UDID प्राप्त करने के लिए संचार के माध्यम से मिल गया है। UDID ठग की उपस्थिति का पता लगाने के लिए


एक विधि है, तो कुछ पहचान (फाइलें, कार्यों आदि) अद्वितीय करने के लिए यह मौजूद है की जाँच करने के लिए है। यह एक बहुत ही विशिष्ट और नाजुक काउंटर-हमला है, जब पता लगाने की विधि का खुलासा किया जाता है, तो स्पूफ़र आसानी से पहचान को अपने अस्तित्व को छिपाने के लिए बदल सकता है।

उदाहरण के लिए, यूडीआईडी ​​फ़कर एक प्लिस्ट फ़ाइल /var/mobile/Library/Preferences/com.Reilly.UDIDFaker.plist पर निर्भर करता है। इसलिए, आप जांच कर सकता है अगर यह फ़ाइल मौजूद है:

UIDevice* device = [UIDevice currentDevice]; 
if ([device respondsToSelector:@selector(orig_uniqueIdentifier)]) 
    return [device orig_uniqueIdentifier]; 
else 
    return device.uniqueIdentifier; 

बेशक spoofer बस इन बातों का नाम बदलने सकता है:

NSString* fakerPrefPath = @"/var/mobile/Library/Preferences/com.Reilly.UDIDFaker.plist"; 
if ([[NSFileManager defaultManager] fileExistsAtPath:fakerPrefPath])) { 
    // UDID faker exists, tell user the uninstall etc. 
} 

यह भी विधि -[UIDevice orig_uniqueIdentifier] जो ठग बायपास करने के लिए इस्तेमाल किया जा सकता परिभाषित करता है।


मोबाइल सब्सट्रेट कैसे काम करता है में एक और विश्वसनीय तरीका है। इंजेक्शन कोड को डाइलिब/बंडल में स्थित होना चाहिए, जो यूआईकिट से मेमोरी क्षेत्र अलग में लोड किया गया है। इसलिए, आपको केवल यह जांचने की आवश्यकता है कि -uniqueIdentifier विधि का फ़ंक्शन पॉइंटर स्वीकार्य सीमा के भीतर है या नहीं। (अर्थात यह आसानी से बचा जा सकता है)

// get range of code defined in UIKit 
uint32_t count = _dyld_image_count(); 
void* uikit_loc = 0; 
for (uint32_t i = 0; i < count; ++ i) { 
    if (!strcmp(_dyld_get_image_name(i), "/System/Library/Frameworks/UIKit.framework/UIKit")) { 
    uikit_loc = _dyld_get_image_header(i); 
    break; 
    } 
} 

.... 

IMP funcptr = [UIDevice instanceMethodForSelector:@selector(uniqueIdentifier)]; 
if (funcptr < uikit_loc) { 
    // tainted function 
} 

वैसे भी UDID ठग एक बहुत ही उच्च स्तर हैक है। यह एक नकली आईडी की आपूर्ति करके UIDevice और liblockdown के बीच के लिंक को हाइजैक करता है।

+-----------+ 
| your code | 
+-----------+ 
     | 
+----------+  +-------------+  +-----------+ 
| UIDevice |<--. | liblockdown |<=====>| lockdownd | (trusted data) 
+----------+ | +-------------+  +-----------+ 
       | +------------+ 
       ‘-->| UDID Faker | 
        +------------+ 

इस प्रकार आप यूडीआईडी ​​को कम से कम liblockdown स्तर पर पूछने वाले कोड को स्थानांतरित कर सकते हैं। इसका उपयोग जेलब्रोकन प्लेटफ़ॉर्म के लिए ऐप्स के लिए किया जा सकता है, लेकिन ऐपस्टोर ऐप्स के लिए यह संभव नहीं है क्योंकि liblockdown एक निजी API है। इसके अलावा, स्पूफ़र liblockdown को हाइजैक कर सकता है (यह बहुत आसान है, मुझे आशा है कि कोई भी ऐसा नहीं करेगा), या लॉकडॉन्ड को भी प्रतिस्थापित करें।

    +-----------+ 
        | your code | 
        +-----------+ 
         | 
+----------+  +-------------+  +-----------+ 
| UIDevice |<--. | liblockdown |<=====>| lockdownd | (trusted data) 
+----------+ | +-------------+  +-----------+ 
       | +------------+ 
       ‘-->| UDID Faker | 
        +------------+ 

(मैं यहाँ liblockdown उपयोग करने के लिए कैसे दिखाने के लिए नहीं जा रहा हूँ। आप साइट आप जुड़े हैं से पर्याप्त जानकारी को खोजने के लिए सक्षम होना चाहिए।)

+0

वाह, आपके विस्तृत उत्तर के लिए धन्यवाद, केनीटीएम! उत्तम! – kenn

+0

आपके विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद! मैं आंशिक रूप से आपके कोड का उपयोग कर रहा हूं लेकिन मुझे कुछ चेतावनियां मिल रही हैं, शायद आप मेरी मदद कर सकते हैं !? मैंने 'mach-o/dyld.h' शामिल किया है। लाइन 'uikit_loc = _dyld_get_image_header (i);' चेतावनी उठाती है _Semantic समस्या: 'कॉन्स्ट स्ट्रक्चर mach_header *' से 'शून्य *' को असाइन करना qualifiers_ और 'if (funcptr Stefan

-3

कुंजी एक जेबी डिवाइस पता लगा रहा है और उस पर नहीं चल रहा है।

+2

यह थोड़ा कठोर है, फिर आप सभी जेबी उपयोगकर्ताओं को दंडित कर रहे हैं। सभी जेबी उपयोगकर्ता समुद्री डाकू नहीं हैं, केवल सियाडिया स्टोर पर भुगतान किए गए ऐप्स और ट्वीक्स की सफलता को देखें। – newenglander

संबंधित मुद्दे