Changes to be committed:
Some checks failed
gitea/Frida-android-native/pipeline/head There was a failure building this commit

modified:   Cargo.lock
	modified:   Cargo.toml
	modified:   src/client.rs
	modified:   src/main.rs
	modified:   src/mobile.rs
This commit is contained in:
Michael Wain 2024-10-12 04:11:28 +03:00
parent f143112ea7
commit 512f6c8b8f
5 changed files with 49 additions and 105 deletions

7
Cargo.lock generated
View File

@ -641,12 +641,6 @@ dependencies = [
"pin-project-lite", "pin-project-lite",
] ]
[[package]]
name = "fast32"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27ea9bdb2356e5a92403cf23ac493f9b43bd71e4ffd0f800862b841dd723994c"
[[package]] [[package]]
name = "fastrand" name = "fastrand"
version = "2.1.1" version = "2.1.1"
@ -688,7 +682,6 @@ dependencies = [
"clap", "clap",
"console-subscriber", "console-subscriber",
"crossbeam-channel", "crossbeam-channel",
"fast32",
"futures", "futures",
"generic-array", "generic-array",
"hex", "hex",

View File

@ -41,4 +41,3 @@ jni = "^0.20"
robusta_jni = "0.2.2" robusta_jni = "0.2.2"
android_logger = "0.14.1" android_logger = "0.14.1"
nonblock = "0.2.0" nonblock = "0.2.0"
fast32 = "1.0.2"

View File

@ -23,7 +23,7 @@ use network_interface::NetworkInterfaceConfig;
use robusta_jni::jni::JNIEnv; use robusta_jni::jni::JNIEnv;
use crate::jni::FridaLib; use crate::jni::FridaLib;
pub async fn client_mode(client_config: ClientConfiguration, fd: i32, env: &JNIEnv<'_>) { pub async fn client_mode(client_config: ClientConfiguration, fd: i32, env: &JNIEnv<'_>, close_token: CancellationToken) {
let (ltx, lrx) = unbounded::<Vec<u8>>(); let (ltx, lrx) = unbounded::<Vec<u8>>();
ltx.send("Starting client...".as_bytes().to_vec()); ltx.send("Starting client...".as_bytes().to_vec());
@ -46,7 +46,7 @@ pub async fn client_mode(client_config: ClientConfiguration, fd: i32, env: &JNIE
let cipher_shared: Arc<Mutex<Option<x25519_dalek::SharedSecret>>> = Arc::new(Mutex::new(None)); let cipher_shared: Arc<Mutex<Option<x25519_dalek::SharedSecret>>> = Arc::new(Mutex::new(None));
let llltx = ltx.clone(); let llltx = ltx.clone();
tokio::spawn(async move { let dev_read_task = tokio::spawn(async move {
let mut buf = vec![0; 1400]; // mtu let mut buf = vec![0; 1400]; // mtu
loop { loop {
if let Ok(n) = dev_reader.read(&mut buf).await { if let Ok(n) = dev_reader.read(&mut buf).await {
@ -60,7 +60,7 @@ pub async fn client_mode(client_config: ClientConfiguration, fd: i32, env: &JNIE
let cipher_shared_clone = cipher_shared.clone(); let cipher_shared_clone = cipher_shared.clone();
let sr_ltx = ltx.clone(); let sr_ltx = ltx.clone();
tokio::spawn(async move { let sock_read_task = tokio::spawn(async move {
let mut buf = vec![0; 4096]; let mut buf = vec![0; 4096];
loop { loop {
@ -118,6 +118,11 @@ pub async fn client_mode(client_config: ClientConfiguration, fd: i32, env: &JNIE
let s_cipher = cipher_shared.clone(); let s_cipher = cipher_shared.clone();
loop { loop {
if close_token.is_cancelled() {
sock_read_task.abort();
dev_read_task.abort();
return;
}
if let Ok(bytes) = rx.try_recv() { if let Ok(bytes) = rx.try_recv() {
ltx.send("Write to tun.".as_bytes().to_vec()); ltx.send("Write to tun.".as_bytes().to_vec());
if let Err(e) = dev_writer.write_all(&bytes).await { if let Err(e) = dev_writer.write_all(&bytes).await {
@ -152,6 +157,4 @@ pub async fn client_mode(client_config: ClientConfiguration, fd: i32, env: &JNIE
} }
//ltx.send("We've got there!".as_bytes().to_vec()); //ltx.send("We've got there!".as_bytes().to_vec());
} }
} }

View File

@ -23,32 +23,7 @@ mod client;
mod udp; mod udp;
mod mobile; mod mobile;
/* static TUN_QUIT: tokio::sync::Mutex<Option<tokio_util::sync::CancellationToken>> = tokio::sync::Mutex::new(None);
#[no_mangle]
pub unsafe extern "C" fn Java_com_alterdekim_frida_FridaLib_run(
mut env: JNIEnv,
_clazz: JClass,
config_b32: JString,
tun_fd: jint,
close_fd_on_drop: jboolean,
) -> jint {
let config = env.get_string(config_b32).unwrap().into();
let close_fd_on_drop = close_fd_on_drop != 0;
mobile::mobile_run(config, close_fd_on_drop, tun_fd)
}
#[no_mangle]
pub unsafe extern "C" fn Java_com_alterdekim_frida_FridaLib_fetchLogs(
mut env: JNIEnv,
_clazz: JClass
) -> jstring {
**env.new_string(String::from_utf8_lossy(&simple_log::fetch_logs()[..]).to_string()).unwrap()
}
#[no_mangle]
pub unsafe extern "C" fn Java_com_alterdekim_frida_FridaLib_stop(_env: JNIEnv, _: JClass) -> jint {
mobile::mobile_stop()
}*/
#[bridge] #[bridge]
mod jni { mod jni {
@ -73,15 +48,48 @@ mod jni {
pub extern "jni" fn start(self, env: &JNIEnv, config_b32: String, pub extern "jni" fn start(self, env: &JNIEnv, config_b32: String,
tun_fd: i32, tun_fd: i32,
close_fd_on_drop: bool) -> JniResult<i32> { close_fd_on_drop: bool) -> JniResult<i32> {
android_logger::init_once(Config::default().with_tag("RustFrida"));
let close_token = tokio_util::sync::CancellationToken::new();
if let Ok(mut l) = TUN_QUIT.lock() {
if l.is_some() {
return Ok(-1);
}
*l = Some(close_token.clone());
} else {
return Ok(-2);
}
let main_loop = async move {
if let Err(err) = mobile::mobile_run(config_b32, close_fd_on_drop, tun_fd, env, close_token).await {
FridaLib::traceFromNative(env, format!("main loop error: {}", err));
return Err(err);
}
Ok(())
};
let exit_code = match tokio::runtime::Builder::new_multi_thread().enable_all().build() {
Err(_e) => -3,
Ok(rt) => match rt.block_on(main_loop) {
Ok(_) => 0,
Err(_e) => -4,
},
};
Ok(exit_code)
//FridaLib::traceFromNative(env, "Hello world".to_string()); //FridaLib::traceFromNative(env, "Hello world".to_string());
Ok(mobile::mobile_run(config_b32, close_fd_on_drop, tun_fd, env)) //Ok(mobile::mobile_run(config_b32, close_fd_on_drop, tun_fd, env))
} }
pub extern "jni" fn stop(self, env: &JNIEnv) -> JniResult<i32> { pub extern "jni" fn stop(self, env: &JNIEnv) -> JniResult<i32> {
Ok(mobile::mobile_stop()) if let Ok(mut l) = TUN_QUIT.lock() {
if let Some(close_token) = l.take() {
close_token.cancel();
return Ok(0);
}
}
Ok(-1)
} }
pub extern "java" fn traceFromNative( pub extern "java" fn traceFromNative(
@ -92,38 +100,3 @@ mod jni {
} }
} }
} }
/*
#[tokio::main]
async fn main() {
// Initialize the logger with 'info' as the default level
Builder::new()
.filter(None, LevelFilter::Info)
.init();
let matches = App::new("Frida")
.version("0.1.2")
.author("alterwain")
.about("VPN software (android port)")
.arg(Arg::with_name("config")
.long("config")
.required(true)
.value_name("B32_RAW")
.help("Configuration file data (base32 encoded)")
.takes_value(true))
.arg(Arg::with_name("fd")
.long("fd")
.required(true)
.value_name("INT")
.help("File descriptor int")
.takes_value(true))
.get_matches();
let cfg_raw = matches.value_of("config").unwrap();
let config: ClientConfiguration = serde_yaml::from_slice(RFC4648.decode(cfg_raw.as_bytes()).unwrap().as_slice()).expect("Bad client config file structure");
client::client_mode(config, matches.value_of("fd").unwrap().parse().unwrap()).await;
}
*/

View File

@ -1,4 +1,3 @@
use std::os::raw::c_int;
use log::{error, info, warn}; use log::{error, info, warn};
use crate::config::{ ServerConfiguration, ClientConfiguration, ObfsProtocol, ServerPeer }; use crate::config::{ ServerConfiguration, ClientConfiguration, ObfsProtocol, ServerPeer };
use fast32::base32::RFC4648; use fast32::base32::RFC4648;
@ -7,30 +6,7 @@ use jni::sys::jint;
use tokio::runtime::Runtime; use tokio::runtime::Runtime;
use robusta_jni::jni::JNIEnv; use robusta_jni::jni::JNIEnv;
pub fn mobile_run(cfg_raw: String, close_fd_on_drop: bool, tun_fd: i32, env: &JNIEnv) -> c_int { pub async fn mobile_run(cfg_raw: String, close_fd_on_drop: bool, tun_fd: i32, env: &JNIEnv, close_token: tokio_util::sync::CancellationToken) {
let config: ClientConfiguration = serde_yaml::from_slice(hex::decode(cfg_raw).unwrap().as_slice()).expect("Bad client config file structure"); let config: ClientConfiguration = serde_yaml::from_slice(hex::decode(cfg_raw).unwrap().as_slice()).expect("Bad client config file structure");
Runtime::new().unwrap().block_on(client::client_mode(config, tun_fd, env)); client::client_mode(config, tun_fd, env).await;
0
/*let block = async move {
let mut config = tun2::Configuration::default();
config.raw_fd(tun_fd);
config.close_fd_on_drop(close_fd_on_drop);
let device = tun2::create_as_async(&config).map_err(std::io::Error::from)?;
let join_handle = tokio::spawn(run(device, shutdown_token));
join_handle.await.map_err(std::io::Error::from)?
};*/
}
pub fn mobile_stop() -> c_int {
/*if let Ok(mut lock) = TUN_QUIT.lock() {
if let Some(shutdown_token) = lock.take() {
shutdown_token.cancel();
return 0;
}
}*/
-1
} }