رمزگشایی فایل های اپلیکیشن طاقچه

اگه شما هم به خاطر قیمت های سرسام آور کتاب های کاغذی به کتاب های الکترونیکی روی آوردید احتمالا اسم اپلیکیشن هایی مثل طاقچه، فیدیبو یا کتابراه رو شنیدید. چیزی که همه این برنامه ها در اون شباهت دارن استفاده از رمزنگاری برای جلوگیری از دست به دست شدن غیرقانونی فایل کتاب هاست. یعنی در ازای حفظ امنیت فایل ها، آزادی عمل کاربر از بین رفته و شما حق این رو ندارید که فایلی که مالکش هستید و هزینه ش رو پرداختید رو آزادانه به دستگاه های مختلف تون منتقل کنید و روی اپلیکیشن دلخواه خودتون مطالعه کنید.

در این پست تجربه خودم در رمزگشایی این فایل ها و موفقیت ها و شکست هایی که در این راه باهاشون مواجه شدم رو با شما به اشتراک میذارم.


چیز هایی که برای رسیدن به هدف استفاده شد:

  • یک دستگاه با سیستم عامل iOS جیلبریک شده
  • یکی از برنامه های Disassembler (اختیاری)
  • یک کامپیوتر (ترجیحا با سیستم عامل لینوکس یا مک)
  • ابزار Frida

در این پست نسخه iOS اپ طاقچه رو مورد بررسی قرار میدیم چون ابزار های مهندسی معکوس بهتری برای این سیستم عامل هست و کارمون رو راحت تر میکنه. شما می‌تونید همین مراحل رو روی یه گوشی اندروید هم طی کنید اما باید ابزار های مخصوص اندروید رو از قبل بشناسید و از قبل تجربه کار باهاشون رو داشته باشید.


بخش اول: مقدمات

اولین کاری که باید انجام بدیم پیدا کردن محل ذخیره فایل های این برنامه ست. در iOS کافیه وارد برنامه Filza (فایل منیجر iOS) بشیم و داخلش از بخش Apps Manager پوشه دیتای برنامه طاقچه رو پیدا کنیم.

محیط برنامه Filza
محیط برنامه Filza

سپس وارد Documents/books میشیم و همه فایل های دانلود شده اونجاست. اما یه مشکلی هست، هیچ کدوم باز نمیشن و به نظر میاد فایل ها خرابه. همه اون فایل ها رمزنگاری شده هستن و به جز اپلیکیشن طاقچه با هیچ برنامه ای باز نمیشن.


بخش دوم: بررسی مسئله

اولین چیزی که به ذهنم رسید این بود که احتمالا از یه روش رمزنگاری معروف استفاده کردن، کلید رمزگشایی خیلی واضح تو دیتابیس برنامه هست و با یه نگاه ساده تو کد دیس‌اسمبل شده برنامه میشه فهمید از چه الگوریتمی استفاده شده و بعد به راحتی فایل هارو رمزگشایی میکنیم، پایان! اما همونطور که حدس زدید این راه جواب نداد. بعد از باز کردن فایل Binary برنامه داخل IDA Pro و جستجوی کلمات کلیدی مثل Encryption چند تا تابع پیدا می‌شه که به نظر میاد مسئولیت انجام رمزنگاری و رمزگشایی فایل هارو بر عهده دارن. اما بعد از اینکه کمی داخلشون گشت و گذار می‌کنیم و حتی کد اسمبلی رو دیکامپایل می‌کنیم با تعداد انبوهی Function call های تو در تو و شلوغ رو به رو می‌شیم که مشخص نیست هیچ کدوم چه کاری انجام میدن، هر کدوم با زبان های مختلفی نوشته شدن (سی++ ، سوییفت و آبجکتیو سی) و سر در آوردن از نحوه کارشون ممکنه روز ها یا هفته ها وقت بگیره. (شکست اول)

ناشر ها و نویسنده ها کتاب شون رو در اختیار برنامه ای قرار نمیدن که به این سادگی ببازه.

محیط برنامه IDA Pro روی لینوکس با استفاده از wine
محیط برنامه IDA Pro روی لینوکس با استفاده از wine

خب اگه برعکس من یه محقق امنیتی ماهر باشید و تجربه کار با اسمبلی arm و برنامه نویسی iOS رو داشته باشید الان کاری که معقول به نظر می‌رسه اینه که بشینیم و با تکیه بر تجربه مون از نحوه عملکرد الگوریتم های برنامه سر در بیاریم. BORING ! ?

