الموقع مغلق بواسطة Cloudflare، ويظهر Turnstile في كل طلبين، ويتغير التصميم كل أسبوعين. ومع ذلك، فإن نفس الخدمة لديها تطبيق موبايل يتصل بالخلفية مباشرة ويحصل على JSON جاهز - بدون تحديات، بدون تنسيق، مع مخطط حقول ثابت. وهذا هو "API المخفي": واجهة غير موثقة ولكنها تعمل بالكامل، والتي يستخدمها العميل الرسمي.
دعونا نفصل الخطوات حول كيفية العثور عليه باستخدام mitmproxy، وما يجب القيام به مع تثبيت الشهادات ولماذا تنهار الأمور في مرحلة توسيع جمع البيانات بدون بروكسي.
لماذا يجب التعمق في حركة مرور التطبيق
تجريف النسخة الويب واستدعاء API الخاص هما مهمتان مختلفتان من حيث التكلفة. قارن:
- الويب. تحتاج إلى متصفح بدون واجهة، وتجاوز مضاد الروبوتات، وتحليل HTML، وإصلاح دوري للمحددات. طلب واحد = ميغابايتات من حركة المرور وثوانٍ من وقت المعالجة.
- API الخاص. طلب HTTP عادي مع بعض الرؤوس، والرد - JSON مضغوط مع حقول محددة. غالبًا ما يقدم المزيد من البيانات مما يظهره الواجهة: معرفات داخلية، علامات، حقول خدمية.
تاريخياً، تكون خلفيات الموبايل محمية بشكل أضعف من الويب. السبب بسيط: منصات مضاد الروبوتات مصممة لحركة مرور المتصفح (تحديات JS، canvas، إشارات سلوكية)، بينما العميل الموبايل لن يمر عبرها. بدلاً من ذلك، يعتمد المطورون على مفتاح التطبيق الثابت وتثبيت TLS - وكلاهما يتم إزالته على الجهاز المحلي.
ما الذي ستحتاجه
- mitmproxy - وكيل HTTPS مفتوح المصدر (أكثر من 44,000 نجمة على GitHub، النسخة الحالية 12.2.2 صدرت في أبريل 2026، تتطلب Python 3.12+). يتم تثبيته بأمر واحد: pip install mitmproxy. يفهم HTTP/1، HTTP/2، HTTP/3، WebSocket و TCP الخام، ويعمل مع TLS 1.2 و 1.3.
- جهاز Android أو محاكي مع صلاحيات الروت. تظهر الممارسة أن Android 7-11 هو الأكثر ملاءمة: فقد شددت الإصدارات الجديدة من العمل مع الشهادات بشكل كبير.
- ADB للتواصل مع الجهاز وFrida (pip install frida-tools) - ستحتاج إليها إذا كان التطبيق يثبت الشهادة.
يمتلك mitmproxy ثلاث واجهات فوق محرك واحد: mitmproxy (واجهة TUI في الطرفية)، mitmweb (واجهة ويب، أكثر ملاءمة للمبتدئين) وmitmdump (بدون واجهة، للاستخدام في السكربتات والأتمتة).
الخطوة 1. تشغيل الوكيل
نبدأ واجهة الويب بحيث تستمع للاتصالات الخارجية، وليس فقط localhost:
mitmweb --web-host 0.0.0.0
بشكل افتراضي، يتم تشغيل الوكيل على المنفذ 8080. عند التشغيل الأول، يقوم mitmproxy بإنشاء مركز مصادقة خاص به ويضع المفاتيح في الدليل ~/.mitmproxy. ستظهر هناك أربعة ملفات: mitmproxy-ca.pem (الشهادة مع المفتاح الخاص)، mitmproxy-ca-cert.pem (الشهادة فقط)، mitmproxy-ca-cert.p12 لنظام Windows وmitmproxy-ca-cert.cer - التنسيق الخاص بـ Android.
الخطوة 2. توجيه الجهاز عبر الوكيل
في إعدادات Wi-Fi على الهاتف، نختار وكيل يدوي: عنوان IP لجهاز الكمبيوتر الخاص بك في الشبكة المحلية والمنفذ 8080. بعد ذلك، نفتح في متصفح الجهاز نطاق خاص mitm.it - هذه صفحة مضمنة في mitmproxy تحدد النظام الأساسي وتقدم التنسيق المطلوب للشهادة مع التعليمات.
في iOS، تتكون العملية من ثلاث خطوات، وينسى الجميع النصف الثاني: تنزيل الملف الشخصي عبر Safari، وتثبيته في "الإعدادات → عام → VPN وإدارة الجهاز"، ثم تشغيل الثقة الكاملة بشكل منفصل في "الإعدادات → عام → حول هذا الجهاز → الثقة في الشهادات". بدون الخطوة الأخيرة، تكون الشهادة مثبتة، لكنها لا تعمل.
إذا كنت لا ترغب في العبث بإعدادات Wi-Fi، فإن mitmproxy لديه وضع خادم VPN: mitmweb --mode wireguard. يتصل الجهاز بالعميل WireGuard الافتراضي، ويتم التقاط حركة المرور بشكل شفاف، دون إعداد يدوي للوكيل في النظام.
الخطوة 3. الجدار الرئيسي - الثقة في الشهادة
هنا تفشل معظم المحاولات. هناك مشكلتان، وهما مشكلتان مختلفتان.
شهادات CA المخصصة ليست موثوقة منذ عام 2016
بدءًا من Android 7 Nougat (API 24)، تثق التطبيقات افتراضيًا فقط بمخزن الشهادات النظامي. يتم تجاهل CA المخصص إذا لم يسمح المطور بذلك بوضوح في تكوين أمان الشبكة - من خلال الكتلة <certificates src="user" /> في نقاط الثقة. كان هذا قرارًا واعيًا من Google لتقليل سطح الهجوم، ولا يمكن تجاوز ذلك من خلال إعدادات الهاتف. بالمناسبة، لا يثق Chrome أيضًا بالشهادات المخصصة. في Android 11، تم تشديد القيود بشكل أكبر.
الاستنتاج العملي: على الجهاز مع صلاحيات الروت، يجب وضع شهادة mitmproxy في مخزن النظام، وليس في المخزن المخصص. لهذا السبب، فإن صلاحيات الروت في قائمة المتطلبات، وليس "مفضل".
تثبيت الشهادة
الجدار الثاني هو التثبيت: يحمل التطبيق بصمة الشهادة المتوقعة للخادم ويرفض التحدث مع أي شخص آخر. حتى CA النظام لا ينقذ هنا. أظهرت دراسة ACM لعام 2022 أن التثبيت شائع في "القطاعات عالية المخاطر" (البنوك، سيارات الأجرة، العملات المشفرة)، ولكنه غالبًا ما يتم تنفيذه بشكل غير كامل وبالتالي يمكن تجاوزه.
هناك عدة أدوات لهذه المهمة، وكل منها يحلها بطرق مختلفة:
- Frida - تعديل السلوك في وقت التشغيل: نقوم بتعليق وظائف التحقق من الشهادة ونجعلها تعيد النجاح. لا يتم تعديل التطبيق في هذه الحالة - الخيار الأكثر مرونة. الإطلاق النموذجي: frida -U -f com.target.app -l ssl_bypass.js --no-pause.
- apk-mitm - يقطع التثبيت تلقائيًا من ملف APK بشكل ثابت.
- android-unpinner - يعيد بناء APK، مضيفًا Frida وسكربتات إزالة التثبيت.
- objection - مجموعة أدوات فوق Frida، تدعم كل من iOS وAndroid.
- ssl-kill-switch2 - يعطل التثبيت في تطبيقات iOS وmacOS.
إذا كان نطاق معين مثبتًا بشكل صارم ويعيق العمل، يمكن ببساطة استبعاده من التقاط الحركة باستخدام خيار ignore_hosts (يقبل التعبير العادي) - ستتجاوز حركة المرور mitmproxy دون فك التشفير.
الخطوة 4. العثور على الطلب المطلوب
بعد ذلك - الروتين. نفتح التطبيق، نقوم بإجراء عمل واحد ذي معنى (فتح بطاقة منتج، التمرير عبر الخلاصة، تطبيق فلتر) ونرى أي الطلبات ظهرت. في الواجهة الطرفية، يتم ذلك بسرعة: Z يمسح قائمة التدفقات، Enter يفتح الطلب المحدد، E يصدره - بما في ذلك الأمر الجاهز curl.
ما الذي يجب البحث عنه في الطلب الملتقط:
- النقطة النهائية والمعلمات. غالبًا ما يكون هناك المزيد منها مما يستخدمه واجهة التطبيق.
- مفتاح العميل. الكلاسيكية - معرف ثابت، مضمن في التطبيق. في تحليل معروف لـ API العام MyAnimeList، كان هذا المفتاح هو الرأس x-mal-client-id بقيمة 6591a087c62b3e94d769cd8e35ffe909، الذي فتح الوصول إلى النقاط النهائية api.myanimelist.net/v3/anime/season و/v3/anime مع عشرين معلمة.
- User-Agent. لدى العملاء الموبايل User-Agent خاص ويعمل كجزء من "التصريح" - في نفس المثال، كان MAL (ios, 139).
- التوكنات ومدة حياتها. انظر على الفور، هل المفتاح ثابت أم يتجدد: من ذلك يعتمد كل هيكل جامع البيانات التالي.
من السهل تحويل curl المصدر إلى كود عبر curlconverter - ستحصل على طلب جاهز على requests، ومن ثم يمكنك العمل مع عميل HTTP العادي، دون أي متصفح.
الخطوة 5. التوسع - وأين تتعطل الأمور
في هذه المرحلة، يأتي الإحباط، المعروف للجميع الذين جربوا: من عنوان IP منزلي، يستجيب API الخاص بشكل ممتاز في النصف ساعة الأولى، ثم يبدأ في إعطاء 429 و403. خلفيات الموبايل محمية بشكل أضعف من انتحال العميل، ولكن الحدود حسب IP أكثر صرامة - يفترض الخادم أن عنوان IP واحد هو هاتف واحد، وليس مجمع بيانات في عشرين خيطًا.
من هنا، الاستنتاجات العملية.
- اجعل ملف تعريف الطلبات يبدو معقولًا. التطبيق الحقيقي لا يقوم بـ 50 طلبًا في الثانية ولا يتبع جدولًا صارمًا. ترتيب الاستدعاءات له أهمية أيضًا: يقوم العميل الحقيقي أولاً بطلب تكوين الجلسة، ثم المحتوى.
- وزع الحمل عبر العناوين. عنوان IP واحد = "هاتف واحد". تم تناول استراتيجيات التدوير، والتأخيرات مع التذبذب، والعودة الأسية بالتفصيل في المادة كيفية تجاوز قيود معدل API عند التجريف عبر البروكسي.
- خذ الجغرافيا في الاعتبار. العديد من APIs المحمولة تقدم محتوى وأسعار مختلفة اعتمادًا على بلد العنوان - وهذا في نفس الوقت قيد وفرصة.
من السهل إجراء التصحيح دون الخروج من mitmproxy: يمكنه الاتصال ببروكسي أعلى. الأمر mitmdump --mode upstream:http://example.com:8081 يوجه كل حركة المرور إلى الأعلى، ويتم تحديد التفويض له باستخدام الخيار --upstream-auth بتنسيق username:password. بهذه الطريقة، ترى نفس الطلبات التي رأيتها من قبل، ولكنها تخرج من عنوان خارجي - يمكنك التحقق على الفور من كيفية استجابة API لبلد معين أو نوع IP.
ما نوع البروكسي الذي يجب استخدامه مع API المحمول
الاختيار هنا ليس مجردًا، بل يتبع من من تتظاهر.
- بروكسي الموبايل - الخيار المفضل. تقوم بمحاكاة حركة مرور التطبيق، ويبدو عنوان مشغل الهاتف المحمول للخلفية طبيعيًا تمامًا: خلف عنوان واحد، بفضل CGNAT، يجلس فعليًا مئات المشتركين، لذلك تكون الحدود على هذه العناوين أكثر مرونة. تناسب بروكسي الموبايل 4G/LTE.
- بروكسي السكنية - منتصف العمل، إذا كانت الأحجام كبيرة، والارتباط بالمشغل ليس حرجًا: توفر عناوين IP المنزلية من مزودي الخدمة تغطية واسعة جغرافيًا بسعر معقول. هذه هي بروكسي السكنية.
- بروكسي مراكز البيانات - فقط للنقاط النهائية بدون تحقق صارم من سمعة العنوان. يتم التعرف على ASN الخاص بهم على الفور، ويبدو هذا غريبًا على الخلفيات المحمولة: لا توجد هواتف في مراكز البيانات.
المزالق التي ستكتشفها متأخرًا
- HTTP/3. دعم QUIC في mitmproxy موجود ومفعل افتراضيًا، ولكن على حركة مرور الموبايل الحقيقية، يكون محدودًا: غالبًا ما يتعين إرجاع الاتصال قسريًا إلى HTTP/2 من خلال التلاعب بـ ALPN. يعمل QUIC بشكل أفضل في أوضاع reverse وWireGuard.
- API الخاص يتغير دون إشعار. ليس لديه التزامات بشأن التوافق العكسي - هذه واجهة داخلية. ستتوقف نسخة التطبيق في User-Agent عن الخدمة ذات يوم، وسيبدأ المجمع في تلقي ردود فارغة بصمت. راقب ليس فقط رموز الردود، ولكن أيضًا هيكل JSON.
- لا تخلط بين "وجدت المفتاح" و"حصلت على الإذن". المفتاح الثابت للعميل ليس إذنًا لجمع غير محدود.
عن الجانب القانوني
التقاط حركة المرور على جهازك الخاص هو ممارسة قانونية وعادية للتصحيح، يستخدمها مطورو الموبايل والمتخصصون في الأمان. تبدأ الحدود بعد ذلك: التزم بشروط استخدام الخدمة، لا تجمع بيانات شخصية بدون أساس قانوني (في الاتحاد الأوروبي، يتم تنظيم ذلك مباشرة بواسطة GDPR)، لا تلمس النقاط النهائية التي تتطلب تفويضًا من الآخرين، واحتفظ بالحمل عند مستوى لا يعيق عمل الخدمة. المعيار العملي: إذا كانت البيانات مرئية في التطبيق لأي مستخدم بدون تسجيل الدخول إلى الحساب - فأنت في منطقة نسبياً آمنة؛ إذا كان الوصول يتطلب حساب شخص آخر - فأنت بالفعل خارجها.
باختصار
الخطة عملية وتوفر أسابيع من الجهد مع مضاد الروبوتات: نرفع mitmproxy، نضع الشهادة في مخزن النظام للجهاز مع صلاحيات الروت، وإذا لزم الأمر، نزيل التثبيت عبر Frida، نلتقط طلبًا واحدًا ذي معنى، نصدره إلى curl ونعيد كتابته إلى Python. بعد ذلك، تتحول المهمة من فئة "تجاوز الحماية" إلى مهمة "توزيع الحمل بعناية" - ويتم حلها بتدوير العناوين، والتأخيرات المعقولة، ونوع البروكسي الصحيح. من الأسهل البدء باستخدام بروكسي الموبايل: فهي الأقرب إلى حركة المرور التي تتوقعها الخلفية.
```