مهندسی معکوس آسان اپلیکیشن های اندروید با jadx

مهندسی معکوس آسان اپلیکیشن های اندروید با jadx

در این مقاله قصد داریم تا شما را با ابزاری آشنا کنیم که با استفاده از آن می توانید اپلیکیشن های اندروید را مهندسی معکوس کرده و کد منبع آن ها را به صورت کد جاوا داشته باشید. در ادامه با ما همراه باشید تا کمی با ساختار برنامه ها و نحوه اجرای آن ها در اندروید آشنا شویم و سپس به سراغ مهندسی معکوس آن ها برویم.
اپلیکیشن های اندروید در اغلب موارد با استفاده از Android Studio و با زبان جاوا توسعه داده می شوند. برخلاف تصور اغلب توسعه دهندگان، کد های جاوا در سیستم عامل اندروید به صورت مستقیم قابل اجرا نیستند. دلیل این موضوع، عدم وجود JVM(Java Virtual Machine) در خود اندروید است. در سیستم عامل اندروید به جای کد میانی جاوا (Java Bytecode)، DEX Bytecode توسط Dalvik VM اجرا می شود( البته توجه داشته باشید که در نسخه های جدیدتر اندروید این موضوع کمی متفاوت است و به جای Dalvik از ART(Android Runtime) استفاده می شود). حالا احتمالا می توانید تصور کنید که اپلیکیشنی که بتواند کد DEX را به جاوا تبدیل کند و به صورت تعدادی پکیج در کنار هم نمایش دهد چقدر می تواند ارزشمند باشد. در ادامه با ما همراه باشید تا یکی از بهترین ابزارها در این زمینه را با هم بررسی کنیم.

ابزار JADX

این ابزار یکی از decompiler های خوب برای تبدیل کد DEX به جاوا است که با دادن فایل apk به آن می توانید به آسانی کد منبع اپلیکیشن را به زبان جاوا مشاهده کنید. این ابزار قابلیت های بسیار خوبی را به شما می دهد که از جمله آن ها می توان به قابلیت جستجوی پیشرفته در قسمت های مختلف کد و همینطور قابلیت deobfuscation اشاره کرد. توجه داشته باشید که این ابزار هم به صورت Command Line و هم به صورت گرافیکی (GUI) در دسترس است. در این آموزش ما با نسخه گرافیکی آن کار خواهیم کرد که با نام jadx-gui شناخته می شود. در ادامه با ما همراه باشید تا مراحل نصب ابزار را روی Ubuntu با هم بررسی کنیم.

مراحل نصب ابزار

برای نصب این ابزار ابتدا باید JRE را دانلود و نصب کنید. سپس برای دانلود ابزار باید به آدرس زیر مراجعه کنید.

https://github.com/skylot/jadx/releases

همانطور که در شکل زیر اشاره شده است، بهترین نسخه که هم در لینوکس و هم در ویندوز قابل اجراست نسخه jadx-1.2.0.zip است که باید آن را دانلود کنید.

پس از دانلود و extract کردن فایل زیپ، مطابق شکل زیر باید وارد فولدر bin شوید.

همانطور که در شکل بالا مشاهده می کنید فایل هایی که پسوند .bat دارند برای اجرای نرم افزار در ویندوز و فایل هایی که هیچ پسوندی ندارند برای اجرای نرم افزار در لینوکس مورد استفاده قرار می گیرند. برای اجرای نسخه گرافیکی این نرم افزار در ویندوز کافی است روی فایل jadx-gui.bat دابل کلیک کنید. برای اجرای این نرم افزار در لینوکس نیز دستور زیر را باید در ترمینال و داخل دایرکتوری bin در پوشه نرم افزار اجرا کنید.

./jadx-gui

در ادامه، ما از این ابزار در محیط لینوکس استفاده کرده ایم که هیچ تفاوت کاربردی با اجرای آن در ویندوز ندارد. پس از اجرای دستور بالا در ترمینال لینوکس، صفحه انتخاب فایل apk مطابق تصویر زیر به شما نمایش داده خواهد شد.

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

مهندسی معکوس یک اپلیکیشن ساده

در این مقاله به عنوان مثال ما یک اپلیکیشن آسیب پذیر را بررسی خواهیم کرد که از آدرس زیر قابل دانلود است.

https://github.com/HTBridge/pivaa/blob/master/apks/pivaa.apk

پس از باز کردن این اپلیکیشن در داخل jadx، مانند تصویر زیر در نوار سمت چپ، کدهای اپلیکیشن به صورت چند پکیج جاوایی با ساختار درختی برای شما نمایش داده خواهد شد. قسمت source code که با رنگ قرمز مشخص شده است در واقع شامل کلاس های جاوایی اپلیکیشن است که باید روی آن ها کار کنیم.

