Hady 🍍
Hady 🍍

@HadySata

27 تغريدة 5 قراءة Jan 22, 2024
قبل فترة كنت احتاج مجموعة صور لسيارات كثيره، كنت احتاجها بجودة عالية ومن اكثر من زاوية. دورت كثير وشفت خيارات كثيره بس ماحصلت الا موقع واحد فيه كل السيارات وبجودة عالية وبأكثر من زاوية.
حاولت اتواصل معاهم عشان لو يمدي اشتري الصور او لو كان عندهم API ممكن استخدمه بس محد رد علي 🙂
الموقع واضح قديم وبسيط مره، تقدر تتصفح فيه صور السيارات بشكل لطيف
فقررت اسوي سكرابنق سريع يسحب الصور ويرفعها على storage عندي. كان فيه اكثر من مشكلة لكن اهمها ان الموقع كامل يطيح لما اشغل السكربت 😂 اعتقد بسبب اني جالس اعدي ال bandwidth. جربت اخليه ابطئ بس حصلت نفس المشكلة. اكتشفت ان باليوم الواحد تقريبا يمديني اجيب صور ٧-١٠ سيارات فلو ببقى على كذا بطول مره لأني ابي اجيب صور اكثر من ١٠٠٠ سيارة💀
حصلت عندهم تطبيق جوال، ولما شيكت عليه طلع يستخدم api مختلف عن اللي بالموقع ولا فيه مشكلة ال bandwidth فيمديني اسحب الصور براحتي🏃🏻‍♂️
اكثر شي لفت انتباهي ان حجم التطبيق ٢ ميقا، فقلت الامور سهالات تطبيق بسيط بدخل اشوف ال endpoints اكيد بتكون straightforward
ربطت http debugger بجوالي ورحت فتحت اول صورة وكان هذا الرابط حقها 👇
من اول نظرة الرابط واضح وبسيط، عندنا:
- الـ base url وهذا شكله ثابت
- ID غريب شكله unique ID للصورة
- واسم ملف الصورة
بالعادة الرابط او جزء منه يجيك من الباك اند، فلاحظت لما افتح صفحة السيارة فيه ريكويست ينرسل والباك اند يرجع معلومات عن السيارة
اول شي صدمني ان الـ response شكله غريب وثاني شي صدمني هو انه xml مو json 💀
اعرف ان xml كان مستخدم بال responses بشكل كبير زمان بس ماقد شفته ببرودكشن
اغلب التطبيقات حاليا تستخدم json فـ اعرف كيف شكل ال json وهو encrypted او obfuscated او compressed بس الـ xml ما اعرف عنه شي.
جلست ابحث عن طرق لتشفير ال xml قريت مقالات من 2005 بس ما طلعت بنتيجة.
حصلت شي اسمه xmlenc وهو syntax لتشفير الـ xml الصدق رهيب بس مو هو اللي ادور عليه😂
طفشت وانا احاول اعرف وش نوع التشفير، فقلت مالي الا اشوف كود التطبيق عشان اعرف كيف جالس يسوي decode. حملت تطبيق الاندرويد وسويت له decompile وجلست اقرا الكود وادور على اشياء لها علاقة بال endpoints اللي فوق بس ما حصلت اي شي!
استغربت وفتحت التطبيق على جوالي وانصدمت انه مو نفس الـ IOS 🙂 تطبيق الاندرويد حرفيا يفتح لك المتصفح مايستخدم نفس ال endpoint فرجعنا لمشكلة السكرابنق وال bandwidth
تنرفزت شوي لان اللي اقدر اسويه حاليا يا اروح انام وهو الحل الأسلم او اسوي decompile لتطبيق الـ IOS والصدق انه اكره شي عندي😂
وانا جالس اقفل الصفحات عشان اروح انام لفت انتباهي هذا ال review اللطيف لتطبيقهم على قوقل بلاي. المستخدم زعلان ان التطبيق يفتح صور السيارات بالويب، مو نفس قبل كان يفتح الصور داخل التطبيق نفسه
اوووه دقيقة يعني النسخ القديمة كانت نفس ال IOS 😲 هنا حسيت بانتصار صغير ووقفت اقفل الصفحات😂
دورت على اقدم نسخة من التطبيق يمديني احصلها حملتها وشغلتها على جهازي بس للاسف طلعت نفس اخر نسخة تفتح الصور بالموقع 😔
لسبب ما قلت خليني اسوي لها decompile واشوف الكود. وانا اقرا حصلت اكواد كثيره تستخدم ال api نفس اللي موجود بالـ IOS 🔥 الواضح انها اكواد مو مستعملة كانت بالنسخ القديمة من التطبيق(ياحظي 😂)
هنا رجع الحماس وبديت اشوف النور 😂 الحين يبي لي اشوف كيف التطبيق جالس يسوي deocde للـ response ونخلص!
فحصلت الفنكشن اللطيفة هذي اللي الواضح انها ترسل ريكويست لوحدة من الendpoints بعدها تمرر الresponse في فنكشن وتقرا قيمته، يعني هذي الفنكشن اللي تسوي decode واخيرا 🎉
رحت اشوف كود الفنكشن هذي، والواضح انها تسوي loop على كل حرف وتبدله بحرف من متغير من نوع array اسمه f78D، طيب حلو حلو 🏃🏻‍♂️
رحت اشوف وش قيمة المتغير هذا(غيرت اسمه الى cipher) واكتشفت فنكشن اسمها m579v هي اللي جالسة تسوي له set، الفنكشن تستخدم متغير اسمه f73y وهو عبارة عن متغير فيه قييم عشوائية
يعني الحين عشان اسوي decode فيه فنكشن تسوي setup لمتغير cipher وبعدها امرر ال response body لفنكشن ال decode وبكذا اقدر اشوف ال response ✅
رجعت كتبت الكود عندي بطريقة اوضح، وجربت اسوي deocde للـ response الغريب اللي طلع لي بالبداية واخيييييرا شيء يمديك تقراه🥳🎉
الحين من ال xml اللي فكيناه ماحصلنا اي روابط للصورة لكن فيه معلومات عن السيارة والواضح ان التطبيق يبني الرابط من نفسه ومايخذه مباشر من الباك اند(نفس اي تطبيق طبيعي🙂)
المهم، يمدينا نشوف المعلومات هذي كيف جالسة تُستخدم ببناء الرابط، الحين قدرنا نجيب اغلب ال picture name بس باقي عندنا شيئين ما ندري وش هم:
- th
- 01
الـ 01 واضح انه رقم الصورة لاني اذا فتحت الصورة اللي بعدها يصير 02 الخ…
واذا فتحت صفحة سيارة محددة الباك اند يرسل لك المعلومات هذي(بعد فكها) 👇
من النظر، مقسمين صور السيارة الامامية والجانبية والداخلية والخ الى ids وكل id عبارة عن خانتين، وواضح ان الارقام عبارة عن hexadecimal يعني:
• الصورة الاولى 01
• الصورة الخامسة 05
• الصورة العاشرة 0A
وكذا…
اما بالنسبة للـ th، اول ماتفتح التطبيق الباك اند يرسل المعلومات هذي 👇
فيها معلومات عامة ونلاحظ ان ال thumbnails يستخدمون لهم id= th
وال hd يستخدمون لهم id = fh
جميييل ☕️
فالحين لما نرجع للرابط حقنا، فهمنا كل شي بخصوص اسم الصورة وعرفنا كيف نجيب ال base url
باقي الجزء اللطيف اللي بالنص هذا كيف نجيبه ووش ذا اصلا وليش موجود وانا وش جابني هنا وليش للحين مصر اكمل ومو لو دخلت طب اصرف لي؟ 🤡
ماعلينا نكمل، دام ماحصلنا صيغة الصورة من البيانات اللي يرجعها الباك اند وحنا متأكدين ان التطبيق يبني الرابط فخليني ادور على الفنكشن اللي تبني الرابط، فبحثت بالكود عن .jpg عشاني متاكد انه hardcoded وحصلت الفنكشن 🙌
اللي يهمني هي الفنكشن اللي بين اول وثاني backslash (/) لان هو الجزء اللي مو فاهمه من الرابط
الفنكشن تستقبل parameter وتروح تسويه MD5 hash بس مع كم حبة بهارات حاطها المطور ✨
البهارات ذي اذا جمعتها تطلع NCSAppCode85
حلو يعني اللي كنت اعتقد انه ID طلع MD5 hash، بس وشو اللي جالس ينرسل للفنكشن هذي عشان ترجع الهاش؟ لو نرجع للـ decompiled code عشان نعرف وش اللي جالس ينرسل نشوف انه جالس يعرف متغير اسمه str ويرسله على طول وهذا مو منطقي لانه لو كذا بيكون null. هذا الشي طبيعي يصير لما تسوي decompile لان الكود اللي يطلع لك ماهو الكود الاصلي واوقات يكون فيه مشاكل او يكون ناقص، فذي الجزئية كان فيها مشكلة 🙂
رجعت سويت للتطبيق decompile بس هذي المره باستخدام tool اسمها jadx ورجعت اشوف كود الفنكشن نفسها
طبعا ال readability ماهي احسن شي لكن على الاقل جاب لنا الكود.
رجعت كتبته بشكل ابسط عشان افهمه، والحين واضح ان اللي ينرسل لفنكشن ال md5 hash هو اسم الصورة نفسها 😂(طبعًا مع البهارات اللي حاطها المطور اللي ذكرناها فوق)
والحين وأخيرًا عرفنا كيف ينبني الرابط ويمدينا نجيب اي صورة نبيها 🥳
وبكذا خلصنا 🤝
طبعًا مثل مانشوف بالمثال هنا حطيت اسم الصورة عشان اطلع الهاش وطلع مطابق للرابط ✅ طبعًا هذي th يعني thumbnail
طيب لو نجي نحط fh عشان نحمل الصورة full hd؟
يطلع لنا هاش مختلف 🤡💔! وهذا يعني ان طريقة بناء الهاش للصور كلها نفس اللي طلعناها فوق لكن صور ال HD لهم طريقة مختلفة بالهاش…
واو هذا اللي كان ناقص😂 وانا اللي كنت افكر نفسي خلصت 💀
رجعت للكود واكتشفت فعلًا صور ال HD مايستخدمون فيها نفس الطريقة، والكود كان غريب بشكل يصدع(او انا كنت مصدع) المهم رجعت كتبته بطريقة محترمة شوية وباقي ماهو منطقي واصلا فيه اشياء ماهي موجودة بالرابط حاليا وال behavior حقه غريب شوي. بعد عدد من التجارب تيقنت ان هذي الطريقة طريقة قديمة لهاش ال HD والواضح انهم غيروها حاليا بتطبيق ال IOS. حاولت اجرب اكثر من شي وماضبط صقعت بجدران كثيره😂
طبعًا هنا واضح ان تطبيق للأندرويد مستحيل اطلع منه طريقة الهاش لصور ال HD وما قدامي الا decompile تطبيق الـ IOS عشان اشوف طريقتهم ✨الجديدة✨
حسيت اني قطعت شوط طويل وحرام اسحب بالاخير. فجبت جوالي القديم سويت له جلبريك وثبتت frida(اداة تستخدم للهندسة العكسية) سحبت ال decrypted ipa لنسخة التطبيق عشان احللها و فتحتها في Ghidra(اداة تستخدم للهندسة العكسية برضو)
الجميل بالموضع الحين اعرف وش ادور عليه، كل اللي ابيه اني اعرف وش جالس ينرسل للفنكشن اللي تسوي md5 hashing. فأول شي بحثت عنه هي البهارات اللي كان حاطها المطور للهاش (NCSAppCode85) وحصلتها ✅
الحين اللي بالعادة اسويه اني اسوي trace back واشوف مين جالس يستخدم ال md5Code ومنه اعرف call tree واوصل للمكان اللي ابيه. لكن لما فتحت ال function call tree ماشفت اي incoming calls! يعني مافيه احد جالس يكلم ذي الفنكشن 🙂
وهنا تذكرت اني جالس اقرا كود تطبيق من العصر الحجري يعني اكيد يستخدم objective-c مو سويفت🙃
وش الفرق طيب؟
فروقات كثيره بس اللي يهمني حاليا ان الشيخ obj-c يـ load الفنكشن dynamically في ال run time، فلما ينادي الفنكشن مايناديها نفس الناس يناديها عن طريق ميثود msgSend فعشان كذا مو طالع لي شي بال call tree
جلست ادور على الفنكشن بشكل يدوي وسويت trace back لما حصلتها ولما وصلت لها الصدق جلست احاول استوعب وش جالس يصير بس مافهمت بالضبط وش اللي جالس ينرسل لفنكشن MD5 والصدق طفشت خصوصا مع سالفة ال dynamic loading حقت obj-c
فأبد قررت اسوي dynamic analysis، شغلت frida على اللابتوب وكتبت سكربت بسيط يطبع لي ال parameters اللي تنرسل للفنكشن مع ال return value وسهل المهمة ذي اني الردي اعرف اسم الفنكشن واسم الكلاس من الخطوة اللي قبل
شغلت السكربت وشغلت التطبيق بالجوال وفتحت اي صورة، وطبع لي وش جالس ينرسل للفنكشن 😍
جالس يرسل اسم الصورة(نفس صور ال thumbnail) بس زايدة عليهم نص غريب
طبعًا بالبداية قلت وش ذا النص ماني ناقص شي زيادة بعد💀 بس بعدين استوعبت انه عبارة عن ID الحساب حقي وببساطة جالس ينرسل بال request مع ال user agent ولازم يكونون matched
عدلت على الفنكشن بشكل بسيط عشان تضيف هذا النص وشغلته مره ثانية على صورة HD والهاش كان مضبوووووط 🥳🥳🥳
وكذا منجد خلصنا 😂
كانت تجربه رهيبة خصوصا اني كنت مستهين فيه كموقع قديم وبسيط جدا وتطبيق صغير وعادي، ابدا ماتوقعته يكون كذا. تعلمت اشياء جديدة وكانت تجربه مختلفة الصدق بسبب ان التقنيات المبني فيها الموقع والتطبيق تعتبر قديمة نسبيًا ولا مرت علي كثير، لكن استمتعت 😁

جاري تحميل الاقتراحات...