أثناء اختبار التطبيق، اضطررنا إلى «التحايل» على فحص الموقع الجغرافي.

في حين يوفر نظام أندرويد العديد من الطرق السهلة لتزوير الموقع الجغرافي — بما في ذلك تثبيت تطبيق واحد فقط (لتزييف الموقع الجغرافي) — إلا أن هناك طرقًا مماثلة للكشف عن هذا التزوير. في نظام أندرويد، لا يعتبر المطورون الموقع الجغرافي بحد ذاته عامل تحقق موثوقًا به للغاية.

أما في نظام iOS، فيُعتبر أكثر موثوقية؛ فعلى الأقل، لن يقوم المستخدم العادي لنظام iOS بإنشاء حساب مطور وتثبيت برنامج Xcode الذي يبلغ حجمه 9 جيجابايت. ولكن ماذا لو لم يكن الأمر صعبًا كما يبدو — بل كان في الواقع أسهل مما هو عليه في نظام أندرويد؟

المقارنة

لنبدأ بإلقاء نظرة على الاختلافات بين طرق الأمان التي يمكن استخدامها في نظام iOS مقارنةً بنظام Android:

الاسمAndroidiOSالوصف
التحقق من SSID/BSSID الحالي+±في نظام Android، يعتمد الوصول على الأذونات وقيود الموقع. أما في نظام iOS، فلا يمكنك استرداد شبكة Wi-Fi الحالية إلا إذا استوفيت متطلبات Apple عبر NEHotspotNetwork.fetchCurrent، ولكن لا يمكنك الحصول على قائمة بالشبكات القريبة.
مسح SSIDs لشبكات Wi-Fi القريبة+-سمح نظام Android تاريخيًا بمسح شبكات Wi-Fi مع وجود قيود على الأذونات، وتقييد السرعة، والموقع. في نظام iOS، لا يمكن للتطبيق القياسي استرداد قائمة بأسماء SSID القريبة؛ وتذكر Apple صراحةً أنه لا توجد واجهة برمجة تطبيقات (API) عامة لقائمة شبكات Wi-Fi القريبة.
أبراج شبكات الهاتف الخلوي+-يمكن لنظام Android استرداد معلومات شبكة الهاتف الخلوي عبر TelephonyManager.getAllCellInfo()، بما في ذلك الخلايا المسجلة/التي تقدم الخدمة والخلايا المجاورة، مع ACCESS_FINE_LOCATION ودعم شبكات الاتصالات الهاتفية. قد تكون النتائج مخزنة مؤقتًا، أو محدودة السرعة، أو غير متوفرة، أو غير متوفرة جزئيًا اعتمادًا على الجهاز، وشركة الاتصالات، وإصدار نظام التشغيل، والأذونات. لا يوفر نظام iOS واجهة برمجة تطبيقات (API) عامة آمنة في متجر التطبيقات (App Store) لاسترداد معرّفات أبراج الخلايا العاملة/المجاورة، أو LAC/TAC، أو قوة الإشارة، أو قائمة الخلايا القريبة. يكشف CoreTelephony عن معلومات محدودة عن شركة الاتصالات/مزود الخدمة، وليس عن بيانات المسح اللاسلكي على مستوى الأبراج.

بناءً على ذلك، يمكن فعليًّا لكل تطبيق Android أن يطلب بالإضافة إلى ذلك الشبكات القريبة ويستخدمها لتحديد الموقع الجغرافي داخليًّا عبر خدمة تابعة لجهة خارجية. يمكن تزوير هذه البيانات وهي ليست مؤشرًا قويًّا.

على نظام iOS، يختلف الوضع قليلاً، كما تختلف متطلبات التطبيقات قليلاً أيضًا. كما يحظر النظام صراحةً استخدام هذه البيانات لتحديد الموقع الجغرافي. على أي حال، يمكن تزوير هذه البيانات باستخدام جهاز يعمل كنقطة وصول إلى الشبكة.

لا توجد طريقة مباشرة في أي من النظامين لاكتشاف وضع المطور، ولكن توجد أدوات للكشف عن «الموقع الوهمي» (Mock Location).

Location.isMock() — على نظام Android.

CLLocation.sourceInformation?.isSimulatedBySoftware — على نظام iOS.

على نظام Android، سيتم تعيين العلامة location.isMock=true إذا لم يكن الجهاز مروتًا. ومع ذلك، بالاقتران مع ميزة deviceIntegrity، يمكن تجنب ذلك نظريًّا أو جعل تنفيذه أكثر صعوبة.

أما في نظام iOS، فالأمور مختلفة. CLLocation يمكن أن يتم إنشاء العلامة بواسطة التطبيق نفسه؛ أي إذا كنت تستخدم مجموعة أدوات تابعة لجهة خارجية بخلاف Xcode، فيمكنك إزالة isSimulatedBySoftware=true

وهذا ما سنستفيد منه. كما أننا لن نستخدم أي برامج مملوكة لشركات خاصة — بل أدوات مفتوحة المصدر فقط. لذا لن نستخدم Xcode أو iTools أو 3uTools.

الحل: pymobiledevice3

التثبيت

يجب أن يكون لديك إصدار Python 3.9 أو أعلى مثبتًا.

0. في المحطة الطرفية، قم بتشغيل: python3 -m pip install -U pymobiledevice3

1. قم بإلغاء قفل الجهاز

2. قم بتوصيله بجهاز الكمبيوتر الخاص بك عبر USB وقم بتفويض الوصول

3. انقر على «Trust» (الثقة) لهذا الكمبيوتر

4. قم بتمكين وضع المطور: pymobiledevice3 amfi enable-developer-mode

قد تحتاج إلى إعادة تشغيل الجهاز وتكرار الخطوات من 1 إلى 4 إذا لم يعمل الأمر في المرة الأولى.

5. تحقق من الإعدادات -> الأمان والخصوصية -> الأمان -> وضع المطور

6. دعونا نتحقق مما إذا كان الجهاز قد تم التعرف عليه: pymobiledevice3 usbmux list

حيث يجب أن تكون الاستجابة:

[
    {
        "BuildVersion": "23F84",
        "ConnectionType": "USB",
        "DeviceClass": "iPhone",
        "DeviceName": "******",
        "Identifier": "0000000-00000000000000",
        "ProductType": "iPhone17",
        "ProductVersion": "26.5.2",
        "UniqueDeviceID": "0000000-00000000000000"
    }
]

تم اكتشاف الجهاز.

7. لنقم باختيار صورة قرص مطور iPhone وتركيبها

pymobiledevice3 mounter auto-mount

بعد التثبيت بنجاح، يمكننا إرسال الأمر:

pymobiledevice3 developer dvt simulate-location set --userspace -- <LAT> <LONG>

الآن يمكنك فتح أي تطبيق، وسيعرض موقعك الجغرافي عند النقطة المحددة.

الخلاصة

لقد تجاوزنا الإجراءات الأمنية وحصلنا على إمكانية الوصول إلى ميزات لم يكن من المفترض أن تكون متاحة على هذا الجهاز. وقد كتبنا توصيات حول كيفية تحسين الأمان ومنع حدوث سيناريوهات معينة.

شكرًا على قراءتك، وأخيرًا، أود أن أضيف: لا تعتمد على بيئة المستخدم — فهي قابلة للتزوير دائمًا.