حسام حداد

در مورد برنامه نویسی ، الگوریتم نویسی ، نکات ترفند ها

حسام حداد

در مورد برنامه نویسی ، الگوریتم نویسی ، نکات ترفند ها

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

آخرین نظرات
  • ۱۸ آبان ۹۵، ۱۲:۵۱ - سامان
    ای ول

مهندسی معکوس APK مبتنی بر SDK آندروید

دوشنبه, ۲۳ شهریور ۱۳۹۴، ۰۱:۵۷ ب.ظ

مقدمه

چند مدت پیش تصمیم گرفتم که جدا از معرفی و آموزش مربوط به برنامه نویسی رقابتی مطالب دیگری در رابطه با برنامه نویسی یا کارهای سیستمی در وبلاگ منتشر کنم و بعد از مشورت با دوستان در این کار مصمم تر شدم. این مقاله مربوط به مهندسی معکوس کردن APK یا خروجی نهایی برنامه آندروید به Source Code جاوا هست.
البته این روش روی استفاده از NDK برای ساخت APK که اغلب توسط Engine های بازی سازی استفاده می شود جوابگو نیست. برای مهندسی معکوس دو مرحله استخراج فایل Jar و مهندسی معکوس فایل Jar رو باید پشت سر بگذاریم.

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

مهندسی معکوس چیست؟

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

جنبه اخلاقی و شرایط استفاده

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

یک استفاده مفید مهندسی معکوس نرم افزار برای ایده گرفتن از برنامه های مطرح جهانی و درک چگونگی کارکرد آن برنامه هاست، همچنین استفاده مفید تر بررسی عملکرد یک نرم افزار هست. گاهی شنیده میشود که نرم افزاری از شما جاسوسی کرده یا اطلاعات شخصی کاربر را دزدی می کند. راه حل ساده ای برای مطمئن شدن وجود دارد. پس از مهندسی معکوس، Class های مشکوک برنامه را میتوان بررسی کرد. اگر کاربری مشکوک و مخربی در برنامه پیدا شد خیلی ساده با دلیل و مدرک قابل استناد میتوانید به دوستان یا App Store های ایرانی گزارش بدهید.


شروع کار با APK

همانطور که گفته شد شروع کار با یک خروجی قابل نصب APK است، نگذارید که این پسوند عجیب و غریب شما را فریب دهد، APK چیزی جز یک فایل Zip ساده نیست. با Rename کردن پسوند فایل به Zip میتوانید محتویات برنامه را مشاهده کنید. پوشه assets و پوشه res بنظر شما آشنا نیست؟ بله عکس ها و فایل های برنامه به صورت رمز نشده ای در این فایل زیپ قابل مشاهده هست اما برای کد های برنامه قضیه به این سادگی نیست. کد های Java در یک فایل به اسم classes.dex ذخیره شده اند.


فایل Dex چیست؟
فایل های Dex یا (Dalvik Executable) فایل های کامپایل شده برنامه های Android هستند، که از Dalvik Runtime یا Android Runtime برای اجرا شدن استفاده می کند.


تبدیل Dex به Jar

برای اینکار از یک ابزار به اسم Dex2Jar استفاده میکنیم که تنها از طریق Command Line در دسترس قرار دارد. ابزار Dex2Jar را میتوانید از SourceForge دانلود کنید. لینک
خود این برنامه به زبان جاوا نوشته شده و در سیستم عامل های مختلف با نصب Java Runtime قابل استفاده است. برای استفاده از این نرم افزار هم میتوانید فایل APK را به پوشه اصلی نرم افزار اضافه کنید و دستورات را اجرا کنید و هم میتوانید به %PATH% در Environment Variable های ویندوز آدرس فایل های اجرایی این نرم افزار را اضافه کنید. برای ساده تر شدن روش اول را انتخاب میکنیم.

برای مثال و تکمیل آموزش مهندسی معکوس APK نرم افزار Telegram را انتخاب میکنیم، البته همانطور که میدانید Telegram یک نرم افزار Open Source بوده و نیازی به مهندسی معکوس برای بدست آوردن Source نرم افزار نمیباشد.

