Skip to content

۲. کار با رجیسترهای CPU (Advanced Context) ​

در معماری ARM (که قلب اندروید است)، آرگومان‌های تابع در رجیسترهای خاصی قرار می‌گیرند.

  • در ARM64: رجیسترهای x0 تا x7 ورودی‌ها هستند.
  • در ARM32: رجیسترهای r0 تا r3 ورودی‌ها هستند.

با استفاده از this.context در فریدا، شما قدرت ابرانسانی پیدا می‌کنید! می‌توانید دقیقا قبل از اجرای یک دستور اسمبلی، مقدار داخل رجیستر را عوض کنید.

سناریو: بایپس چک کردن مقدار حساس در CPU ​

فرض کنید تابعی دارید که یک عدد را چک می‌کند. اگر عدد درون رجیستر x0 برابر ۱ باشد، شما را روت تشخیص می‌دهد. ما در لحظه ورود، x0 را به صفر تبدیل می‌کنیم.

کد فریدا (دستکاری مستقیم رجیستر):

javascript
var funcPtr = Module.findExportByName("libsecure.so", "check_security");

Interceptor.attach(funcPtr, {
    onEnter: function (args) {
        /* دسترسی به رجیسترهای CPU بر اساس معماری دستگاه */        
        /* این کد برای ARM64 است */        
        var x0_value = this.context.x0;
        console.log("[*] Initial X0 value: " + x0_value);

        if (x0_value.toInt32() === 1) {
            /* تغییر مقدار رجیستر در لحظه */            
            this.context.x0 = ptr(0); 
            console.log("[+] X0 register modified to 0 to bypass check.");
        }
    }
});