From db14c56fc5893c9d1ec35df026ec5bea37687985 Mon Sep 17 00:00:00 2001 From: xoffio Date: Thu, 26 Mar 2026 22:01:44 -0400 Subject: [PATCH] Fixed receiving "send" messages - Fixed receiving "send" messages - Updated examples --- examples/core/console_log/src/main.rs | 5 +- examples/core/list_exports/README.md | 12 +++-- examples/core/list_exports/src/main.rs | 18 ++++++- examples/core/rpc_execute_function/README.md | 10 ++-- .../core/rpc_execute_function/src/main.rs | 5 +- frida/src/script.rs | 49 ++++++++++--------- 6 files changed, 61 insertions(+), 38 deletions(-) diff --git a/examples/core/console_log/src/main.rs b/examples/core/console_log/src/main.rs index eb46f3dc..2fe6dfb4 100644 --- a/examples/core/console_log/src/main.rs +++ b/examples/core/console_log/src/main.rs @@ -47,6 +47,9 @@ struct Handler; impl ScriptHandler for Handler { fn on_message(&mut self, message: frida::Message, _data: Option>) { - println!("{:?}", message); + match message { + frida::Message::Log(msg) => println!("[*] {:?}: {:?}", msg.level, msg.payload), + _ => println!("{:?}", message), + } } } diff --git a/examples/core/list_exports/README.md b/examples/core/list_exports/README.md index 342f5ca7..a5b172e1 100644 --- a/examples/core/list_exports/README.md +++ b/examples/core/list_exports/README.md @@ -2,12 +2,14 @@ Example to showing how to use `script.list_exports()`. Once ran you should expect an output similar to the next one: ``` -[*] Frida version: 16.4.8 +[*] Frida version: 17.5.1 [*] Device name: Local System -- Log(MessageLog { level: Info, payload: "Logging message from JS" }) -- Log(MessageLog { level: Warning, payload: "Warning message from JS" }) -- Log(MessageLog { level: Debug, payload: "Debug message from JS" }) -- Log(MessageLog { level: Error, payload: "Error message from JS" }) +[*] Info: "Logging message from JS" +[*] Warning: "Warning message from JS" +[*] Debug: "Debug message from JS" +[*] Error: "Error message from JS" +[*] Send: String("Send message from JS") +[*] Send: String("Send message with data"), Data: [1, 2, 3] [*] Script loaded. ["increment", "getvalue"] ["increment", "getvalue"] diff --git a/examples/core/list_exports/src/main.rs b/examples/core/list_exports/src/main.rs index cfbebc7a..253e9bf3 100644 --- a/examples/core/list_exports/src/main.rs +++ b/examples/core/list_exports/src/main.rs @@ -26,6 +26,10 @@ fn main() { console.warn("Warning message from JS"); console.debug("Debug message from JS"); console.error("Error message from JS"); + send("Send message from JS"); + + let send_data = [1, 2 ,3]; + send("Send message with data", send_data); rpc.exports = { increment: function() { @@ -74,7 +78,17 @@ fn main() { struct Handler; impl frida::ScriptHandler for Handler { - fn on_message(&mut self, message: Message, _data: Option>) { - println!("- {:?}", message); + fn on_message(&mut self, message: Message, data: Option>) { + match message { + Message::Log(msg) => println!("[*] {:?}: {:?}", msg.level, msg.payload), + Message::Send(msg) => { + if let Some(data) = data { + println!("[*] Send: {:?}, Data: {:?}", msg.payload, data); + } else { + println!("[*] Send: {:?}", msg.payload); + } + } + _ => println!("- {:?}", message), + } } } diff --git a/examples/core/rpc_execute_function/README.md b/examples/core/rpc_execute_function/README.md index f6aecfd7..fb22d2cd 100644 --- a/examples/core/rpc_execute_function/README.md +++ b/examples/core/rpc_execute_function/README.md @@ -2,16 +2,16 @@ Example to showing how to execute a JavaScript Frida function from Rust using `s Once ran you should expect an output similar to the next one: ``` -[*] Frida version: 16.4.8 +[*] Frida version: 17.5.1 [*] Device name: Local System [*] Script loaded. ["increment", "nIncrement", "getValue", "sumVals", "bye"] -- Log(MessageLog { level: Info, payload: "globalVar incremented by 1" }) -- Log(MessageLog { level: Info, payload: "globalVar incremented by 2" }) +[*] Info: "globalVar incremented by 1" +[*] Info: "globalVar incremented by 2" js_global_var: 3 -- Log(MessageLog { level: Info, payload: "Bye Potato" }) +[*] Info: "Bye Potato" total: 10 -This is an error from JS: Error on the JavaScript side: "unable to find method 'NonExistentFunc'" +This is an error from JS: Error on the JavaScript side: unable to find method 'NonExistentFunc' [*] Script unloaded [*] Session detached Exiting... diff --git a/examples/core/rpc_execute_function/src/main.rs b/examples/core/rpc_execute_function/src/main.rs index 4388ccab..c3ddc5a9 100644 --- a/examples/core/rpc_execute_function/src/main.rs +++ b/examples/core/rpc_execute_function/src/main.rs @@ -112,6 +112,9 @@ struct Handler; impl frida::ScriptHandler for Handler { fn on_message(&mut self, message: Message, _data: Option>) { - println!("- {:?}", message); + match message { + frida::Message::Log(msg) => println!("[*] {:?}: {:?}", msg.level, msg.payload), + _ => println!("{:?}", message), + } } } diff --git a/frida/src/script.rs b/frida/src/script.rs index fcaec2da..96a1f768 100644 --- a/frida/src/script.rs +++ b/frida/src/script.rs @@ -37,7 +37,7 @@ pub enum Message { #[derive(Deserialize, Debug)] pub struct MessageSend { /// Payload of a Send Message. - pub payload: SendPayload, + pub payload: Value, } /// Log Message. @@ -81,19 +81,6 @@ pub enum MessageLogLevel { Error, } -/// Represents a MessageSend's payload. -#[derive(Deserialize, Debug)] -pub struct SendPayload { - /// Send message type - pub r#type: String, - /// Send message ID - pub id: usize, - /// Send message result. - pub result: String, - /// Send message returns. - pub returns: Value, -} - unsafe extern "C" fn call_on_message( _script_ptr: *mut _FridaScript, message: *const i8, @@ -112,7 +99,9 @@ unsafe extern "C" fn call_on_message( }); match formatted_msg { - Message::Send(ref msg) if msg.payload.r#type == "frida:rpc" => { + Message::Send(ref msg) + if msg.payload.get(0).and_then(|v| v.as_str()) == Some("frida:rpc") => + { let callback_handler: *mut CallbackHandler = user_data as _; on_message(callback_handler.as_mut().unwrap(), formatted_msg); } @@ -313,12 +302,14 @@ impl<'a> Script<'a> { Message::Send(r) => { let tmp_list: Vec = r .payload - .returns - .as_array() - .unwrap_or(&Vec::new()) - .iter() - .map(|i| i.as_str().unwrap_or("").to_string()) - .collect(); + .get(3) + .and_then(|v| v.as_array()) + .map(|arr| { + arr.iter() + .map(|i| i.as_str().unwrap_or("").to_string()) + .collect::>() + }) + .unwrap_or_default(); tmp_list } @@ -359,15 +350,25 @@ impl Exports<'_> { match rpc_result { Message::Send(r) => { - if r.payload.result == "ok" { - let returns = r.payload.returns; + if r.payload.get(2).and_then(|v| v.as_str()) == Some("ok") { + let returns = match r.payload.get(3) { + Some(v) => v.clone(), + None => return Err(Error::RpcUnexpectedMessage), + }; match returns { Value::Null => Ok(None), _ => Ok(Some(returns)), } } else { - let err_msg = r.payload.returns.to_string(); + let err_msg = r + .payload + .get(3) + .and_then(|v| v.as_str()) + .unwrap_or( + "RPC call failed. Result is not ok and no error message provided.", + ) + .to_string(); Err(Error::RpcJsError { message: err_msg }) } }