اما اگه مثل من تنبل و دنبال پیدا کردن یه راه ساده و بدون زحمت باشید اینجا متوقف می‌شید و تمام تلاش تون رو بر این میذارید که یه راه ساده تر پیدا کنید (همیشه یه راه ساده تر پیدا میشه)

و همین اتفاق افتاد. بعد از روز ها رها کردن پروژه همچنان فکرم در ناخودآگاه درگیر این مسئله بود و یه روز کاملا اتفاقی ایده ای به ذهنم رسید ?. برنامه برای اینکه فایل ها رو باز کنه نیاز داره که خودش اونها رو رمزگشایی کنه. چرا کار های سخت رو ما انجام بدیم وقتی خود برنامه در هر صورت مجبوره انجامش بده؟‌ :)

داده های برنامه موقع اجرا داخل حافظه RAM دستگاه قرار میگیرن. با قرار دادن تکه های پازل توی مغزتون تا الان باید تا ته ماجرا رو فهمیده باشید. برنامه فایل هارو رمزگشایی میکنه + فایل های رمزگشایی شده داخل رم قرار دارن => پس برای دسترسی به چیزی که دنبالش هستیم کافیه کل مموری برنامه رو بیرون بریزیم و داخلش دنبال فایل از قبل رمزگشایی شده بگردیم!


بخش سوم : تبدیل ایده به عمل

ابزاری که خیلی اسمش رو شنیده بودم ولی هیچوقت ازش استفاده نکرده بودم Frida بود. این ابزار در دنیای مهندسی معکوس (به قول یکی از استادهامون) بیشتر شبیه به معجزه ست. طرز کارش به این شکله که یه نسخه سرور و یه نسخه کلاینت داره و باید روی دستگاهی که برنامه مورد نظر مون روش اجرا میشه نسخه سرور و روی کامپیوتر مون نسخه کلاینت رو نصب کنیم تا بتونیم بهش وصل بشیم و در کار برنامه ها فضولی کنیم. این ابزار قابلیت های زیادی مثل توانایی تغییر در زمان اجرا داخل هر برنامه ای و تزریق کد دلخواده به شکل جاوا اسکریپت و... رو داره اما چیزی که مد نظر ماست بیرون کشیدن مموری برنامه ست که به اصلاح بهش Memory Dump گفته میشه. برای این کار هم یه نفر از قبل اسکریپتی نوشته به اسم fridump که کارمون رو خیلی آسون تر می‌کنه.

قبل از هر چیز باید Frida رو روی iOS نصب کنیم. برای این کار سورس https://build.frida.re رو داخل Cydia اضافه می‌کنیم و بعد نسخه مناسب دستگاه مون رو نصب میکنیم. برای من Frida for pre-A12 Devices باید نصب می‌شد.

محیط برنامه Cydia
محیط برنامه Cydia


همچنین روی کامپیوتر مون هم باید frida رو نصب کنیم:

حالا آیفون/آیپد رو با استفاده از USB به کامپیوتر متصل میکنیم و دستور

frida-ps -U

رو برای اطمینان از اینکه همه چیز به درستی نصب شده اجرا می‌کنیم. خروجی دستور باید لیستی از برنامه های در حال اجرا روی دستگاه، چیزی شبیه به این عکس باشه:

خروجی دستور frida-ps -U
خروجی دستور frida-ps -U

خب همه چیز آماده ست.

وارد پوشه اسکریپت fridump میشیم. اپ طاقچه رو روی دستگاه باز می‌کنیم و یه کتاب که مد نظر مون هست رو باز میکنیم تا داخل برنامه لود بشه و متن کتاب نمایش داده بشه.

محیط برنامه طاقچه در حال نمایش متن کتاب
محیط برنامه طاقچه در حال نمایش متن کتاب


برای Dump کردن مموری برنامه این دستورات رو وارد می‌کنیم

mkdir dump
python ./fridump.py -U -o dump TaqReader

پس از اتمام کار اسکریپت، همه فایل های مربوط به دامپ مموری داخل پوشه dump ذخیره میشن.

اسکریپت fridump در حال اجرا
اسکریپت fridump در حال اجرا

یه نگاهی داخل پوشه dump بندازیم:

محتوای پوشه dump
محتوای پوشه dump

