Reverse Engineering (مهندسی معکوس) — بازسازی منطق و ساختار برنامه موبایل بدون دسترسی به کد منبع. در زمینه Android و iOS این به معنای دیکامپایل فایلهای دودویی DEX/APK و Mach-O/IPA برای استخراج الگوریتمها، کلیدهای رمزنگاری، اندپوینتهای API و منطق کسب و کار است. به گزارش Veracode Security Research (2025), بیش از 60% برنامههای موبایل در top-200 حداقل یک نشانگر دارند که مهندسی معکوس را آسانتر میکند. Reverse Engineering نه تنها برای حملات، بلکه برای حسابرسی امنیتی، تحلیل پتنت و آزمایش نفوذ نیز به کار میرود.
نکات کلیدی
Reverse Engineering (مهندسی معکوس) — رشته تحلیل نرمافزار که به بازسازی ویژگیها، منطق و ساختار برنامه از نمایش دودویی آن میپردازد. برای برنامههای موبایل، اهداف تحلیل فایلهای APK (Android) و IPA (iOS) هستند که شامل کد کامپایلشده، منابع، مانیفستها و گواهیها میباشند. نتیجه مهندسی معکوس — استخراج الگوریتمها، پروتکلها، کلیدهای رمزنگاری، شماتهای API و منطق کسب و کار است.
اهداف مهندسی معکوس به قانونی و غیرقانونی تقسیم میشوند. قانونی: تحلیل بدافزارها برای ایجاد ابزارهای محافظتی، حسابرسی برنامههای خود برای آسیبپذیری، تأمین سازگاری با پروتکلهای بسته، تحلیل پتنت و آموزش. غیرقانونی: سرقت مالکیت فکری، دور زدن محدودیتهای لایسنس، ایجاد کپیهای قفلشکنی و تغییر برنامه برای سرقت دادههای کاربران. به گزارش Google Play Protect (2025)، 78% تغییرات بدافزاری برنامههای بانکی بر اساس APK اصلی که از reverse engineering عبور کرده ایجاد میشوند.
روششناسی مهندسی معکوس شامل دو روش اصلی است: تحلیل استاتیک (بدون اجرای برنامه) و تحلیل دینامیک (در زمان اجرا). هر روش سطح مختلفی از اطلاعات را فراهم میکند. استاتیک — تصویر کامل از کد، اما بدون دادههای زمان اجرا. دینامیک — رفتار واقعی، جریان داده، تماسهای شبکه، اما فقط در چارچوب سناریوی اجرای مشخص. مهندسی معکوس حرفهای همیشه هر دو روش را ترکیب میکند.
تحلیل استاتیک — اولین مرحله مهندسی معکوس است. APK یا IPA اصلی باز میشود و هر جزء به طور جداگانه تحلیل میشود. اهداف اصلی: بایت کد DEX، منابع، مانیفست، کتابخانههای بومی (.so، .dylib) و فرادادهها.
jadx — ابزار اصلی برای تحلیل استاتیک برنامههای Android. آن بایت کد DEX را با حداقل تلفات به کد Java قابل خواندن تبدیل میکند. jadx پشتیبانی میکند: دیکامپایل multidex، شناسایی lambdaها و کلاسهای داخلی Kotlin، خروجی به پروژه Gradle. برای کد مبهم (ProGuard)، jadx کد را با نامهای a، b، c نشان میدهد، اما ساختار کلاسها و ترتیب فراخوانی حفظ میشود. بر اساس آزمایشهای مستقل، jadx حتی با ابهامسازی 85–92% کد را به درستی دیکامپایل میکند.
apktool APK را به کد smali (اسمبلی DEX) دیکد میکند و منابع را به صورت قابل خواندن بازسازی میکند: AndroidManifest.xml از AXML به XML قابل خواندن، layoutها — به نشانه XML، strings.xml — به متن ساده تبدیل میشود. apktool امکان تغییر منابع و بازسازی APK را فراهم میکند. پس از باز کردن از طریق apktool و تعویض منابع، برنامه را میتوان با محتوای تغییر یافته نصب کرد.
Ghidra (NSA) — فریمورک reverse engineering، ضروری برای تحلیل کتابخانههای .so Android و .dylib iOS. Ghidra کد ARM64 را دیاسمبل میکند، شبه کد C را بازسازی میکند و گراف فراخوانی میسازد. برای مهندسی معکوس موبایل، Ghidra برای تحلیل پیادهسازیهای بومی رمزنگاری و مکانیسمهای DRM استفاده میشود. Ghidra از اسکریپتنویسی به Python و Java برای خودکارسازی تحلیل پشتیبانی میکند.
# باز کردن و دیکامپایل APK
$ jadx -d output_dir app.apk
# باز کردن منابع از طریق apktool
$ apktool d app.apk -o app_unpacked
# تحلیل کتابخانه بومی از طریق Ghidra
$ ghidra app.apk/lib/arm64-v8a/libnative.so
# جستجوی ثابتهای رشتهای در DEX
$ strings classes.dex | grep -i api_key
تحلیل دینامیک بر روی برنامه در حال اجرا انجام میشود. تحلیلگر به فرآیند متصل شده و فراخوانیهای توابع، آرگومانها و مقادیر بازگشتی را در زمان واقعی رهگیری میکند.
Frida — ابزار پیشرو تحلیل دینامیک برنامههای موبایل. Frida یک موتور JavaScript را به فرآیند برنامه (Android ART یا iOS app) وارد میکند و امکان رهگیری فراخوانیهای توابع Java/Objective-C و همچنین C/C++ را فراهم میکند. با Frida، مهندسان معکوس میتوانند: تمام فراخوانیهای AES.decrypt() را با پارامترها ثبت کنند، مقدار بازگشتی را به دلخواه تغییر دهند، SSL-pinning را از طریق Universal Android SSL Unpin بردارند، فراخوانیهای بومی را از طریق Stalker ردیابی کنند. Frida بدون تغییر APK/IPA کار میکند که آن را برای آزمایش نفوذ ضروری میکند.
Objection دستورات آماده برای وظایف معمولی مهندسی معکوس بدون نوشتن اسکریپتهای JavaScript فراهم میکند: disable-pinning (غیرفعالسازی SSL pinning)، dump-keychain (iOS)، explore (پیمایش سلسله مراتب کلاسها)، memory search (جستجوی رشتهها در حافظه). Objection امکان انجام تحلیل دینامیک کامل بدون یک خط کد را فراهم میکند. برای برنامههای iOS، Objection به طور خودکار فراخوانیهای NSURLSession، CFNetwork و NSKeyedArchiver را پیدا کرده و ثبت میکند.
Xposed — فریمورکی برای Android که با جایگزینی فایل app_process در Zygote کار میکند. بر خلاف Frida، Xposed پس از نصب به دسترسی root نیاز ندارد. ماژولهای Xposed میتوانند فراخوانی متدها را در هر برنامهای رهگیری کنند. برای مهندسی معکوس، Xposed برای تحلیل بلندمدت مناسب است: ماژول نصب شده و به طور مداوم کار میکند و رفتار برنامه را در سناریوهای مختلف ثبت میکند. Xposed از Android تا نسخه 8.1 پشتیبانی میکند؛ برای Android 9+ از EdXposed مبتنی بر SandHook استفاده میشود.
// Frida: رهگیری متد decrypt() در برنامه
let aesClass = Java.use("javax.crypto.Cipher");
aesClass.doFinal.overload(
"[B", "int", "int"
).implementation = function(
input, offset, len
) {
console("[AES] decrypt called, len=" + len);
return this.doFinal(input, offset, len);
};
جریان کار استاندارد مهندسی معکوس از مراحل پیاپی تشکیل شده است که هر کدام سطح مشخصی از اطلاعات را فراهم میکند.
تحلیلگر APK را در سطح فرادادهها بررسی میکند: targetSdk، uses-permission (چه مجوزهایی مورد نیاز است)، intent-filter و exported components. از روی مجوزها میتوان تعیین کرد کدام APIها استفاده میشوند (android.permission.CAMERA → دوربین، android.permission.RECORD_AUDIO → صدا). از روی exported activity نقاط ورود بدون احراز هویت تعیین میشوند. این مرحله از طریق aapt یا ApkAnalyzer انجام شده و 1–2 دقیقه طول میکشد.
APK باز میشود، classes.dex (یا multidex) به jadx ورود میکند. خروجی — کد Java/Kotlin در بستهها. تحلیلگر به دنبال کلاسهای کلیدی میگردد: CryptoUtils، ApiClient، AuthManager، DatabaseHelper، و بررسی میکند کدام الگوریتمها استفاده شدهاند. اگر در کد رشتههای AES/CBC/PKCS5Padding وجود داشته باشد — برنامه از رمزنگاری استفاده میکند و کلید باید پیدا شود. در این مرحله تعیین میشود: کلیدهای سختنویسیشده، URLهای API، توکنهای OAuth و اسرار. بدون ابهامسازی کل کد برنامه مانند یک پروژه معمولی Java خوانده میشود.
با تنظیم Frida یا Objection برای غیرفعالسازی SSL-pinning، تحلیلگر برنامه را اجرا کرده و ترافیک شبکه را از طریق Burp Suite یا mitmproxy رهگیری میکند. از روی دادههای ترافیک، شمات API بازسازی میشود: چه اندپوینتهایی، چه پارامترهایی، در چه قالبی. در صورت امکان، تحلیلگر درخواستها را تغییر داده و واکنش سرور به دادههای نامناسب یا بدافزاری را بررسی میکند. عدم اعتبارسنجی سمت سرور یک آسیبپذیری مستقیم است که در این مرحله کشف میشود.
نتایج تحلیل به صورت ساختاریافته ثبت میشوند. برای هر مکان آسیبپذیر یافتشده مشخص میشود: کلاس و متد، توضیح آسیبپذیری، بردار بهرهبرداری و توصیه برای رفع. این مجموعه داده به تیم توسعه ارسال شده یا برای تهیه گزارش پنتست استفاده میشود. در محیطهای خودکار (MobSF)، گزارش بر اساس نتایج تحلیل استاتیک و دینامیک به طور خودکار تولید میشود.
Reverse engineering برنامههای iOS به دلیل معماری امنیتی سختتر Apple و عدم دسترسی مستقیم به سیستم فایل در دستگاههای استاندارد از Android سختتر است. برای تحلیل iOS نیاز به jailbreak است.
آرشیو IPA شامل فایل دودویی Mach-O است — فرمت کاربردی جهانی فایلهای قابل اجرای Apple. برای دیکامپایل از Hopper Disassembler یا IDA Pro استفاده میشود. بر خلاف Android DEX که با تلفات کمی به Java دیکامپایل میشود، Mach-O شامل کد بومی ARM64 است که با دقت کمتری به شبه کد C بازسازی میشود. Hopper با 60–70% بازسازی مقابله میکند، بقیه باید در سطح اسمبلی تحلیل شود.
Frida در iOS نیاز به jailbreak و نصب frida-server دارد. پس از اتصال، Frida متدهای Objective-C را از طریق API مسیریابی پیام رهگیری میکند. برای برنامههای iOS سناریوی معمول: رهگیری متدهای NSURLSession.dataTaskWithRequest برای ثبت درخواستهای HTTP، رهگیری NSKeyedUnarchiver برای تحلیل دادههای سریالایز شده و ردیابی درخواستهای CoreData از طریق frida-trace. Frida با انتشار jailbreak Dopamine برای iOS 15–17 در دسترس قرار گرفت.
مهندسی معکوس میتواند شامل تغییر IPA با بستهبندی مجدد و نصب روی دستگاه باشد. ابزارها: ipatool برای باز کردن، MachOView برای مشاهده بخشها و optool برای تزریق کد. پس از تغییر، IPA توسط ldid یا fastlane sigh برای نصب روی دستگاه جیلبریکشده امضا میشود. برای iOS 16+، امضای کد در سطح Secure Enclave بررسی شده و IPA تغییر یافته روی دستگاه غیر جیلبریک اجرا نخواهد شد.
// Frida: رهگیری درخواستهای HTTP در برنامه iOS
if (ObjC.available) {
let NSURLSession = ObjC.classes.NSURLSession;
let dataTaskWithRequest = ObjC.protocol("NSURLSessionDelegate")
.method("- URLSession:dataTask:didReceiveData:");
Interceptor.attach(dataTaskWithRequest.implementation, {
onEnter(args) {
let data = ObjC.Object(args[3]);
console("[HTTP Response]", data.toString());
}
});
}
محافظت در برابر مهندسی معکوس بر اساس اصل امنیت لایهای ساخته شده است: هیچ روشی 100% محافظت نمیکند، اما ترکیب آنها مهندسی معکوس را از نظر اقتصادی نامقرون به صرفه میکند.
سطح پایه — ProGuard برای Android که نام کلاسها و متدها را با یک حرف جایگزین میکند. برای تقویت از DexGuard استفاده میشود که overload induction (چندین متد با امضاهای مختلف و یک نام) و رمزنگاری رشته AES-256 را اضافه میکند. ابهامسازی زمان تحلیل کد را از 5 دقیقه به 5–20 ساعت بستگی به سطح افزایش میدهد. DexGuard به طور اضافه جریان کنترل را مبهم کرده و کد را برای jadx ناخوانا میکند.
همه ثابتهای رشتهای — URLها، کلیدها، توکنها، پرسوجوهای SQL — در مرحله ساخت رمزنگاری شده و در runtime رمزگشایی میشوند. این از تحلیل استاتیک رشتههای فایل DEX محافظت میکند. مهاجمی که strings app.apk را اجرا کند، هیچ اندپوینت API نخواهد دید. حتی پس از دیکامپایل نیز همه رشتهها مانند دادههای دودویی به نظر میرسند. برای هر رشته میتوان از یک کلید جداگانه استفاده کرد که ابهامزدایی را سختتر میکند.
عامل RASP داخل برنامه Frida و اشکالزدایی را در runtime کشف میکند. کنترل یکپارچگی از طریق هش SHA-256 APK از اجرای نسخه تغییر یافته برنامه جلوگیری میکند. اگر هش APK با نمونه مرجع (ذخیره شده در لایه بومی) مطابقت نداشته باشد — برنامه خاتمه مییابد. این حملات مبتنی بر تغییر APK از جمله repackaging را مسدود میکند.
منطق کسب و کار بحرانی باید روی سرور اجرا شود نه روی کلاینت. حتی اگر مهاجم برنامه را کاملاً دیکامپایل کند، کد سرور غیرقابل دسترس باقی میماند. اعتبارسنجی همه درخواستها و پارامترها در سمت سرور از بهرهبرداری آسیبپذیریهای یافت شده در مهندسی معکوس جلوگیری میکند. تأیید سمت سرور از طریق Play Integrity API یا App Attest تأیید میکند که درخواست از برنامه اصلی و بدون تغییر میآید.
سوالات متداول
در آمریکا، reverse engineering توسط DMCA تنظیم میشود — برای سازگاری، آزمایش امنیت و اهداف بایگانی مجاز است. دور زدن تدابیر فنی حفاظت (DRM) ممنوع است. در اروپا، ماده 6 EUCD مشابه DMCA است. در روسیه، reverse engineering بدون رضایت صاحب حقوق مؤلف میتواند به عنوان نقض حقوق مؤلف تفسیر شود. مشورت حقوقی قبل از مهندسی معکوس تجاری الزامی است.
خیر. هر کدی که روی دستگاه مهاجم اجرا شود میتواند تحلیل شود — این یک محدودیت اصلی مدل حفاظت سمت کلاینت است. هدف حفاظت عبارت است از ایجاد شرایطی که مهندسی معکوس از نظر اقتصادی بیصرفه باشد: هزینههای زمان و منابع باید از ارزش نتیجه بهدستآمده بیشتر باشد. ترکیب ابهامسازی، RASP و منطق سرور استاندارد فعلی حفاظت است.
Repackaging — تغییر برنامه از طریق reverse engineering با بستهبندی مجدد APK. مهاجم APK را از طریق apktool باز کرده، کد بدافزاری اضافه کرده یا کلیدهای API را تغییر میدهد، دوباره میسازد و با گواهی خود امضا میکند. Repackaging به گزارش Kaspersky Threat Report (2025)، 86% تمامی حملات روی Android را تشکیل میدهد. اقدام متقابل: بررسی امضای دیجیتال در runtime.
اسکریپت Universal Android SSL Unpin Frida فراخوانیهای TrustManager.checkServerTrusted و در iOS ServerTrustManager را رهگیری کرده و پیادهسازی را با allow-all جایگزین میکند. همچنین رهگیری متدهای X509TrustManager در OkHttp و URLConnection استفاده میشود. SSL-pinning روی Frida با یک اسکریپت آماده در 10 ثانیه دور زده میشود. حفاظت مقاومتر — certificate transparency از طریق بررسی گواهی در سمت سرور.
کد بومی C/C++ در کتابخانههای .so/.dylib بسیار دشوارتر از Java در DEX مهندسی معکوس میشود. Swift با PGO و کامپایل Osize فایل دودویی پیچیدهتری نسبت به Objective-C تولید میکند. Rust بدون فرادادههای runtime و بدون پیوند استاندارد Objective-C به کد بومی کامپایل میشود که آن را دشوارترین زبان برای مهندسی معکوس در میان زبانهای مدرن توسعه موبایل میسازد.
نتایج
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید