۴. سناریو عملی: تغییر نتیجه (خداحافظی با امنیت)
فرض کنید اپلیکیشن یک تابع 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) را بازنویسی میکند.