یکی از رایج ترین آسیب پذیری های موجود در اپلیکیشن های اندروید، Hardcode کردن اطلاعات حساس مانند توکن های API، پسوردها و ... در داخل کد اپلیکیشن اندروید است. با داشتن این اطلاعات امکان اتصال به سرویس به صورت مستقیم برای هکر فراهم می شود و ممکن باعث بروز فاجعه بزرگتر و نهایتا هک شدن زیرساخت یک اپلیکیشن شود. در ادامه سعی می کنیم تا نمونه ای از این آسیب پذیری را در اپلیکیشن مورد نظر پیدا کنیم.
برای این کار ابتدا باید به پکیج های جاوایی استفاده شده در قسمت source code نگاهی انداخته و آنها را بررسی کنیم. اگر به دقت به تصویر قبلی نگاه کنید دو پکیج با نام های android و org.apache.commons.codec در این قسمت وجود دارند که با جستجو در مورد این دو پکیج به این نتیجه می رسیم که کتابخانه هایی آماده هستند که توسعه دهنده از آن ها برای مقاصد مختلف در اپلیکیشن استفاده کرده است. بنابراین تنها پکیجی که احتمالا توسط خود توسعه دهنده نوشته شده است com.htbridge.pivaa خواهد بود. برای بررسی صحت این موضوع از دانسته های قبلی خودمان در مورد اپلیکیشن اندروید استفاده خواهیم کرد. همانطور که می دانید اپلیکیشن های اندروید از تعدادی activity ایجاد شده اند که نام activity اصلی به صورت پیشفرض در اپلیکیشن ها MainActivity است. بنابراین مانند تصویر زیر به سراغ MainActivity می رویم تا آن را بررسی کنیم.

با نگاهی به تصویر بالا متوجه خواهیم شد که در قسمت مشخص شده با رنگ قرمز، این اپلیکیشن در حال پیاده سازی مکانیزم Authentication است و واژه های جذابی مانند Authentication و Configuration در این قسمت مشاهده می شوند. با کمی توجه به کد متوجه می شویم که احتمالا دو کلاس با نام های Configuration و Authentication در داخل پکیج فعلی داریم که از آن ها برای احراز هویت استفاده شده است. با بررسی بیشتر متوجه می شویم که مطابق تصویر زیر، کلاس Authentication.java در مسیر handlers قرار دارد.

با بررسی بیشتر این کلاس روش دقیق احرازهویت توسط این اپلیکیشن کاملا مشخص می شود اما اطلاعات Hardcode شده ای در داخل آن نیست. بنابراین به سراغ پیدا کردن کلاس Configuration.java می رویم که مطابق تصویر زیر در داخل پکیج اصلی و در کنار MainActivity موجود است.

همانطور که در تصویر بالا مشاهده می کنید پسورد و سایر مشخصات استفاده شده در این اپلیکیشن به صورت Hardcode شده در داخل این کلاس وجود دارد و قابل استفاده است. البته این مسئله راه حل آسان تری هم دارد که در قسمت بعدی به آن اشاره خواهیم کرد.

جستجوی رشته در تمامی قسمت های کد

همانطور که قبلا اشاره کردیم یکی از بارزترین ویژگی های Jadx، داشتن قابلیت جستجوی پیشرفته در تمامی قسمت های کد است. همانطور که در تصویر زیر مشاهده می کنید این قابلیت به آسانی با استفاده از علامت ذره بین که با کادر قرمز رنگ مشخص شده است قابل استفاده است.

با زدن این دکمه با کادری مانند تصویر زیر مواجه می شویم که در آن باید عبارتی که می خواهیم جستجو کنیم و همینطور قسمت هایی از کد که باید جستجو در آن ها صورت بگیرد را انتخاب کنیم. برای جستجویی کامل پیشنهاد ما تیک زدن همه گزینه ها در قسمت Search definitions of است. زدن تیک گزینه مربوط به Case Insensitive از قسمت Search Options حساسیت مربوط به بزرگ و کوچک بودن حروف را از بین می برد؛ برای حالتی که نمی دانید یک عبارت به چه شکلی در کد استفاده شده است بهترین گزینه استفاده از این قابلیت است.

حال برای حل چالش پیدا کردن اطلاعات حساس، کافی است عبارت = password را با استفاده از این قابلیت جستجو کنیم. خروجی را در تصویر زیر می توانید مشاهده کنید.

همانطور که در قسمت قرمز رنگ تصویر بالا مشاهده می کنید به آسانی با جستجوی این عبارت ساده توانستیم پسورد Hardcode شده را پیدا کنیم.

قابلیت deobfuscation

این قابلیت در واقع برای زمانی استفاده می شود که در کد از مکانیزم های درهم سازی (Obfuscation) استفاده شده باشد. در این حالت با decompile کردن کد اپلیکیشن، اسامی کلاس ها، توابع، متغیرها و ... بسته به نوع درهم سازی پیاده شده، به اسامی نامفهومی مانند شکل زیر تبدیل می شوند که خوانایی و درک کد را بسیار ضعیف می کند.

در واقع این کد قبل از تبدیل شدن به نمونه Obfuscated مانند تصویر زیر بوده است:

همانطور که در تصویر زیر مشاهده می کنید قسمت مشخص شده با رنگ قرمز که علامت قفل دارد، کار Deobfuscation را در اپلیکیشن jadx انجام می دهد که با فشردن آن تا جایی که امکان داشته باشد تلاش می کند تا کد را ِDeobfuscate کند.

البته توجه داشته باشید که این قابلیت قدرت خیلی بالایی ندارد و در کتابخانه های قوی و پریمیوم معمولا دچار مشکل می شود.

از بهترین نوشته‌های کاربران سکان آکادمی در سکان پلاس


online-support-icon