كيفية تحديد وقت التشغيل إذا كان التطبيق للتطوير أو متجر التطبيقات أو التوزيع المخصص؟

StackOverflow https://stackoverflow.com/questions/3426467

سؤال

هل هناك طريقة لتحديد برمجيًا إذا تم بناء التطبيق الذي يتم تشغيله حاليًا وتوقيعه للتطوير فقط أو ما إذا كان قد تم بناؤه للتوزيع؟ وهل يمكن للمرء أن يحدد ما إذا كان تم إنشاء متجر للتطبيق أو توزيع مخصص؟

هل من المحتمل أن يصل إلى توقيع الكود والحصول على المعلومات من هناك؟ أم أن هناك ملفات معينة موجودة في أحد المتغيرات غير الموجودة في الآخر؟ هل جزء من معلومات الحزمة؟ أم يمكن اشتقاقها من الملف القابل للتنفيذ؟

أي تلميحات موضع تقدير.


يبدو أن ملف absedded.mobileprovision هو بتنسيق ASN.1.

هل كانت مفيدة؟

المحلول

أسهل طريقة للتحقق هي النظر إلى embedded.mobileprovision ([[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]):

  • من الألم الذي يجب تحليله لأنها موقعة (PKCS#7 بيانات موقعة ، وفقًا لـ openssl asn1parse -inform der) ، لكن الاختراق السيئ هو مجرد البحث عنه <plist و </plist>.
  • يحتوي التنمية على UDIDs و <key>get-task-allow</key><true/>
  • يحتوي التوزيع المخصص AD على UDIDs (و Get-tains-allow = false)
  • لا يحتوي توزيع متجر التطبيقات على UDIDs.

الشيء الآخر الذي يمكنك التحقق منه هو الاستحقاقات المضمنة في القابل للتنفيذ (otool -l يسردها LC_CODE_SIGNATURE). إن تحليل هذا الأمر أكثر مملة (تحتاج إلى تحليل أوامر Mach-O وتحميل ، وبالنسبة للثنائيات "العالمية" التي أصبحت الآن الافتراضي ، ستحتاج إلى التحقق من البنية المحملة حاليًا أو جميع البنية).

  • بناء التنمية تحتوي <key>get-task-allow</key><true/>
  • تحتوي بنية AD HOC و App Store <key>get-task-allow</key><false/>

لا أعتقد أن الاستحقاقات تميز بين بنيات AD Hoc و App Store.

بصرف النظر عن تلك والشهادة التي تم توقيعها معها ، لا يوجد فرق بين تطبيقات التطوير/المخصص/متجر التطبيقات (هناك بعض الأشياء الأخرى في ملفات التعريف/التوفير ، ولكن لا شيء أكثر موثوقية يمكنني التفكير فيه).

اعتبارات أمنية

أيا من هؤلاء يصعب التحايل عليه. للطريقة الأولى ، يمكن للتطبيق فقط "swizzle" -[NSBundle pathForResource:ofType:]. الطريقة الثانية أكثر صعوبة بعض الشيء اعتمادًا على واجهة برمجة التطبيقات التي تستخدمها لقراءة الملف.

نصائح أخرى

openssl asn1parse -inform DEM -in *Mobile_Provision_File* -strparse 54 هي أسهل طريقة للوصول إلى البيانات التي وجدتها.

تعديل:

security cms -D -i *Mobile_Provision_File* هو في الواقع أسهل. يترك الأمر openssl بعض القمامة في الإخراج.

لقد استخرجت ملفًا مضمنًا. http://www.geocities.co.jp/siliconvalley-sanjose/3377/asn1js.html) ، وهذا ما حصلت عليه:

SEQUENCE {
   OBJECTIDENTIFIER 1.2.840.113549.1.7.2 (signedData)
   [0] {
      SEQUENCE {
         INTEGER 1
         SET {
            SEQUENCE {
               OBJECTIDENTIFIER 1.3.14.3.2.26
               NULL 
            }
         }
         SEQUENCE {
            OBJECTIDENTIFIER 1.2.840.113549.1.7.1 (data)
            [0] {
               OCTETSTRING 3c3f786d6c20766 ... 6c6973743e0a
            }
         }
         [0] {
            SEQUENCE {
               SEQUENCE {
                  [0] {
                     INTEGER 2
                  }
 ... [much more]

مع هذا وبعض المعرفة ASN.1 ، تفسيرك منطقي تمامًا.

الجزء المثير للاهتمام هو سلسلة Octet التي تبدأ 3C3F786D6C. هذا هو جزء XML في تنسيق قائمة برامج Apple الذي يحتوي على جميع الإجابات حول نوع التوزيع (المطور ، Ad-Hoc ، App Store).

#if (DEBUG)
#define SERVER @"aaaa.com/dev"
#else
#define SERVER @"aaa.com/pro"
#endif

هذه هي الطريقة التي أميز بها تصحيح الأخطاء ووضع الإصدار ،

لكن ليس لدي أي فكرة عن adhoc أو الإنتاج ما لم استخدم اسم ملف تعريف التوفير

أقوم بإنشاء جوهر لاكتشاف بناء مخصص
نرى : https://gist.github.com/ishawnwang/d904934efded271d83b36288562df410

adhoc اكتشف مع ظروف 2 التالية:

1.embedded.mobileprovision يحتوي على حقل ProvisionedDevices (التصحيح والبناء المخصص يحتوي على هذا الحقل ، لا ، لا)

2. ليس تصحيح تصحيح ، يمكننا استخدامه #ifdef DEBUG لتقرر ذلك

NS_INLINE BOOL isAdHoc(){
    BOOL isAdHoc = NO;
    BOOL isDebug;

#ifdef DEBUG
    isDebug=YES;
#else
    isDebug=NO;
#endif

    NSData *data=[NSData dataWithContentsOfURL:[[NSBundle mainBundle]URLForResource:@"embedded" withExtension:@"mobileprovision"]];
    NSString *str=[[NSString alloc]initWithData:data encoding:NSISOLatin1StringEncoding];
    NSRange rangeOfDevicesUDIDs = [str rangeOfString:@"ProvisionedDevices"];

    isAdHoc = rangeOfDevicesUDIDs.location!=NSNotFound && !isDebug;
    return isAdHoc;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top