بیش از 600 فایل ساخته شده که کل مموری برنامه به صورت خام و بدون ساختار منظم داخل شون ذخیره شده. از اینجا به بعد وظیفه ماست که بین این حجم عظیم از داده ها به دنبال چیزی که لازم داریم بگردیم.

دستور grep اینجا به کمک ما میاد. با نوشتن grep -Rine میتونیم بین همه فایل ها دنبال یه تکه متن بگردیم.

اولین تلاش برای پیدا کردن کتاب: جستجوی بخشی از متن کتاب

خروجی دستور grep -Rine
خروجی دستور grep -Rine "در موارد دیگر"

یه فایل پیدا شد!

محتویات فایلی که پیدا شد
محتویات فایلی که پیدا شد

اما با حقیقت تلخی مواجه میشیم. ساختار کتاب های الکترونیکی Epub به این شکله که تعدادی فایل html برای هر بخش از کتاب وجود داره و چند فایل دیگه مثل فهرست و عکس ها و.. و همه این فایل ها داخل یک فایل zip بسته بندی شده ن.

با چند مشکل مختلف مواجه شدیم:

  • همه فایل های html همزمان داخل مموری نیستن
  • ترتیب فایل ها و اسم فایل ها مشخص نیست
  • فایل ها به بقیه محتویات مموری چسبیده ن و مرز های شروع و پایان به سادگی قابل تشخیص نیست
  • ...

(شکست دوم) ?

تا اینجای کار نا امید کننده بود. البته همه مشکلات بالا قابل حل هستن اما زمان بسیار زیادی برای رفع مشکل لازم دارن. با صرف وقت میشه از روی کتاب بخش های مختلف رو پیدا کرد و فایل ها رو به شکل یه فایل html بزرگ به هم متصل کرد. در صورتی که انگیزه زیادی برای انجام این کار داشته و زمان کافی داشته باشیم، تولید یه فایل کامل از کتاب کار غیر ممکنی نیست.


اما هنوز به پایان نرسیدیم! اگه به محیط برنامه طاقچه دقت کرده باشید در توضیحات هر کتاب نوع فایل هم ذکر شده. خیلی از کتاب ها epub هستن اما بعضی از اونها PDF هستن! ساختار فایل های PDF مثل زیپ نیست و از تکه های جدا تشکیل نشده. این به این معناست که احتمالا فایل کتاب به صورت کامل داخل مموری لود میشه. برای تست این فرض فقط کافیه مراحل قبل رو برای یه کتاب PDF دوباره انجام بدیم. من برای این کار کتاب ساختمان های داده از دکتر مقسمی رو باز کردم.

محیط برنامه طاقچه در حال نمایش فایل PDF
محیط برنامه طاقچه در حال نمایش فایل PDF


برای پیدا کردن فایل PDF داخل دامپ مموری نمیشه متن کتاب رو سرچ کرد اما راه ساده تری وجود داره. همه فایل های PDF با کاراکتر های PDF- به عنوان هدر شروع میشن. کافیه همین هدر رو سرچ کنیم تا بین همه فایل های دامپ شده کتاب رو پیدا کنیم:

خروجی دستور grep -Rine -PDF
خروجی دستور grep -Rine -PDF


فایل اول دقیقا فایل کتابی بود که دنبالش بودیم. کامل و بدون نقص!

Et Voilà !
Et Voilà !


حالا این فایل رو به تغییر نام میدیم مثلا به Book.pdf و به گوشی یا تبلت منتقل می‌کنیم.


بخش چهارم: نتیجه گیری

هدف از این تحقیق این بود که به محدودیت هایی که شرکت ها جلوی کاربر میذارن غلبه کنیم و در این راه چیز های جالب و جدید یاد بگیریم. ما به عنوان کاربر باید حق تصمیم گیری برای محصولی که خریداری کردیم داشته باشیم و باید تا جایی که در توان مون هست در مقابل این محدودیت ها ایستادگی کنیم.

امیدوارم در آینده شرکت ها و کاربران به اون سطح از اعتماد و احترام متقابل برسن که نیازی به اعمال چنین محدودیت هایی نباشه.


پی نوشت:

هدف من در این مسیر هیچگاه دزدی (Piracy) نبود و هیچ فایلی به صورت عمومی منتشر نشده.


این اولین پست من در ویرگول بود. در صورتی که اشتباهی در مطلب پیدا کردید خوشحالم میشم بشنوم و تصحیح کنم. اگه دوست داشتید نظرتون رو بگید و این مطلب رو با دوستان تون به اشتراک بذارید.