Skip to content

۴. سناریو عملی: تغییر نتیجه (خداحافظی با امنیت) ​

فرض کنید اپلیکیشن یک تابع Native دارد به نام isDeviceRooted که اگر روت باشید 1 (True) و اگر نباشید 0 (False) برمی‌گرداند. ما می‌خواهیم حتی اگر گوشی روت است، این تابع همیشه 0 برگرداند.

برای این کار در onLeave، مقدار retval را تغییر می‌دهیم.

کد فریدا (تغییر خروجی Native):

javascript
/* فرض کنید آدرس تابع چک کننده روت را پیدا کرده‌ایم */
var checkRootPtr = Module.findExportByName("libnative-security.so", "isRooted")

if (checkRootPtr) {
    Interceptor.attach(checkRootPtr, {
        onEnter: function (args) {
            console.log("[*] Checking for root access...")
        },
        onLeave: function (retval) {
            console.log("[*] Original Result: " + retval)
            
            /* تغییر مقدار بازگشتی به 0 (False) */            
            /* مهم نیست تابع چه چیزی فهمیده، ما می‌گوییم "نه" */            
            retval.replace(0)
            
            console.log("[+] Hacked Result: 0 (Clean)")
        }
    })
} else {
    console.log("[-] Function not found (Library might not be loaded yet)")
}

نکته حرفه‌ای

دستور retval.replace(0) تمیزترین روش برای تغییر خروجی است. این دستور مقدار رجیستر CPU که مسئول نگهداری خروجی است (مثل RAX یا R0) را بازنویسی می‌کند.