۳. مدیریت دادههای باینری (Binary Blobs)
تابع send به طور پیشفرض دادهها را به JSON تبدیل میکند. این کار برای متن عالی است، اما اگر بخواهید یک عکس، یک فایل .so یا چند مگابایت از حافظه را بفرستید، تبدیل آن به JSON (و Base64) بسیار کند است و حافظه زیادی مصرف میکند.
برای ارسال دیتای خام (Raw)، باید آرگومان دوم send را پر کنید. این آرگومان باید از نوع ArrayBuffer یا آرایهای از بایتها باشد.
کد جاوا اسکریپت (ارسال بافر خام):
javascript
Java.perform(function () {
/* سناریو: دامپ کردن 1 مگابایت از حافظه یک کتابخانه */
var libBase = Module.findBaseAddress("libnative-lib.so")
if (libBase) {
/* خواندن حافظه به صورت بافر (Raw Bytes) */
var memoryDump = libBase.readByteArray(1024 * 1024) // 1MB
console.log("[*] Sending 1MB memory dump...")
/* آرگومان اول: متادیتای JSON */
/* آرگومان دوم: دیتای باینری خام */
send({
type: "dump",
filename: "libnative_dump.bin"
}, memoryDump)
}
})در سمت Golang، وقتی پیامی حاوی دیتای خام باشد، تابع هندلر message آن را به عنوان ورودی دوم دریافت میکند. شما میتوانید این بایتها را مستقیما در یک فایل ذخیره کنید.
کد گولنگ (دریافت و ذخیره فایل):
go
/* در تابع main و تنظیم هندلر: */
/* هندلر message در بسیاری از کتابخانههای Go دو خروجی دارد: پیام متنی و دیتای باینری */
script.On("message", func(message string, data []byte) {
/* اگر data خالی نباشد، یعنی پیام حاوی باینری است */
if data != nil {
fmt.Printf("[GO] Binary data received! Size: %d bytes\n", len(data))
/* ذخیره مستقیم بایتها در فایل */
err := os.WriteFile("dumped_file.bin", data, 0644)
if err != nil {
fmt.Println("Error saving file:", err)
} else {
fmt.Println("[+] File saved successfully.")
}
} else {
/* پیام معمولی JSON */
fmt.Println("[GO] Text message:", message)
}
})نتیجه
با این روش میتوانید فایلهای چند مگابایتی را در کسری از ثانیه از دل اپلیکیشن بیرون بکشید، بدون اینکه برنامه لگ بزند یا کرش کند.