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

 

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

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

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

  • یک دستگاه با سیستم عامل 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 به کامپیوتر متصل میکنیم و دستور

1frida-ps -U

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

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

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

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

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

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

1mkdir dump
1python ./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) نبود و هیچ فایلی به صورت عمومی منتشر نشده.


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

نویسنده مطلب: برنامه نویس عجیب

منبع مطلب

به فکر سرمایه‌گذاری هستی؟

با هر سطحی از دانش در سریع‌ترین زمان با آموزش گام به گام، سرمایه گذاری را تجربه کن. همین الان میتونی با لینک زیر ثبت نام کنی و ۱۰ درصد تخفیف در کارمزد معاملاتی داشته باشی

ثبت نام و دریافت جایزه
10 نظرات
  1. علی می گوید

    سلام
    بسیار ممنونم از این آموزش بسیار جالب

    من یک مشکلی دارم که خواستم ببینم آیا میتونید راهنمایی کنید یا نه.

    تمام مراحل درست انجام شد و من در نهایت با grep -Rine تونستم ۲ تا فایل دامپ رو که pdf هم بودند پیدا کنم.
    ولی مساله این هست که هیچ کدوم باز نمیشن.

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

    میتونید کمکم کنید؟

    ممنون

    1. علی می گوید

      البته با امولاتور و ورٰژن های مختلف اندرویدم تست کردم.
      باز هم نتیجه یکسان بود.

      احساس میکنم این قضیه فقط روی iOS کار میکنه و نه اندروید.

    2. امین می گوید

      کافیه فرمت فایل ها رو عوض کنی و یه سایت repair pdf پیدا کنی، برا من کار کرد.

  2. جواد می گوید

    سلام علیکم. ببخشید من از رم dump گرفتم ولی داده های فایل دامپ به صورت علامت هست.
    چگونه می توان آن ها را به صورت کلمات درآورد؟

  3. رضا می گوید

    سلام
    برای نرم افزار ویندوزی کتابراه چکار میشه کرد؟
    کلی فایل دارم که فقط باید با نرم افزار خودش باز کنم… پرینت هم نمیشه

    نرم افزار جامع طب نور هم یه همچین فضایی داره
    کلی کتاب داره ولی نمیشه استفاده درست کرد… برای این راهی ندارید؟

  4. مهدی می گوید

    سلام،،میتونی اسکرین شات بگیری بعد عکسارو به هم بچسبونی باcam scanner بعدم pdfشون کنی،،راحت تر نیست؟

  5. NEO می گوید

    من طاقچه ندارم. ولی این مطلب رو که خوندم کنجکاو شدم روی فیدیبو تست کنم. با نسخه ویندوزی به صورت جسته گریخته میشه متن های فایل دیکد شده epub رو استخراج کرد.
    حتی فایل یک سری کدهای استفاده شده شون با کامنت ها مثل html-parser و Node.js هم کامل استخراج میشه.
    ولی چسبوندشون بهم به صورت دستی واقعا حوصله سر بره. مگر یک خیری پیدا بشه و یه اپ بنویسه که این کار رو بکنه!

  6. او می گوید

    ایده و راهکارایی که انجام دادی برای من خیلی جداب بود. ایول

  7. امید می گوید

    سلام آموزش اندرویدیش چطوریه
    من که نه فایل کامپیوتریشو تونستم پیدا کنم نه فایل نصبی برای گوشی…….اصلا فایل apk اندروید تو این سایته نیس داداش من

  8. محمد می گوید

    سلام.
    لطفا یه آموزش برای نسخه ویندوزیشم بزارین(استخراج از فایل exe ویندوزیش) کلافه شدیم با pdf خون مزخرف برنامشون

نظر شما درباره این مطلب

آدرس ایمیل شما منتشر نخواهد شد.