نسخه ای از تلگرام با اسم Telegram.apk را برای مهندسی معکوس به پوشه اصلی ابزار Dex2Jar منتقل میکنیم یعنی همان پوشه ای که فایل اجرایی d2j-jar2dex.bat وجود دارد.

با مراجعه به Run و تایپ CMD در ویندوز Command Prompt را اجرا میکنیم. و با استفاده از دستور CD در این مرحله Directory فعال را به پوشه اصلی ابزار Dex2Jar تغییر میدهیم.

با استفاده از دستور زیر فایل jar را به سادگی از APK استخراج میکنیم.

d2j-dex2jar -f -o Telegram.jar Telegram.apk

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


مشاهده و تغییر فایل Jar
برای مشاهده فایل Jar میتوانید از Java Decompiler و برای تغییر در فایل Jar میتوانید از Java Bytecode Editor یا dirtyJOE استفاده کنید. این سه ابزار دارای رابط کاربری گرافیکی ساده ای میباشند.
همچنین یک نکته دیگر اینکه خود فایل Jar نیز یک فایل Zip ساده است که در آن تک تک Class ها به صورت فایل .Class وجود دارد. میتوان با Bytecode Editor های معرفی شده تک تک این .Class ها را تغییر داد.
روش کلی تر دیگر استفاده از ابزار d2j-jar2jasmin و سپس استفاده از دستور d2j-jasmin2jar میباشد که به شکل زیر امکان پذیر است.

d2j-jar2jasmin -f -o telegram_folder telegram.jar

استخراج فایل jar به صورت فایل های Jasmin در پوشه telegram_folder

d2j-jasmin2jar -f -o telegram.jar telegram_folder/

ساخت فایل jar از فایل های Jasmin موجود در پوشه telegram_folder

البته استفاده کلی از Jasmin به علت Decompile نشدن برخی اجزا و ساخته نشدن یک فایل Jar کامل از پوشه توصیه نمیشود. همانطور که می بینید تغییر در برنامه به سادگی مشاهده Source ها در Java Decompiler نیست.

تبدیل Jar به Dex
با فرمان زیر میتوانید از فایل telegram.jar یک فایل Dex بسازید.

d2j-jar2dex -f -o classes.dex telegram.jar

بروزرسانی و Sign کردن Apk
برای این کار به سادگی با تغییر نام telegram.apk به telegram.zip میتوانیم این پکیج را با classes.dex بروز رسانی کنیم، و در پایان برای Sign کردن Apk بعد از بازگرداندن پسوند از Zip به Apk از دستور زیر استفاده میکنیم.

d2j-apk-sign -f -o telgram_singed.apk telegram.apk

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


بعلت تغییر اجزا اشتباهی ممکن است در اجرای برنامه با Force Close روبرو شوید، و باید با بررسی دقیق تر عامل این مشکل را پیدا کنید.

اگر مشکلی برای انجام مراحل بالا داشتید در بخش نظرات مطرح نمایید.


  • موافقین ۲ مخالفین ۰
  • ۹۴/۰۶/۲۳
  • ۳۸۰۵ نمایش
  • حسام حداد

Android

Java

Reverse Engineering

اندروید

جاوا

مهندسی معکوس

نظرات (۵)

سلام.
خیلی عالی توضیح دادین . من تا حالا چندین بار تلاش کرده بودم یه نرم‌افزار رو باز کنم و تغییراتی داخلش بدم ولی نشد...
باید این روش رو تست کنم.
یه سوال اینکه بعد از باز کردن برنامه هر تغییری بخوایم میشه داخلش داد یا فقط تغییرات محدود و جزیی قابل اعمال هست؟
پاسخ:
سلام
متشکرم از اینکه سر زدید

