Skip to content

۲. کنترل از راه دور: RPC (Remote Procedure Call) ​

این قابلیت "Game Changer" است. با RPC، شما می‌توانید توابع داخل اسکریپت جاوا اسکریپت را طوری تعریف کنید که انگار توابع معمولی گولنگ هستند! یعنی از داخل کد Go، تابعی را در دل اپلیکیشن اندروید صدا می‌زنید و منتظر نتیجه می‌مانید.

کاربردها:

  • ساخت API برای اپلیکیشن موبایل.
  • تست فازینگ (Fuzzing) توابع خاص.
  • اجرای توابع رمزنگاری اپلیکیشن روی داده‌های خودتان.

قانون نام‌گذاری

در rpc.exports نباید از حروف بزرگ (Uppercase) یا کاراکترهای خاص استفاده کنید (یا حداقل فاصله نگذارید). بهتر است نام توابع camelCase باشد.

کد جاوا اسکریپت (تعریف RPC):

javascript
/* توابعی که اینجا اکسپورت شوند، از بیرون قابل صدا زدن هستند */
rpc.exports = {
    /* تابع جمع ساده برای تست */    
    addNumbers: function (a, b) {
        return a + b
    },

    /* تابع کاربردی: جستجو در حافظه */    
    scanMemory: function (pattern) {
        var results = []
        Memory.scanSync(Module.findBaseAddress("libc.so"), 1024*1024, pattern).forEach(function (match) {
            results.push(match.address)
        })
        return results
    },
    
    /* فراخوانی متد جاوا از طریق RPC */    
    dumpUserInfo: function () {
        var result = ""
        Java.perform(function() {
            var User = Java.use("com.example.app.User")
            result = User.getCurrentUser().toString()
        })
        return result
    }
}

کد گولنگ (فراخوانی RPC):

go
package main

import (
	"fmt"
	"github.com/frida/frida-go/frida"
)

func main() {
	dev := frida.USBDevice()
	session, _ := dev.Attach("com.example.app", nil)
	
    /* اسکریپت JS که rpc.exports دارد را اینجا لود کنید */    
	script, _ := session.CreateScript(jsCodeWithRpc)
	script.Load()

    /* دسترسی به آبجکت RpcExports */    
    /* توجه: نحوه فراخوانی بسته به لایبرری Go متفاوت است */    
    /* اما منطق کلی به این صورت است: */    
    
    /* 1. فراخوانی تابع ساده */    
    /* Call "addNumbers" with args [10, 20] */    
    result, _ := script.ExportsCall("addNumbers", 10, 20)
    fmt.Printf("[RPC] 10 + 20 = %v\n", result)

    /* 2. فراخوانی تابع جاوا */    
    userInfo, _ := script.ExportsCall("dumpUserInfo")
    fmt.Printf("[RPC] User Info from App: %v\n", userInfo)
}