تغییرات باید به جای Source جاوا در Byte Code صورت بگیره که کار رو برای تغییرات بزرگ سخت تر میکنه،
هر کد یکسری وابستگی های داره و برای مثال اگه شما تنها با اسم یک کلاس یک شی از کلاس میسازید جزئیات خیلی بیشتری در فایل .class خیره میشه، یه استراتژی خوب برای تغییرات عمده میتونه ساخت فایل  .class از روی فایل Java و بعد ایجاد تغییرات در Byte Code فایل ایجاد شده جهت هماهنگی با بقییه اجزا پروژه باشه.
همچنین میشه با یکم بازنویسی و خوندن کلاس ها از Java Decompiler سورس واقعی رو ایجاد کرد که برای تغییرات بعدی ساده تر باشه.
سلام
باتشکر از شما بابت این پست بسیار مفیدتون واقعا بهم کمک کرد
فقط چه جوری میشه فایل های جاوا رو به class تبدیل کرد؟
پاسخ:
سلام خدمت شما

میتونید با دستور javac اینکار رو انجام بدید، ولی چالش اصلی ای که وجود داره اینه که تمام Dependency هاش هم باید وجود داشته باشن و این یکم مشکل سازه.

بعدش باید با تغییرات توی Byte Code با باقی فایل های .class هماهنگ بشه.

سلام
مطلب بسیار عالی و مفیدی بود برای من دستتون درد نکنه

یک سوال دارم اگه لطف کنید و راهنمایی کنید ممنون خواهم بود
من قصد ویرایش یک فایل apk رو دارم و طبق مراحل زیر اقدام کردم:
1- فایل apk را با برنامه winrar باز کرده و classes.dex را برداشتم
2- فایل dex را با برنامه AndroChef Java Decompiler به فایل jar تبدیل کردم
3- فایل jar را با winrar باز کردم که داخل آن تعدادی فولدر و داخل هر فولدر فایل هایی با پسوند java بود
4- فایل xxxx.java مورد نظر را پیدا و ویرایش کردم و دوباره از طریق برنامه winrar داخل فایل jar قرار دادم

حالا نمیدونم چطوری این فایل ویرایش شده jar را دوباره به dex تبدیل کنم
از برنامه ی DJ Java Decompiler هم برای کامپایل و ویرایش فایل jar استفاده کردم ولی برای کامپایل دوباره 5-6 تا باکس دارد که باید آدرس دهی کنم که متوجه نشدم و اینکه در باکس آدرس سورس، نام تک تک فایل ها را می خواهد و امکان انتخاب فولدر نیست!!!!

تلاش کردم از فایل های apktool-2.2 و smali-2.2 و baksmali-2.2 هم استفاده کنم که اینها هم هنگام اجرا خطا میدن مانند زیر
Exception in thread "main" com.beust.jcommander.MissingCommandException: Expected a command, got azz.folder
        at com.beust.jcommander.JCommander.parseValues(JCommander.java:783)
        at com.beust.jcommander.JCommander.parse(JCommander.java:282)
        at com.beust.jcommander.JCommander.parse(JCommander.java:265)
        at org.jf.smali.Main.main(Main.java:87)


لطفا درصورت امکان راهنمایی کنید.
پاسخ:
سلام خدمت شما
ممنون از اینکه سر زدید

تبدیل فایل jar به Dex و امضا کردن فایل Dex از طریقی که در دو بخش پایانی گفته شد امکان پذیر هست. فقط در هنگام تغییرات به موضوعی که توی کامنت های قبلی بهش اشاره شد هم توجه کنید.
ای ول
سلام. عملیات مهندسی معکوس برای همه ی فایل های apk  قابل اجرا هست یا فقط باید open Source باشه
پاسخ:
سلام

اگر Open Source باشه که دیگه نیاز به مهندسی معکوس نداریم و خود سورس رو داریم، کلا مهندسی معکوس همیشه قابل اجراست فقط میزان دشواری‌اش هست که کم و زیاد میشه، همونطور که در بالا هم ذکر شد این روش برای APK هایی که از SDK استفاده کرده و در Java به صورت Native نوشته می‌شوند قابل استفاده است. که اکثر برنامه‌های موجود در حال حاضر از این دسته هستند.
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی