├── tests ├── simple-c │ └── .gitignore ├── mybin │ ├── Cargo.toml │ ├── Cargo.lock │ └── src │ │ └── main.rs └── mylib │ ├── Cargo.toml │ ├── src │ └── lib.rs │ └── Cargo.lock ├── .cargo └── config.toml ├── .github ├── logo.png ├── workflows │ └── test.yml └── undetected-frida-patches.patch ├── renovate.json ├── .dockerignore ├── .vscode └── settings.json ├── .gitignore ├── src ├── loader_unix.rs ├── main.rs ├── loader_windows.rs ├── injector.rs ├── win_daemon.rs ├── frida_handler.rs └── lib.rs ├── Dockerfile.android ├── Cargo.toml ├── shell.nix ├── Dockerfile.android-undetect ├── README.md ├── LICENSE └── Cargo.lock /tests/simple-c/.gitignore: -------------------------------------------------------------------------------- 1 | mylib.so 2 | mybin 3 | -------------------------------------------------------------------------------- /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [target.x86_64-pc-windows-msvc] 2 | linker = "lld-link" -------------------------------------------------------------------------------- /.github/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dzervas/injectionforge/HEAD/.github/logo.png -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base" 4 | ], 5 | "schedule": [ 6 | "before 4pm on Monday" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | target 2 | .git 3 | .vscode 4 | .github 5 | !/.github/undetected-frida-patches.patch 6 | *.nix 7 | /renovate.json 8 | __handlers__ 9 | -------------------------------------------------------------------------------- /tests/mybin/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "mybin" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | mylib = { path = "../mylib" } 8 | -------------------------------------------------------------------------------- /tests/mylib/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "mylib" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [lib] 7 | crate-type = ["cdylib"] 8 | 9 | [dependencies] 10 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "rust-analyzer.cargo.features": "all", 3 | "rust-analyzer.check.features": "all", 4 | "nixEnvSelector.nixFile": "${workspaceFolder}/shell.nix" 5 | } 6 | -------------------------------------------------------------------------------- /tests/mylib/src/lib.rs: -------------------------------------------------------------------------------- 1 | #[no_mangle] 2 | pub extern "C" fn mylib_foo() -> u8 { 3 | 10 4 | } 5 | 6 | #[no_mangle] 7 | pub extern "C" fn mylib_bar() -> u8 { 8 | 100 9 | } 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | __handlers__ 3 | /examples/cs/*/obj 4 | /examples/cs/*/bin 5 | *.png~ 6 | *.exe 7 | *.dll 8 | /examples/cs/bin 9 | /examples/cs/obj 10 | /dotnet 11 | src/symbols.rs 12 | -------------------------------------------------------------------------------- /tests/mylib/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "mylib" 7 | version = "0.1.0" 8 | -------------------------------------------------------------------------------- /src/loader_unix.rs: -------------------------------------------------------------------------------- 1 | #![cfg(all(unix, not(test)))] 2 | use ctor::ctor; 3 | 4 | use crate::injector::attach_self; 5 | 6 | #[ctor] 7 | fn _start() { 8 | println!("[+] InjectionForge library injected"); 9 | attach_self(); 10 | } 11 | -------------------------------------------------------------------------------- /tests/mybin/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "mybin" 7 | version = "0.1.0" 8 | dependencies = [ 9 | "mylib", 10 | ] 11 | 12 | [[package]] 13 | name = "mylib" 14 | version = "0.1.0" 15 | -------------------------------------------------------------------------------- /tests/mybin/src/main.rs: -------------------------------------------------------------------------------- 1 | #[link(name = "mylib", kind = "dylib")] 2 | extern { 3 | fn mylib_foo() -> u8; 4 | fn mylib_bar() -> u8; 5 | } 6 | 7 | fn main() { 8 | println!("Hello, world!"); 9 | 10 | assert_eq!(unsafe { mylib_bar() }, 100); 11 | std::process::exit(unsafe { mylib_foo() } as i32); 12 | } 13 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | pub mod injector; 2 | #[cfg(feature = "frida")] 3 | pub mod frida_handler; 4 | 5 | pub use injector::*; 6 | 7 | fn main() { 8 | let args: Vec = std::env::args().collect(); 9 | 10 | if args.len() >= 2 { 11 | if let Ok(pid) = args[1].parse() { 12 | attach(pid); 13 | return; 14 | } else { 15 | attach_name(args[1].as_ptr(), args[1].len()); 16 | return; 17 | } 18 | } else if let Some(spawn_path) = option_env!("TARGET_SPAWN") { 19 | spawn(spawn_path.as_ptr(), spawn_path.len()); 20 | return; 21 | } else if let Some(process_name) = option_env!("TARGET_PROCESS") { 22 | attach_name(process_name.as_ptr(), process_name.len()); 23 | return; 24 | } 25 | 26 | eprintln!("Usage: {} ", args[0]); 27 | } 28 | -------------------------------------------------------------------------------- /Dockerfile.android: -------------------------------------------------------------------------------- 1 | FROM ubuntu 2 | 3 | # Rust & sdkmanager 4 | ARG TOOLS_VERSION=13.0 5 | RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y clang gcc git rustup google-android-cmdline-tools-${TOOLS_VERSION}-installer 6 | 7 | # Set up cargo-ndk 8 | ARG ARCH_TRIPLET=armv7-linux-androideabi 9 | RUN rustup default stable && cargo install cargo-ndk && rustup target add ${ARCH_TRIPLET} 10 | 11 | # Install the NDK 12 | ARG NDK_VERSION=25.2.9519653 13 | RUN yes | sdkmanager --licenses && sdkmanager --install "ndk;${NDK_VERSION}" 14 | 15 | # Required environment variables 16 | ENV ANDROID_HOME="/usr/lib/android-sdk" 17 | ENV ANDROID_NDK_HOME="/usr/lib/android-sdk/ndk/${NDK_VERSION}/" 18 | ENV ANDROID_NDK_ROOT="${ANDROID_NDK_HOME}" 19 | 20 | ARG NDK_ARCH=armeabi-v7a 21 | 22 | COPY . /injectionforge 23 | WORKDIR /injectionforge 24 | 25 | # Run with: docker run -it --name iforge -v $(pwd):/injectionforge injectionforge:latest 26 | CMD cargo ndk -t armeabi-v7a --bindgen build --release 27 | -------------------------------------------------------------------------------- /src/loader_windows.rs: -------------------------------------------------------------------------------- 1 | #![cfg(all(windows, not(test)))] 2 | 3 | use std::ffi::c_void; 4 | use winapi::um::winnt::DLL_PROCESS_ATTACH; 5 | use winapi::um::libloaderapi::LoadLibraryA; 6 | use crate::attach_self; 7 | 8 | // For some reason ctor doesn't work on Windows - it hangs the process 9 | // during DeviceManager::obtain. DllMain works fine though. 10 | // Would be nice to have a single entry point for all platforms. 11 | #[no_mangle] 12 | #[allow(non_snake_case, unused_variables)] 13 | pub extern "system" fn DllMain(dll_module: *mut c_void, call_reason: u32, _: *mut ()) -> bool { 14 | match call_reason { 15 | DLL_PROCESS_ATTACH => { 16 | println!("[+] InjectionForge DLL injected"); 17 | 18 | if let Some(lib_name) = option_env!("LIB_NAME") { 19 | unsafe { LoadLibraryA(lib_name.as_ptr() as *const i8); } 20 | println!("[+] Original DLL {} loaded", lib_name); 21 | } 22 | 23 | attach_self(); 24 | } 25 | // Maybe we should detach? Is it useful? 26 | _ => () 27 | } 28 | 29 | true 30 | } 31 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Rust 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | branches: 9 | - main 10 | 11 | env: 12 | CARGO_TERM_COLOR: always 13 | 14 | jobs: 15 | build: 16 | strategy: 17 | matrix: 18 | os: 19 | - ubuntu-latest 20 | - macos-latest 21 | - windows-latest 22 | runs-on: ubuntu-latest 23 | 24 | steps: 25 | - uses: actions/checkout@v4 26 | - name: Set up cargo cache 27 | uses: actions/cache@v4 28 | continue-on-error: false 29 | with: 30 | path: | 31 | ~/.cargo/bin/ 32 | ~/.cargo/registry/index/ 33 | ~/.cargo/registry/cache/ 34 | ~/.cargo/git/db/ 35 | target/ 36 | key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} 37 | restore-keys: ${{ runner.os }}-cargo- 38 | - name: Build 39 | run: cargo build 40 | - name: Run tests - frida 41 | run: cargo test --all-features 42 | 43 | # - name: Run tests - frida 44 | # if: runner.os == 'windows-latest' 45 | # run: cargo test --verbose --no-default-features --features dotnet 46 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "injectionforge" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [lib] 7 | crate-type = ["cdylib"] 8 | 9 | [[bin]] 10 | name = "standalone" 11 | path = "src/main.rs" 12 | 13 | [features] 14 | default = ["frida", "frida-auto-download"] 15 | frida = ["dep:frida", "dep:lazy_static", "dep:serde", "dep:serde_json"] 16 | frida-auto-download = ["frida/auto-download"] 17 | 18 | [dependencies] 19 | frida = { version = "0.16", optional = true } 20 | lazy_static = { version = "1.5.0", optional = true } 21 | serde = { version = "1.0", features = ["derive"], optional = true } 22 | serde_json = { version = "1.0", optional = true } 23 | 24 | [target.'cfg(windows)'.dependencies] 25 | winapi = { version = "0.3.9", features = ["winnt", "libloaderapi"] } 26 | windows-sys = { version = "0.59", features = [ 27 | "Win32_System_ClrHosting", 28 | ], optional = true } 29 | 30 | [target.'cfg(unix)'.dependencies] 31 | ctor = "0.2" 32 | 33 | [build-dependencies] 34 | goblin = "0.9" 35 | build-target = "0.4" 36 | serde = { version = "1.0", features = ["derive"] } 37 | toml = "0.8" 38 | 39 | [dev-dependencies] 40 | pretty_assertions = "1.4" 41 | mylib = { path = "tests/mylib" } 42 | -------------------------------------------------------------------------------- /shell.nix: -------------------------------------------------------------------------------- 1 | with import {}; 2 | mkShell { 3 | nativeBuildInputs = [ 4 | rustup 5 | cargo-xwin 6 | pkg-config 7 | llvmPackages.libclang 8 | ]; 9 | 10 | # Got from https://discourse.nixos.org/t/setting-up-a-nix-env-that-can-compile-c-libraries/15833 11 | shellHook = '' 12 | export LIBCLANG_PATH="${llvmPackages.libclang.lib}/lib"; 13 | export BINDGEN_EXTRA_CLANG_ARGS="$(< ${stdenv.cc}/nix-support/libc-crt1-cflags) \ 14 | $(< ${stdenv.cc}/nix-support/libc-cflags) \ 15 | $(< ${stdenv.cc}/nix-support/cc-cflags) \ 16 | $(< ${stdenv.cc}/nix-support/libcxx-cxxflags) \ 17 | ${ 18 | lib.optionalString stdenv.cc.isClang 19 | "-idirafter ${stdenv.cc.cc}/lib/clang/${ 20 | lib.getVersion stdenv.cc.cc 21 | }/include" 22 | } \ 23 | ${ 24 | lib.optionalString stdenv.cc.isGNU 25 | "-isystem ${stdenv.cc.cc}/include/c++/${ 26 | lib.getVersion stdenv.cc.cc 27 | } -isystem ${stdenv.cc.cc}/include/c++/${ 28 | lib.getVersion stdenv.cc.cc 29 | }/${stdenv.hostPlatform.config} -idirafter ${stdenv.cc.cc}/lib/gcc/${stdenv.hostPlatform.config}/${ 30 | lib.getVersion stdenv.cc.cc 31 | }/include" 32 | } \ 33 | " 34 | ''; 35 | } 36 | -------------------------------------------------------------------------------- /Dockerfile.android-undetect: -------------------------------------------------------------------------------- 1 | # Before building this image: 2 | # docker build -t injectionforge-android -f Dockerfile.android 3 | FROM injectionforge-android 4 | 5 | # Frida dependencies to optionally compile frida 6 | RUN apt-get update && \ 7 | DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential git lib32stdc++-9-dev libc6-dev-i386 nodejs npm python3-pip && \ 8 | pip install --break-system-packages lief 9 | 10 | # Compile frida-core devkit 11 | ARG FRIDA_HOST=android-arm 12 | # Updated https://github.com/ultrafunkamsterdam/undetected-frida-patches 13 | COPY .github/undetected-frida-patches.patch /undetected-frida-patches.patch 14 | RUN git clone https://github.com/frida/frida-core /frida-core && \ 15 | cd /frida-core && \ 16 | git apply /undetected-frida-patches.patch && \ 17 | ./configure --host=${FRIDA_HOST} --with-devkits=core --disable-connectivity --disable-portal --disable-server --disable-tests --disable-gadget --disable-inject && \ 18 | make -j8 19 | 20 | ENV FRIDA_CORE_DEVKIT_PATH="/frida-core/build/src/devkit" 21 | 22 | # Run with: docker run -it --name iforge -v $(pwd):/injectionforge injectionforge:latest 23 | # CMD [ "cargo", "ndk", "-t", "armeabi-v7a", "--bindgen", "build", "--no-default-features", "--features", "frida", "&&", "python3", "/frida-core/src/anti-anti-frida.py", "target/armv7-linux-androideabi/debug/standalone", "&&", "python3", "/frida-core/src/anti-anti-frida.py", "target/armv7-linux-androideabi/debug/libinjectionforge.so" ] 24 | CMD cargo ndk -t armeabi-v7a --bindgen build --no-default-features --features frida --release && \ 25 | python3 /frida-core/src/anti-anti-frida.py target/armv7-linux-androideabi/release/standalone && \ 26 | python3 /frida-core/src/anti-anti-frida.py target/armv7-linux-androideabi/release/libinjectionforge.so 27 | -------------------------------------------------------------------------------- /src/injector.rs: -------------------------------------------------------------------------------- 1 | 2 | #[cfg(all(not(feature = "frida")))] 3 | compile_error!("No injection method is selected - please enable either dotnet (windows-only) and/or frida feature"); 4 | 5 | #[cfg(feature = "frida")] 6 | use crate::frida_handler::attach_with as frida_attach_with; 7 | use crate::frida_handler::AttachMode; 8 | 9 | #[no_mangle] 10 | pub extern "C" fn attach(pid: u32) { 11 | #[cfg(feature = "frida")] 12 | { 13 | let frida_code = env!("FRIDA_CODE").replace("\\n", "\n"); 14 | #[cfg(windows)] 15 | std::thread::spawn(move || frida_attach_with(&frida_code, AttachMode::Pid(pid))); 16 | #[cfg(not(windows))] 17 | frida_attach_with(&frida_code, AttachMode::Pid(pid)); 18 | } 19 | } 20 | 21 | #[no_mangle] 22 | pub extern "C" fn attach_name(name: *const u8, len: usize) { 23 | let name_str = unsafe { 24 | let buf = std::slice::from_raw_parts(name, len); 25 | std::str::from_utf8(buf).expect("Invalid UTF-8 in process name") 26 | }; 27 | 28 | #[cfg(feature = "frida")] 29 | { 30 | let frida_code = env!("FRIDA_CODE").replace("\\n", "\n"); 31 | #[cfg(windows)] 32 | std::thread::spawn(move || frida_attach_with(&frida_code, AttachMode::Name(name_str.to_string()))); 33 | #[cfg(not(windows))] 34 | frida_attach_with(&frida_code, AttachMode::Name(name_str.to_string())); 35 | } 36 | } 37 | 38 | #[no_mangle] 39 | pub extern "C" fn attach_self() { 40 | println!("[*] Attaching to self"); 41 | attach(0); 42 | } 43 | 44 | #[no_mangle] 45 | pub extern "C" fn spawn(name: *const u8, len: usize) { 46 | let name_str = unsafe { 47 | let buf = std::slice::from_raw_parts(name, len); 48 | std::str::from_utf8(buf).expect("Invalid UTF-8 in spawn name") 49 | }; 50 | 51 | println!("[*] Spawning: {name_str}"); 52 | 53 | #[cfg(feature = "frida")] 54 | { 55 | let frida_code = env!("FRIDA_CODE").replace("\\n", "\n"); 56 | #[cfg(windows)] 57 | std::thread::spawn(move || frida_attach_with(&frida_code, AttachMode::Spawn(name_str.to_string()))); 58 | #[cfg(not(windows))] 59 | frida_attach_with(&frida_code, AttachMode::Spawn(name_str.to_string())); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/win_daemon.rs: -------------------------------------------------------------------------------- 1 | #![cfg(windows)] 2 | 3 | use std::ffi::c_void; 4 | use winapi::shared::minwindef::DWORD; 5 | use winapi::um::evntprov::*; 6 | use winapi::um::evntcons::*; 7 | use winapi::um::evntprov::*; 8 | use winapi::um::winnt::{EVENT_TRACE_CONTROL_STOP, EVENT_TRACE_FLAG_PROCESS}; 9 | 10 | pub fn start_daemon() { 11 | // Create an event trace session 12 | let session_name = "InjectionForge"; 13 | let session_handle = create_event_trace_session(session_name); 14 | if session_handle.is_null() { 15 | eprintln!("Failed to create event trace session"); 16 | return; 17 | } 18 | 19 | // Enable process creation events 20 | enable_process_creation_events(session_handle); 21 | 22 | // Process events until a termination event is received 23 | process_events(session_handle); 24 | 25 | // Stop the event trace session 26 | stop_event_trace_session(session_handle); 27 | } 28 | 29 | fn create_event_trace_session(session_name: &str) -> TRACEHANDLE { 30 | let session_name = widestring::WideCString::from_str(session_name).expect("Failed to convert session name"); 31 | 32 | let mut session_handle: TRACEHANDLE = 0; 33 | let status = unsafe { 34 | StartTraceW( 35 | &mut session_handle, 36 | session_name.as_ptr(), 37 | ptr::null_mut(), 38 | ) 39 | }; 40 | 41 | if status != ERROR_SUCCESS { 42 | println!("Failed to start event trace session: {}", status); 43 | } 44 | 45 | session_handle 46 | } 47 | 48 | fn enable_process_creation_events(session_handle: TRACEHANDLE) { 49 | let status = unsafe { 50 | EnableTraceEx2( 51 | session_handle, 52 | &EVENT_TRACE_GUID_PROCESS, 53 | EVENT_CONTROL_CODE_ENABLE_PROVIDER, 54 | TRACE_LEVEL_INFORMATION, 55 | EVENT_TRACE_FLAG_PROCESS, 56 | 0, 57 | 0, 58 | 0, 59 | NULL, 60 | ) 61 | }; 62 | 63 | if status != ERROR_SUCCESS { 64 | println!("Failed to enable process creation events: {}", status); 65 | } 66 | } 67 | 68 | fn process_events(session_handle: TRACEHANDLE) { 69 | let mut buffer_size: DWORD = 64 * 1024; 70 | let mut buffer = vec![0u8; buffer_size as usize]; 71 | 72 | let status = unsafe { 73 | ProcessTrace( 74 | &mut session_handle, 75 | 1, 76 | NULL, 77 | NULL, 78 | ) 79 | }; 80 | 81 | if status != ERROR_SUCCESS && status != ERROR_CANCELLED { 82 | println!("Failed to process events: {}", status); 83 | } 84 | } 85 | 86 | fn stop_event_trace_session(session_handle: TRACEHANDLE) { 87 | let status = unsafe { 88 | ControlTraceW( 89 | session_handle, 90 | NULL, 91 | NULL, 92 | EVENT_TRACE_CONTROL_STOP, 93 | ) 94 | }; 95 | 96 | if status != ERROR_SUCCESS { 97 | println!("Failed to stop event trace session: {}", status); 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /src/frida_handler.rs: -------------------------------------------------------------------------------- 1 | #![cfg(feature = "frida")] 2 | 3 | use frida::{DeviceManager, DeviceType, Frida, ScriptHandler, ScriptOption, ScriptRuntime, SpawnOptions, Message, MessageLogLevel}; 4 | use lazy_static::lazy_static; 5 | 6 | lazy_static! { 7 | pub static ref FRIDA: Frida = unsafe { Frida::obtain() }; 8 | } 9 | 10 | #[derive(Debug)] 11 | pub enum AttachMode { 12 | Pid(u32), 13 | Name(String), 14 | Spawn(String), 15 | } 16 | 17 | pub fn attach_with(frida_code: &str, mode: AttachMode) { 18 | println!("[+] Injecting into: {mode:?}"); 19 | 20 | let device_manager = DeviceManager::obtain(&FRIDA); 21 | println!("[*] Device Manager obtained"); 22 | 23 | if let Ok(mut device) = device_manager.get_device_by_type(DeviceType::Local) { 24 | println!("[*] First device: {}", device.get_name()); 25 | 26 | let pid = match mode { 27 | AttachMode::Pid(pid) => pid, 28 | AttachMode::Name(ref name) => { 29 | device.enumerate_processes().iter() 30 | .find(|p| p.get_name() == name) 31 | .expect("Process not found") 32 | .get_pid() 33 | }, 34 | AttachMode::Spawn(ref name) => device.spawn(name, &SpawnOptions::new()).unwrap(), 35 | }; 36 | 37 | let session = device.attach(pid).unwrap(); 38 | 39 | println!("[*] Attached"); 40 | 41 | let mut script_option = ScriptOption::new() 42 | .set_runtime(ScriptRuntime::QJS); 43 | println!("[*] Script {}", frida_code); 44 | let mut script = session 45 | .create_script(frida_code, &mut script_option) 46 | .unwrap(); 47 | 48 | script.handle_message(Handler).unwrap(); 49 | 50 | script.load().unwrap(); 51 | println!("[*] Script loaded"); 52 | 53 | if let AttachMode::Spawn(_) = mode { 54 | device.resume(pid).unwrap(); 55 | println!("[*] Resuming spawned process") 56 | } 57 | } else { 58 | eprintln!("[!] No device found!"); 59 | }; 60 | } 61 | 62 | struct Handler; 63 | 64 | impl ScriptHandler for Handler { 65 | fn on_message(&mut self, message: &Message, _data: Option>) { 66 | if let Message::Log(log_entry) = message { 67 | match log_entry.level { 68 | MessageLogLevel::Debug => eprint!("[-] "), 69 | MessageLogLevel::Info => eprint!("[i] "), 70 | MessageLogLevel::Warning => eprint!("[!] "), 71 | MessageLogLevel::Error => eprint!("[X] "), 72 | } 73 | 74 | eprintln!("{}", log_entry.payload); 75 | return; 76 | } 77 | 78 | eprintln!("{:?}", message); 79 | } 80 | } 81 | 82 | #[cfg(test)] 83 | mod tests { 84 | use super::*; 85 | use pretty_assertions::assert_eq; 86 | 87 | #[link(name = "mylib", kind = "dylib")] 88 | extern { 89 | fn mylib_foo() -> u8; 90 | } 91 | 92 | #[test] 93 | fn test_attach_pid() { 94 | assert_eq!(10, unsafe { mylib_foo() }); 95 | 96 | let frida_script = r#" 97 | const foo = Module.getExportByName(null, "mylib_foo"); 98 | Interceptor.replace(foo, new NativeCallback(function () { 99 | console.log("replaced foo() called"); 100 | return 20; 101 | }, "uint8", [])); 102 | "#; 103 | 104 | attach_with(frida_script, AttachMode::Pid(0)); 105 | assert_eq!(20, unsafe { mylib_foo() }); 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | pub mod injector; 2 | #[cfg(feature = "frida")] 3 | pub mod frida_handler; 4 | 5 | pub use injector::attach_self; 6 | 7 | // During testing we compile a debug binary without `test`. 8 | // Enabling `ctor` during testing would hook the test runner and break it. 9 | pub mod loader_unix; 10 | 11 | pub mod loader_windows; 12 | #[cfg(all(windows, not(test)))] 13 | pub use loader_windows::DllMain; 14 | 15 | #[cfg(test)] 16 | mod tests { 17 | use pretty_assertions::assert_eq; 18 | use std::process::Command; 19 | 20 | #[allow(dead_code)] 21 | fn get_lib_name(name: &str) -> String { 22 | #[cfg(target_os = "windows")] 23 | return format!("{}.dll", name); 24 | 25 | #[cfg(target_os = "linux")] 26 | return format!("lib{}.so", name); 27 | 28 | #[cfg(target_os = "darwin")] 29 | return format!("lib{}.dylib", name); 30 | } 31 | 32 | #[test] 33 | fn test_frida_on_load() { 34 | let lib_status = Command::new("cargo") 35 | .arg("build") 36 | .arg("--lib") 37 | .arg("--target-dir") 38 | .arg("target/test_frida_on_load") 39 | .env("FRIDA_CODE", r#" 40 | const foo = Module.getExportByName(null, "mylib_foo"); 41 | Interceptor.replace(foo, new NativeCallback(function () { 42 | console.log("replaced foo() called"); 43 | return 40; 44 | }, "uint8", [])); 45 | "#) 46 | .status() 47 | .unwrap(); 48 | 49 | assert!(lib_status.success(), "Failed to build dynamic library"); 50 | 51 | let bin_status = Command::new("cargo") 52 | .arg("run") 53 | .arg("--manifest-path") 54 | .arg("tests/mybin/Cargo.toml") 55 | .arg("--target-dir") 56 | .arg("target/test_frida_on_load") 57 | // We're compiling in the same target dir so that frida_deepfreeze_rs is found 58 | // We'd have to copy it to the target dir otherwise 59 | .env("RUSTFLAGS", "-C link-arg=-Wl,--no-as-needed -C link-arg=-lfrida_deepfreeze_rs") 60 | .status() 61 | .unwrap(); 62 | 63 | assert_eq!(bin_status.code().unwrap(), 40, "Failed to replace foo()"); 64 | } 65 | 66 | #[test] 67 | #[cfg(windows)] 68 | fn test_frida_dll_proxy() { 69 | use std::fs; 70 | 71 | let mylib_name = get_lib_name("mylib"); 72 | fs::remove_file(format!("target/test_frida_dll_proxy/debug/deps/{}", mylib_name)).unwrap_or_else(|_| ()); 73 | 74 | let mylib_status = Command::new("cargo") 75 | .arg("build") 76 | .arg("--lib") 77 | .arg("--manifest-path") 78 | .arg("tests/mylib/Cargo.toml") 79 | .arg("--target-dir") 80 | .arg("target/test_frida_dll_proxy/mylib") 81 | .status() 82 | .unwrap(); 83 | assert!(mylib_status.success(), "Failed to build mylib"); 84 | 85 | // fs::copy(format!("target/test_frida_dll_proxy/mylib/debug/{}", get_lib_name("mylib")), format!("target/test_frida_dll_proxy/lib/debug/deps/{}", get_lib_name("mylib-orig"))).expect("Failed to rename original DLL"); 86 | let lib_status = Command::new("cargo") 87 | .arg("build") 88 | .arg("--lib") 89 | .arg("--target-dir") 90 | .arg("target/test_frida_dll_proxy/lib") 91 | .env("DLL_PROXY", format!("target/test_frida_dll_proxy/mylib/debug/{mylib_name}")) 92 | .env("FRIDA_CODE", r#" 93 | const foo = Module.getExportByName(null, "mylib_foo"); 94 | Interceptor.replace(foo, new NativeCallback(function () { 95 | console.log("replaced foo() called"); 96 | return 40; 97 | }, "uint8", [])); 98 | "#) 99 | .status() 100 | .unwrap(); 101 | 102 | assert!(lib_status.success(), "Failed to build dynamic library"); 103 | 104 | let target_dir = "target/test_frida_dll_proxy/mybin/debug/deps/"; 105 | fs::copy(format!("target/test_frida_dll_proxy/mylib/debug/{}", get_lib_name("mylib")), format!("{target_dir}{}", get_lib_name("mylib-orig"))).expect("Failed to rename original DLL"); 106 | fs::copy(format!("target/test_frida_dll_proxy/lib/debug/{}", get_lib_name("frida_deepfreeze_rs")), format!("{target_dir}{}", get_lib_name("mylib"))).expect("Failed to rename deepfreeze DLL"); 107 | 108 | let bin_status = Command::new("cargo") 109 | .arg("run") 110 | .arg("--manifest-path") 111 | .arg("tests/mybin/Cargo.toml") 112 | .arg("--target-dir") 113 | .arg("target/test_frida_dll_proxy/mybin") 114 | // .env("RUSTFLAGS", "-C link-arg=-Wl,--no-as-needed -C link-arg=-lmylib") 115 | .status() 116 | .unwrap(); 117 | 118 | assert_eq!(bin_status.code().unwrap(), 40, "Failed to replace foo()"); 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # InjectionForge 2 | 3 | InjectionForge logo 4 | 5 | Have you ever written a frida script this good, that you wanted to make it permanent? 6 | Well, now you can! 7 | 8 | InjectionForge is a tool that allows you to convert your frida scripts into 9 | either a standalone executable that when called with a PID injects itself and runs 10 | the script or a shared library that can be somehow injected to a process and runs 11 | the script. 12 | 13 | All desktop platforms are supported (Windows, Linux, macOS). 14 | 15 | **NOTE**: To cross-compile for Windows you can use [cargo-xwin](https://github.com/rust-cross/cargo-xwin) 16 | with target `x86_64-pc-windows-msvc`. 17 | 18 | ## Usage 19 | 20 | You're gonna have to compile the tool yourself as the frida script gets embedded 21 | at compile time. 22 | 23 | You only need a working cargo installation to compile it, it's quite simple. 24 | 25 | You can feed your script either as a string using the `FRIDA_CODE` environment 26 | variable or as a file using the `FRIDA_CODE_FILE` environment variable. 27 | 28 | ### Standalone executable 29 | 30 | The standalone executable is the easiest to use. You just run it with a PID and 31 | it will inject itself and run the frida script. 32 | 33 | ```bash 34 | git clone https://github.com/dzervas/injectionforge 35 | FRIDA_CODE='console.log("Hello world from InjectionForge!")' cargo run --bin standalone -- 1234 36 | ``` 37 | 38 | The binary is located at `target/debug/standalone` (`.exe` for windows). 39 | 40 | ### Shared library 41 | 42 | The shared library is a bit more complicated to use. You have to inject it to 43 | a process using a tool like `LD_PRELOAD` (linux) or `rundll32.exe` (windows). 44 | 45 | ```bash 46 | git clone https://github.com/dzervas/injectionforge 47 | FRIDA_CODE='console.log("Hello world from InjectionForge!")' cargo build --lib 48 | LD_PRELOAD=target/debug/libfrida_deepfreeze_rs.so cat 49 | # rundll32.exe target/debug/frida_deepfreeze_rs.dll,inject_self 1234 (windows equivalent) 50 | ``` 51 | 52 | The resulting library is located at `target/debug/libfrida_deepfreeze_rs.so` 53 | (`.dll` for windows). You can inject it using your favorite injector. 54 | 55 | There are two exported functions that you can call from the library to inject: 56 | 57 | ```c 58 | void inject(uint32_t pid); // Run the frida script in the process with the given pid 59 | void inject_self(); // Run the frida script in the process that called the function 60 | ``` 61 | 62 | By default (so `DllMain` in windows and `.ctor` on unix), on load the library 63 | will call `inject_self()` so you can just inject it and it will run the script. 64 | 65 | ### DLL Proxying 66 | 67 | There's also the option of generating a DLL ready for DLL Proxying use. 68 | That means that you give the DLL `myawesome.dll` to cargo 69 | (using the `DLL_PROXY` environment variable) and it will generate a DLL 70 | `myawesome.dll` that can replace the original DLL. It will tell the linker 71 | that any functions found during compilation (e.g. functions `foo` and `bar` 72 | exported by the original `myawesome.dll`) should be redirected to `myawesome-orig.dll` 73 | 74 | That allows you to make your script completely permanent without having to 75 | run any extra commands. 76 | 77 | **NOTE**: This only works on Windows (for now?). 78 | 79 | ```bash 80 | git clone https://github.com/dzervas/injectionforge 81 | DLL_PROXY='../myawesome.dll' FRIDA_CODE='console.log("Hello world from InjectionForge!")' cargo xwin build --lib --target x86_64-pc-windows-msvc 82 | ``` 83 | 84 | ## Android and anti-anti-frida 85 | 86 | Since most people ask about Android and anti-anti-frida techniques, 87 | I created some dockerfiles to help with that. 88 | 89 | To just wrap a frida script in a shared library that can be injected to an Android 90 | process (or APK repacking): 91 | 92 | ```bash 93 | git clone https://github.com/dzervas/injectionforge 94 | cd injectionforge 95 | docker build -t injectionforge-android -f Dockerfile.android . 96 | docker run -e FRIDA_CODE_FILE=/script.js -v $(pwd)/target:/injectionforge/target -v $(pwd)/myscript.js:/script.js injectionforge-android 97 | ``` 98 | 99 | (be sure to change the path to `myscript.js`) 100 | 101 | To use a patched frida to evade some basic anti-frida techniques 102 | (based on [undetected-frida-patches](https://github.com/ultrafunkamsterdam/undetected-frida-patches/)): 103 | 104 | ```bash 105 | git clone https://github.com/dzervas/injectionforge 106 | cd injectionforge 107 | docker build -t injectionforge-android -f Dockerfile.android . 108 | docker build -t injectionforge-android-undetect -f Dockerfile.android-undetect . 109 | docker run -e FRIDA_CODE_FILE=/script.js -v $(pwd)/target:/injectionforge/target -v $(pwd)/myscript.js:/script.js injectionforge-android-undetect 110 | ``` 111 | 112 | During the build of `Dockerfile.android` you can pass args to specify the 113 | NDK version and more (check the Dockerfile). 114 | -------------------------------------------------------------------------------- /.github/undetected-frida-patches.patch: -------------------------------------------------------------------------------- 1 | diff --git a/lib/base/rpc.vala b/lib/base/rpc.vala 2 | index 3695ba8c..02602abf 100644 3 | --- a/lib/base/rpc.vala 4 | +++ b/lib/base/rpc.vala 5 | @@ -17,7 +17,7 @@ namespace Frida { 6 | var request = new Json.Builder (); 7 | request 8 | .begin_array () 9 | - .add_string_value ("frida:rpc") 10 | + .add_string_value ((string) GLib.Base64.decode("ZnJpZGE6cnBj=")) 11 | .add_string_value (request_id) 12 | .add_string_value ("call") 13 | .add_string_value (method) 14 | @@ -70,7 +70,7 @@ namespace Frida { 15 | } 16 | 17 | public bool try_handle_message (string json) { 18 | - if (json.index_of ("\"frida:rpc\"") == -1) 19 | + if (json.index_of ((string) GLib.Base64.decode("ImZyaWRhOnJwYyI=")) == -1) 20 | return false; 21 | 22 | var parser = new Json.Parser (); 23 | @@ -99,7 +99,7 @@ namespace Frida { 24 | return false; 25 | 26 | string? type = rpc_message.get_element (0).get_string (); 27 | - if (type == null || type != "frida:rpc") 28 | + if (type == null || type != (string) GLib.Base64.decode("ZnJpZGE6cnBj=")) 29 | return false; 30 | 31 | var request_id_value = rpc_message.get_element (1); 32 | diff --git a/server/server.vala b/server/server.vala 33 | index 525c145e..f7547819 100644 34 | --- a/server/server.vala 35 | +++ b/server/server.vala 36 | @@ -1,7 +1,7 @@ 37 | namespace Frida.Server { 38 | private static Application application; 39 | 40 | - private const string DEFAULT_DIRECTORY = "re.frida.server"; 41 | + private static string DEFAULT_DIRECTORY = null; 42 | private static bool output_version = false; 43 | private static string? listen_address = null; 44 | private static string? certpath = null; 45 | @@ -50,6 +50,7 @@ namespace Frida.Server { 46 | }; 47 | 48 | private static int main (string[] args) { 49 | + DEFAULT_DIRECTORY = GLib.Uuid.string_random(); 50 | Environment.init (); 51 | 52 | #if DARWIN 53 | diff --git a/src/agent-container.vala b/src/agent-container.vala 54 | index 73e0c017..a3db1112 100644 55 | --- a/src/agent-container.vala 56 | +++ b/src/agent-container.vala 57 | @@ -28,7 +28,7 @@ namespace Frida { 58 | } 59 | 60 | void * main_func_symbol; 61 | - var main_func_found = container.module.symbol ("frida_agent_main", out main_func_symbol); 62 | + var main_func_found = container.module.symbol ("main", out main_func_symbol); 63 | assert (main_func_found); 64 | container.main_impl = (AgentMainFunc) main_func_symbol; 65 | 66 | diff --git a/src/anti-anti-frida.py b/src/anti-anti-frida.py 67 | new file mode 100644 68 | index 00000000..6e5d7a92 69 | --- /dev/null 70 | +++ b/src/anti-anti-frida.py 71 | @@ -0,0 +1,32 @@ 72 | +import lief 73 | +import sys 74 | +import random 75 | +import os 76 | +if __name__ == "__main__": 77 | + input_file = sys.argv[1] 78 | + print(f"[*] Patch frida-agent: {input_file}") 79 | + random_name = "".join(random.sample("ABCDEFGHIJKLMNO", 5)) 80 | + print(f"[*] Patch `frida` to `{random_name}``") 81 | + binary = lief.parse(input_file) 82 | + if not binary: 83 | + exit() 84 | + for symbol in binary.symbols: 85 | + if symbol.name == "frida_agent_main": 86 | + symbol.name = "main" 87 | + 88 | + if "frida" in symbol.name: 89 | + symbol.name = symbol.name.replace("frida", random_name) 90 | + if "FRIDA" in symbol.name: 91 | + symbol.name = symbol.name.replace("FRIDA", random_name) 92 | + 93 | + binary.write(input_file) 94 | + 95 | + # gum-js-loop thread 96 | + random_name = "".join(random.sample("abcdefghijklmn", 11)) 97 | + print(f"[*] Patch `gum-js-loop` to `{random_name}`") 98 | + os.system(f"sed -b -i s/gum-js-loop/{random_name}/g {input_file}") 99 | + 100 | + # gmain thread 101 | + random_name = "".join(random.sample("abcdefghijklmn", 5)) 102 | + print(f"[*] Patch `gmain` to `{random_name}`") 103 | + os.system(f"sed -b -i s/gmain/{random_name}/g {input_file}") 104 | diff --git a/src/darwin/darwin-host-session.vala b/src/darwin/darwin-host-session.vala 105 | index ab9b2900..4369922d 100644 106 | --- a/src/darwin/darwin-host-session.vala 107 | +++ b/src/darwin/darwin-host-session.vala 108 | @@ -381,7 +381,7 @@ namespace Frida { 109 | private async uint inject_agent (uint pid, string agent_parameters, Cancellable? cancellable) throws Error, IOError { 110 | uint id; 111 | 112 | - unowned string entrypoint = "frida_agent_main"; 113 | + unowned string entrypoint = "main"; 114 | #if HAVE_EMBEDDED_ASSETS 115 | id = yield fruitjector.inject_library_resource (pid, agent, entrypoint, agent_parameters, cancellable); 116 | #else 117 | diff --git a/src/droidy/droidy-client.vala b/src/droidy/droidy-client.vala 118 | index ddc56ccc..0c99611d 100644 119 | --- a/src/droidy/droidy-client.vala 120 | +++ b/src/droidy/droidy-client.vala 121 | @@ -1015,7 +1015,7 @@ namespace Frida.Droidy { 122 | case "OPEN": 123 | case "CLSE": 124 | case "WRTE": 125 | - throw new Error.PROTOCOL ("Unexpected command"); 126 | + break; //throw new Error.PROTOCOL ("Unexpected command"); 127 | 128 | default: 129 | var length = parse_length (command_or_length); 130 | diff --git a/src/freebsd/freebsd-host-session.vala b/src/freebsd/freebsd-host-session.vala 131 | index a2204a4e..eac16116 100644 132 | --- a/src/freebsd/freebsd-host-session.vala 133 | +++ b/src/freebsd/freebsd-host-session.vala 134 | @@ -197,7 +197,7 @@ namespace Frida { 135 | 136 | var stream_request = Pipe.open (t.local_address, cancellable); 137 | 138 | - var id = yield binjector.inject_library_resource (pid, agent_desc, "frida_agent_main", 139 | + var id = yield binjector.inject_library_resource (pid, agent_desc, "main", 140 | make_agent_parameters (pid, t.remote_address, options), cancellable); 141 | injectee_by_pid[pid] = id; 142 | 143 | diff --git a/src/linux/linux-host-session.vala b/src/linux/linux-host-session.vala 144 | index 50470ac8..086d0b96 100644 145 | --- a/src/linux/linux-host-session.vala 146 | +++ b/src/linux/linux-host-session.vala 147 | @@ -128,12 +128,13 @@ namespace Frida { 148 | var blob64 = Frida.Data.Agent.get_frida_agent_64_so_blob (); 149 | var emulated_arm = Frida.Data.Agent.get_frida_agent_arm_so_blob (); 150 | var emulated_arm64 = Frida.Data.Agent.get_frida_agent_arm64_so_blob (); 151 | - agent = new AgentDescriptor (PathTemplate ("frida-agent-.so"), 152 | + var random_prefix = GLib.Uuid.string_random(); 153 | + agent = new AgentDescriptor (PathTemplate (random_prefix + "-.so"), 154 | new Bytes.static (blob32.data), 155 | new Bytes.static (blob64.data), 156 | new AgentResource[] { 157 | - new AgentResource ("frida-agent-arm.so", new Bytes.static (emulated_arm.data), tempdir), 158 | - new AgentResource ("frida-agent-arm64.so", new Bytes.static (emulated_arm64.data), tempdir), 159 | + new AgentResource (random_prefix + "-arm.so", new Bytes.static (emulated_arm.data), tempdir), 160 | + new AgentResource (random_prefix + "-arm64.so", new Bytes.static (emulated_arm64.data), tempdir), 161 | }, 162 | AgentMode.INSTANCED, 163 | tempdir); 164 | @@ -426,7 +427,7 @@ namespace Frida { 165 | protected override async Future perform_attach_to (uint pid, HashTable options, 166 | Cancellable? cancellable, out Object? transport) throws Error, IOError { 167 | uint id; 168 | - string entrypoint = "frida_agent_main"; 169 | + string entrypoint = "main"; 170 | string parameters = make_agent_parameters (pid, "", options); 171 | AgentFeatures features = CONTROL_CHANNEL; 172 | var linjector = (Linjector) injector; 173 | diff --git a/src/qnx/qnx-host-session.vala b/src/qnx/qnx-host-session.vala 174 | index 69f2995f..a4e59ab2 100644 175 | --- a/src/qnx/qnx-host-session.vala 176 | +++ b/src/qnx/qnx-host-session.vala 177 | @@ -182,7 +182,7 @@ namespace Frida { 178 | 179 | var stream_request = Pipe.open (t.local_address, cancellable); 180 | 181 | - var id = yield qinjector.inject_library_resource (pid, agent_desc, "frida_agent_main", 182 | + var id = yield qinjector.inject_library_resource (pid, agent_desc, "main", 183 | make_agent_parameters (pid, t.remote_address, options), cancellable); 184 | injectee_by_pid[pid] = id; 185 | 186 | diff --git a/src/windows/windows-host-session.vala b/src/windows/windows-host-session.vala 187 | index 67f1f3ef..518cd256 100644 188 | --- a/src/windows/windows-host-session.vala 189 | +++ b/src/windows/windows-host-session.vala 190 | @@ -274,7 +274,7 @@ namespace Frida { 191 | var stream_request = Pipe.open (t.local_address, cancellable); 192 | 193 | var winjector = injector as Winjector; 194 | - var id = yield winjector.inject_library_resource (pid, agent, "frida_agent_main", 195 | + var id = yield winjector.inject_library_resource (pid, agent, "main", 196 | make_agent_parameters (pid, t.remote_address, options), cancellable); 197 | injectee_by_pid[pid] = id; 198 | 199 | diff --git a/tests/test-agent.vala b/tests/test-agent.vala 200 | index d28e67fd..bbdc29b3 100644 201 | --- a/tests/test-agent.vala 202 | +++ b/tests/test-agent.vala 203 | @@ -452,7 +452,7 @@ Interceptor.attach(Module.getExportByName('libsystem_kernel.dylib', 'open'), () 204 | } 205 | 206 | void * main_func_symbol; 207 | - var main_func_found = module.symbol ("frida_agent_main", out main_func_symbol); 208 | + var main_func_found = module.symbol ("main", out main_func_symbol); 209 | assert_true (main_func_found); 210 | main_impl = (AgentMainFunc) main_func_symbol; 211 | 212 | diff --git a/tests/test-injector.vala b/tests/test-injector.vala 213 | index 03c219e6..a7720c3d 100644 214 | --- a/tests/test-injector.vala 215 | +++ b/tests/test-injector.vala 216 | @@ -258,7 +258,7 @@ namespace Frida.InjectorTest { 217 | var path = Frida.Test.Labrats.path_to_library (name, arch); 218 | assert_true (FileUtils.test (path, FileTest.EXISTS)); 219 | 220 | - yield injector.inject_library_file (process.id, path, "frida_agent_main", data); 221 | + yield injector.inject_library_file (process.id, path, "main", data); 222 | } catch (GLib.Error e) { 223 | printerr ("\nFAIL: %s\n\n", e.message); 224 | assert_not_reached (); 225 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.3" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "autocfg" 31 | version = "1.4.0" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 34 | 35 | [[package]] 36 | name = "backtrace" 37 | version = "0.3.74" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 40 | dependencies = [ 41 | "addr2line", 42 | "cfg-if", 43 | "libc", 44 | "miniz_oxide", 45 | "object", 46 | "rustc-demangle", 47 | "windows-targets", 48 | ] 49 | 50 | [[package]] 51 | name = "base64" 52 | version = "0.22.1" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 55 | 56 | [[package]] 57 | name = "bindgen" 58 | version = "0.69.5" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" 61 | dependencies = [ 62 | "bitflags", 63 | "cexpr", 64 | "clang-sys", 65 | "itertools", 66 | "lazy_static", 67 | "lazycell", 68 | "log", 69 | "prettyplease", 70 | "proc-macro2", 71 | "quote", 72 | "regex", 73 | "rustc-hash 1.1.0", 74 | "shlex", 75 | "syn", 76 | "which", 77 | ] 78 | 79 | [[package]] 80 | name = "bitflags" 81 | version = "2.8.0" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 84 | 85 | [[package]] 86 | name = "build-target" 87 | version = "0.4.0" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "832133bbabbbaa9fbdba793456a2827627a7d2b8fb96032fa1e7666d7895832b" 90 | 91 | [[package]] 92 | name = "bumpalo" 93 | version = "3.16.0" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 96 | 97 | [[package]] 98 | name = "byteorder" 99 | version = "1.5.0" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 102 | 103 | [[package]] 104 | name = "bytes" 105 | version = "1.9.0" 106 | source = "registry+https://github.com/rust-lang/crates.io-index" 107 | checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" 108 | 109 | [[package]] 110 | name = "cc" 111 | version = "1.2.10" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" 114 | dependencies = [ 115 | "shlex", 116 | ] 117 | 118 | [[package]] 119 | name = "cexpr" 120 | version = "0.6.0" 121 | source = "registry+https://github.com/rust-lang/crates.io-index" 122 | checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 123 | dependencies = [ 124 | "nom", 125 | ] 126 | 127 | [[package]] 128 | name = "cfg-if" 129 | version = "1.0.0" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 132 | 133 | [[package]] 134 | name = "cfg_aliases" 135 | version = "0.2.1" 136 | source = "registry+https://github.com/rust-lang/crates.io-index" 137 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 138 | 139 | [[package]] 140 | name = "clang-sys" 141 | version = "1.8.1" 142 | source = "registry+https://github.com/rust-lang/crates.io-index" 143 | checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 144 | dependencies = [ 145 | "glob", 146 | "libc", 147 | "libloading", 148 | ] 149 | 150 | [[package]] 151 | name = "ctor" 152 | version = "0.2.9" 153 | source = "registry+https://github.com/rust-lang/crates.io-index" 154 | checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" 155 | dependencies = [ 156 | "quote", 157 | "syn", 158 | ] 159 | 160 | [[package]] 161 | name = "diff" 162 | version = "0.1.13" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" 165 | 166 | [[package]] 167 | name = "displaydoc" 168 | version = "0.2.5" 169 | source = "registry+https://github.com/rust-lang/crates.io-index" 170 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 171 | dependencies = [ 172 | "proc-macro2", 173 | "quote", 174 | "syn", 175 | ] 176 | 177 | [[package]] 178 | name = "either" 179 | version = "1.13.0" 180 | source = "registry+https://github.com/rust-lang/crates.io-index" 181 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 182 | 183 | [[package]] 184 | name = "equivalent" 185 | version = "1.0.1" 186 | source = "registry+https://github.com/rust-lang/crates.io-index" 187 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 188 | 189 | [[package]] 190 | name = "errno" 191 | version = "0.3.10" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 194 | dependencies = [ 195 | "libc", 196 | "windows-sys 0.59.0", 197 | ] 198 | 199 | [[package]] 200 | name = "filetime" 201 | version = "0.2.25" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" 204 | dependencies = [ 205 | "cfg-if", 206 | "libc", 207 | "libredox", 208 | "windows-sys 0.59.0", 209 | ] 210 | 211 | [[package]] 212 | name = "fnv" 213 | version = "1.0.7" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 216 | 217 | [[package]] 218 | name = "form_urlencoded" 219 | version = "1.2.1" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 222 | dependencies = [ 223 | "percent-encoding", 224 | ] 225 | 226 | [[package]] 227 | name = "frida" 228 | version = "0.16.5" 229 | source = "registry+https://github.com/rust-lang/crates.io-index" 230 | checksum = "ec80005868be4c08d7cce0189ea4ca4ac5d8b3f25431cb8d1c1879307973918b" 231 | dependencies = [ 232 | "frida-sys", 233 | "serde", 234 | "serde_json", 235 | "thiserror 1.0.69", 236 | ] 237 | 238 | [[package]] 239 | name = "frida-build" 240 | version = "0.16.5" 241 | source = "registry+https://github.com/rust-lang/crates.io-index" 242 | checksum = "6944fcc3e254c75afbb68ef72b1b888fb330971a45cf27fdcb9f27516b35a6a3" 243 | dependencies = [ 244 | "reqwest", 245 | "tar", 246 | "xz", 247 | ] 248 | 249 | [[package]] 250 | name = "frida-sys" 251 | version = "0.16.5" 252 | source = "registry+https://github.com/rust-lang/crates.io-index" 253 | checksum = "f0207ec966adf339980d6f107f2aeee52f55e504915f73cf95ae8e9bc636c85f" 254 | dependencies = [ 255 | "bindgen", 256 | "frida-build", 257 | ] 258 | 259 | [[package]] 260 | name = "futures-channel" 261 | version = "0.3.31" 262 | source = "registry+https://github.com/rust-lang/crates.io-index" 263 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 264 | dependencies = [ 265 | "futures-core", 266 | "futures-sink", 267 | ] 268 | 269 | [[package]] 270 | name = "futures-core" 271 | version = "0.3.31" 272 | source = "registry+https://github.com/rust-lang/crates.io-index" 273 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 274 | 275 | [[package]] 276 | name = "futures-io" 277 | version = "0.3.31" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 280 | 281 | [[package]] 282 | name = "futures-sink" 283 | version = "0.3.31" 284 | source = "registry+https://github.com/rust-lang/crates.io-index" 285 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 286 | 287 | [[package]] 288 | name = "futures-task" 289 | version = "0.3.31" 290 | source = "registry+https://github.com/rust-lang/crates.io-index" 291 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 292 | 293 | [[package]] 294 | name = "futures-util" 295 | version = "0.3.31" 296 | source = "registry+https://github.com/rust-lang/crates.io-index" 297 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 298 | dependencies = [ 299 | "futures-core", 300 | "futures-io", 301 | "futures-sink", 302 | "futures-task", 303 | "memchr", 304 | "pin-project-lite", 305 | "pin-utils", 306 | "slab", 307 | ] 308 | 309 | [[package]] 310 | name = "getrandom" 311 | version = "0.2.15" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 314 | dependencies = [ 315 | "cfg-if", 316 | "js-sys", 317 | "libc", 318 | "wasi", 319 | "wasm-bindgen", 320 | ] 321 | 322 | [[package]] 323 | name = "gimli" 324 | version = "0.31.1" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 327 | 328 | [[package]] 329 | name = "glob" 330 | version = "0.3.2" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 333 | 334 | [[package]] 335 | name = "goblin" 336 | version = "0.9.3" 337 | source = "registry+https://github.com/rust-lang/crates.io-index" 338 | checksum = "daa0a64d21a7eb230583b4c5f4e23b7e4e57974f96620f42a7e75e08ae66d745" 339 | dependencies = [ 340 | "log", 341 | "plain", 342 | "scroll", 343 | ] 344 | 345 | [[package]] 346 | name = "hashbrown" 347 | version = "0.15.2" 348 | source = "registry+https://github.com/rust-lang/crates.io-index" 349 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 350 | 351 | [[package]] 352 | name = "home" 353 | version = "0.5.11" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 356 | dependencies = [ 357 | "windows-sys 0.59.0", 358 | ] 359 | 360 | [[package]] 361 | name = "http" 362 | version = "1.2.0" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" 365 | dependencies = [ 366 | "bytes", 367 | "fnv", 368 | "itoa", 369 | ] 370 | 371 | [[package]] 372 | name = "http-body" 373 | version = "1.0.1" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 376 | dependencies = [ 377 | "bytes", 378 | "http", 379 | ] 380 | 381 | [[package]] 382 | name = "http-body-util" 383 | version = "0.1.2" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" 386 | dependencies = [ 387 | "bytes", 388 | "futures-util", 389 | "http", 390 | "http-body", 391 | "pin-project-lite", 392 | ] 393 | 394 | [[package]] 395 | name = "httparse" 396 | version = "1.9.5" 397 | source = "registry+https://github.com/rust-lang/crates.io-index" 398 | checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" 399 | 400 | [[package]] 401 | name = "hyper" 402 | version = "1.5.2" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" 405 | dependencies = [ 406 | "bytes", 407 | "futures-channel", 408 | "futures-util", 409 | "http", 410 | "http-body", 411 | "httparse", 412 | "itoa", 413 | "pin-project-lite", 414 | "smallvec", 415 | "tokio", 416 | "want", 417 | ] 418 | 419 | [[package]] 420 | name = "hyper-rustls" 421 | version = "0.27.5" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" 424 | dependencies = [ 425 | "futures-util", 426 | "http", 427 | "hyper", 428 | "hyper-util", 429 | "rustls", 430 | "rustls-pki-types", 431 | "tokio", 432 | "tokio-rustls", 433 | "tower-service", 434 | "webpki-roots", 435 | ] 436 | 437 | [[package]] 438 | name = "hyper-util" 439 | version = "0.1.10" 440 | source = "registry+https://github.com/rust-lang/crates.io-index" 441 | checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" 442 | dependencies = [ 443 | "bytes", 444 | "futures-channel", 445 | "futures-util", 446 | "http", 447 | "http-body", 448 | "hyper", 449 | "pin-project-lite", 450 | "socket2", 451 | "tokio", 452 | "tower-service", 453 | "tracing", 454 | ] 455 | 456 | [[package]] 457 | name = "icu_collections" 458 | version = "1.5.0" 459 | source = "registry+https://github.com/rust-lang/crates.io-index" 460 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 461 | dependencies = [ 462 | "displaydoc", 463 | "yoke", 464 | "zerofrom", 465 | "zerovec", 466 | ] 467 | 468 | [[package]] 469 | name = "icu_locid" 470 | version = "1.5.0" 471 | source = "registry+https://github.com/rust-lang/crates.io-index" 472 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 473 | dependencies = [ 474 | "displaydoc", 475 | "litemap", 476 | "tinystr", 477 | "writeable", 478 | "zerovec", 479 | ] 480 | 481 | [[package]] 482 | name = "icu_locid_transform" 483 | version = "1.5.0" 484 | source = "registry+https://github.com/rust-lang/crates.io-index" 485 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 486 | dependencies = [ 487 | "displaydoc", 488 | "icu_locid", 489 | "icu_locid_transform_data", 490 | "icu_provider", 491 | "tinystr", 492 | "zerovec", 493 | ] 494 | 495 | [[package]] 496 | name = "icu_locid_transform_data" 497 | version = "1.5.0" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 500 | 501 | [[package]] 502 | name = "icu_normalizer" 503 | version = "1.5.0" 504 | source = "registry+https://github.com/rust-lang/crates.io-index" 505 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 506 | dependencies = [ 507 | "displaydoc", 508 | "icu_collections", 509 | "icu_normalizer_data", 510 | "icu_properties", 511 | "icu_provider", 512 | "smallvec", 513 | "utf16_iter", 514 | "utf8_iter", 515 | "write16", 516 | "zerovec", 517 | ] 518 | 519 | [[package]] 520 | name = "icu_normalizer_data" 521 | version = "1.5.0" 522 | source = "registry+https://github.com/rust-lang/crates.io-index" 523 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 524 | 525 | [[package]] 526 | name = "icu_properties" 527 | version = "1.5.1" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 530 | dependencies = [ 531 | "displaydoc", 532 | "icu_collections", 533 | "icu_locid_transform", 534 | "icu_properties_data", 535 | "icu_provider", 536 | "tinystr", 537 | "zerovec", 538 | ] 539 | 540 | [[package]] 541 | name = "icu_properties_data" 542 | version = "1.5.0" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 545 | 546 | [[package]] 547 | name = "icu_provider" 548 | version = "1.5.0" 549 | source = "registry+https://github.com/rust-lang/crates.io-index" 550 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 551 | dependencies = [ 552 | "displaydoc", 553 | "icu_locid", 554 | "icu_provider_macros", 555 | "stable_deref_trait", 556 | "tinystr", 557 | "writeable", 558 | "yoke", 559 | "zerofrom", 560 | "zerovec", 561 | ] 562 | 563 | [[package]] 564 | name = "icu_provider_macros" 565 | version = "1.5.0" 566 | source = "registry+https://github.com/rust-lang/crates.io-index" 567 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 568 | dependencies = [ 569 | "proc-macro2", 570 | "quote", 571 | "syn", 572 | ] 573 | 574 | [[package]] 575 | name = "idna" 576 | version = "1.0.3" 577 | source = "registry+https://github.com/rust-lang/crates.io-index" 578 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 579 | dependencies = [ 580 | "idna_adapter", 581 | "smallvec", 582 | "utf8_iter", 583 | ] 584 | 585 | [[package]] 586 | name = "idna_adapter" 587 | version = "1.2.0" 588 | source = "registry+https://github.com/rust-lang/crates.io-index" 589 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 590 | dependencies = [ 591 | "icu_normalizer", 592 | "icu_properties", 593 | ] 594 | 595 | [[package]] 596 | name = "indexmap" 597 | version = "2.7.0" 598 | source = "registry+https://github.com/rust-lang/crates.io-index" 599 | checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" 600 | dependencies = [ 601 | "equivalent", 602 | "hashbrown", 603 | ] 604 | 605 | [[package]] 606 | name = "injectionforge" 607 | version = "0.1.0" 608 | dependencies = [ 609 | "build-target", 610 | "ctor", 611 | "frida", 612 | "goblin", 613 | "lazy_static", 614 | "mylib", 615 | "pretty_assertions", 616 | "serde", 617 | "serde_json", 618 | "toml", 619 | "winapi", 620 | "windows-sys 0.59.0", 621 | ] 622 | 623 | [[package]] 624 | name = "ipnet" 625 | version = "2.10.1" 626 | source = "registry+https://github.com/rust-lang/crates.io-index" 627 | checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" 628 | 629 | [[package]] 630 | name = "itertools" 631 | version = "0.12.1" 632 | source = "registry+https://github.com/rust-lang/crates.io-index" 633 | checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 634 | dependencies = [ 635 | "either", 636 | ] 637 | 638 | [[package]] 639 | name = "itoa" 640 | version = "1.0.14" 641 | source = "registry+https://github.com/rust-lang/crates.io-index" 642 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 643 | 644 | [[package]] 645 | name = "js-sys" 646 | version = "0.3.77" 647 | source = "registry+https://github.com/rust-lang/crates.io-index" 648 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 649 | dependencies = [ 650 | "once_cell", 651 | "wasm-bindgen", 652 | ] 653 | 654 | [[package]] 655 | name = "lazy_static" 656 | version = "1.5.0" 657 | source = "registry+https://github.com/rust-lang/crates.io-index" 658 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 659 | 660 | [[package]] 661 | name = "lazycell" 662 | version = "1.3.0" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" 665 | 666 | [[package]] 667 | name = "libc" 668 | version = "0.2.169" 669 | source = "registry+https://github.com/rust-lang/crates.io-index" 670 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 671 | 672 | [[package]] 673 | name = "libloading" 674 | version = "0.8.6" 675 | source = "registry+https://github.com/rust-lang/crates.io-index" 676 | checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 677 | dependencies = [ 678 | "cfg-if", 679 | "windows-targets", 680 | ] 681 | 682 | [[package]] 683 | name = "libredox" 684 | version = "0.1.3" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 687 | dependencies = [ 688 | "bitflags", 689 | "libc", 690 | "redox_syscall", 691 | ] 692 | 693 | [[package]] 694 | name = "linux-raw-sys" 695 | version = "0.4.15" 696 | source = "registry+https://github.com/rust-lang/crates.io-index" 697 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 698 | 699 | [[package]] 700 | name = "litemap" 701 | version = "0.7.4" 702 | source = "registry+https://github.com/rust-lang/crates.io-index" 703 | checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" 704 | 705 | [[package]] 706 | name = "log" 707 | version = "0.4.25" 708 | source = "registry+https://github.com/rust-lang/crates.io-index" 709 | checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" 710 | 711 | [[package]] 712 | name = "lzma-sys" 713 | version = "0.1.20" 714 | source = "registry+https://github.com/rust-lang/crates.io-index" 715 | checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" 716 | dependencies = [ 717 | "cc", 718 | "libc", 719 | "pkg-config", 720 | ] 721 | 722 | [[package]] 723 | name = "memchr" 724 | version = "2.7.4" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 727 | 728 | [[package]] 729 | name = "mime" 730 | version = "0.3.17" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 733 | 734 | [[package]] 735 | name = "minimal-lexical" 736 | version = "0.2.1" 737 | source = "registry+https://github.com/rust-lang/crates.io-index" 738 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 739 | 740 | [[package]] 741 | name = "miniz_oxide" 742 | version = "0.8.3" 743 | source = "registry+https://github.com/rust-lang/crates.io-index" 744 | checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" 745 | dependencies = [ 746 | "adler2", 747 | ] 748 | 749 | [[package]] 750 | name = "mio" 751 | version = "1.0.3" 752 | source = "registry+https://github.com/rust-lang/crates.io-index" 753 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 754 | dependencies = [ 755 | "libc", 756 | "wasi", 757 | "windows-sys 0.52.0", 758 | ] 759 | 760 | [[package]] 761 | name = "mylib" 762 | version = "0.1.0" 763 | 764 | [[package]] 765 | name = "nom" 766 | version = "7.1.3" 767 | source = "registry+https://github.com/rust-lang/crates.io-index" 768 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 769 | dependencies = [ 770 | "memchr", 771 | "minimal-lexical", 772 | ] 773 | 774 | [[package]] 775 | name = "object" 776 | version = "0.36.7" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 779 | dependencies = [ 780 | "memchr", 781 | ] 782 | 783 | [[package]] 784 | name = "once_cell" 785 | version = "1.20.2" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 788 | 789 | [[package]] 790 | name = "percent-encoding" 791 | version = "2.3.1" 792 | source = "registry+https://github.com/rust-lang/crates.io-index" 793 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 794 | 795 | [[package]] 796 | name = "pin-project-lite" 797 | version = "0.2.16" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 800 | 801 | [[package]] 802 | name = "pin-utils" 803 | version = "0.1.0" 804 | source = "registry+https://github.com/rust-lang/crates.io-index" 805 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 806 | 807 | [[package]] 808 | name = "pkg-config" 809 | version = "0.3.31" 810 | source = "registry+https://github.com/rust-lang/crates.io-index" 811 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 812 | 813 | [[package]] 814 | name = "plain" 815 | version = "0.2.3" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" 818 | 819 | [[package]] 820 | name = "ppv-lite86" 821 | version = "0.2.20" 822 | source = "registry+https://github.com/rust-lang/crates.io-index" 823 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 824 | dependencies = [ 825 | "zerocopy", 826 | ] 827 | 828 | [[package]] 829 | name = "pretty_assertions" 830 | version = "1.4.1" 831 | source = "registry+https://github.com/rust-lang/crates.io-index" 832 | checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" 833 | dependencies = [ 834 | "diff", 835 | "yansi", 836 | ] 837 | 838 | [[package]] 839 | name = "prettyplease" 840 | version = "0.2.29" 841 | source = "registry+https://github.com/rust-lang/crates.io-index" 842 | checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" 843 | dependencies = [ 844 | "proc-macro2", 845 | "syn", 846 | ] 847 | 848 | [[package]] 849 | name = "proc-macro2" 850 | version = "1.0.93" 851 | source = "registry+https://github.com/rust-lang/crates.io-index" 852 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 853 | dependencies = [ 854 | "unicode-ident", 855 | ] 856 | 857 | [[package]] 858 | name = "quinn" 859 | version = "0.11.6" 860 | source = "registry+https://github.com/rust-lang/crates.io-index" 861 | checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" 862 | dependencies = [ 863 | "bytes", 864 | "pin-project-lite", 865 | "quinn-proto", 866 | "quinn-udp", 867 | "rustc-hash 2.1.0", 868 | "rustls", 869 | "socket2", 870 | "thiserror 2.0.11", 871 | "tokio", 872 | "tracing", 873 | ] 874 | 875 | [[package]] 876 | name = "quinn-proto" 877 | version = "0.11.9" 878 | source = "registry+https://github.com/rust-lang/crates.io-index" 879 | checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" 880 | dependencies = [ 881 | "bytes", 882 | "getrandom", 883 | "rand", 884 | "ring", 885 | "rustc-hash 2.1.0", 886 | "rustls", 887 | "rustls-pki-types", 888 | "slab", 889 | "thiserror 2.0.11", 890 | "tinyvec", 891 | "tracing", 892 | "web-time", 893 | ] 894 | 895 | [[package]] 896 | name = "quinn-udp" 897 | version = "0.5.9" 898 | source = "registry+https://github.com/rust-lang/crates.io-index" 899 | checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" 900 | dependencies = [ 901 | "cfg_aliases", 902 | "libc", 903 | "once_cell", 904 | "socket2", 905 | "tracing", 906 | "windows-sys 0.59.0", 907 | ] 908 | 909 | [[package]] 910 | name = "quote" 911 | version = "1.0.38" 912 | source = "registry+https://github.com/rust-lang/crates.io-index" 913 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 914 | dependencies = [ 915 | "proc-macro2", 916 | ] 917 | 918 | [[package]] 919 | name = "rand" 920 | version = "0.8.5" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 923 | dependencies = [ 924 | "libc", 925 | "rand_chacha", 926 | "rand_core", 927 | ] 928 | 929 | [[package]] 930 | name = "rand_chacha" 931 | version = "0.3.1" 932 | source = "registry+https://github.com/rust-lang/crates.io-index" 933 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 934 | dependencies = [ 935 | "ppv-lite86", 936 | "rand_core", 937 | ] 938 | 939 | [[package]] 940 | name = "rand_core" 941 | version = "0.6.4" 942 | source = "registry+https://github.com/rust-lang/crates.io-index" 943 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 944 | dependencies = [ 945 | "getrandom", 946 | ] 947 | 948 | [[package]] 949 | name = "redox_syscall" 950 | version = "0.5.8" 951 | source = "registry+https://github.com/rust-lang/crates.io-index" 952 | checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 953 | dependencies = [ 954 | "bitflags", 955 | ] 956 | 957 | [[package]] 958 | name = "regex" 959 | version = "1.11.1" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 962 | dependencies = [ 963 | "aho-corasick", 964 | "memchr", 965 | "regex-automata", 966 | "regex-syntax", 967 | ] 968 | 969 | [[package]] 970 | name = "regex-automata" 971 | version = "0.4.9" 972 | source = "registry+https://github.com/rust-lang/crates.io-index" 973 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 974 | dependencies = [ 975 | "aho-corasick", 976 | "memchr", 977 | "regex-syntax", 978 | ] 979 | 980 | [[package]] 981 | name = "regex-syntax" 982 | version = "0.8.5" 983 | source = "registry+https://github.com/rust-lang/crates.io-index" 984 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 985 | 986 | [[package]] 987 | name = "reqwest" 988 | version = "0.12.12" 989 | source = "registry+https://github.com/rust-lang/crates.io-index" 990 | checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" 991 | dependencies = [ 992 | "base64", 993 | "bytes", 994 | "futures-channel", 995 | "futures-core", 996 | "futures-util", 997 | "http", 998 | "http-body", 999 | "http-body-util", 1000 | "hyper", 1001 | "hyper-rustls", 1002 | "hyper-util", 1003 | "ipnet", 1004 | "js-sys", 1005 | "log", 1006 | "mime", 1007 | "once_cell", 1008 | "percent-encoding", 1009 | "pin-project-lite", 1010 | "quinn", 1011 | "rustls", 1012 | "rustls-pemfile", 1013 | "rustls-pki-types", 1014 | "serde", 1015 | "serde_json", 1016 | "serde_urlencoded", 1017 | "sync_wrapper", 1018 | "tokio", 1019 | "tokio-rustls", 1020 | "tower", 1021 | "tower-service", 1022 | "url", 1023 | "wasm-bindgen", 1024 | "wasm-bindgen-futures", 1025 | "web-sys", 1026 | "webpki-roots", 1027 | "windows-registry", 1028 | ] 1029 | 1030 | [[package]] 1031 | name = "ring" 1032 | version = "0.17.8" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 1035 | dependencies = [ 1036 | "cc", 1037 | "cfg-if", 1038 | "getrandom", 1039 | "libc", 1040 | "spin", 1041 | "untrusted", 1042 | "windows-sys 0.52.0", 1043 | ] 1044 | 1045 | [[package]] 1046 | name = "rustc-demangle" 1047 | version = "0.1.24" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1050 | 1051 | [[package]] 1052 | name = "rustc-hash" 1053 | version = "1.1.0" 1054 | source = "registry+https://github.com/rust-lang/crates.io-index" 1055 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1056 | 1057 | [[package]] 1058 | name = "rustc-hash" 1059 | version = "2.1.0" 1060 | source = "registry+https://github.com/rust-lang/crates.io-index" 1061 | checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" 1062 | 1063 | [[package]] 1064 | name = "rustix" 1065 | version = "0.38.43" 1066 | source = "registry+https://github.com/rust-lang/crates.io-index" 1067 | checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" 1068 | dependencies = [ 1069 | "bitflags", 1070 | "errno", 1071 | "libc", 1072 | "linux-raw-sys", 1073 | "windows-sys 0.59.0", 1074 | ] 1075 | 1076 | [[package]] 1077 | name = "rustls" 1078 | version = "0.23.21" 1079 | source = "registry+https://github.com/rust-lang/crates.io-index" 1080 | checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" 1081 | dependencies = [ 1082 | "once_cell", 1083 | "ring", 1084 | "rustls-pki-types", 1085 | "rustls-webpki", 1086 | "subtle", 1087 | "zeroize", 1088 | ] 1089 | 1090 | [[package]] 1091 | name = "rustls-pemfile" 1092 | version = "2.2.0" 1093 | source = "registry+https://github.com/rust-lang/crates.io-index" 1094 | checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" 1095 | dependencies = [ 1096 | "rustls-pki-types", 1097 | ] 1098 | 1099 | [[package]] 1100 | name = "rustls-pki-types" 1101 | version = "1.10.1" 1102 | source = "registry+https://github.com/rust-lang/crates.io-index" 1103 | checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" 1104 | dependencies = [ 1105 | "web-time", 1106 | ] 1107 | 1108 | [[package]] 1109 | name = "rustls-webpki" 1110 | version = "0.102.8" 1111 | source = "registry+https://github.com/rust-lang/crates.io-index" 1112 | checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" 1113 | dependencies = [ 1114 | "ring", 1115 | "rustls-pki-types", 1116 | "untrusted", 1117 | ] 1118 | 1119 | [[package]] 1120 | name = "rustversion" 1121 | version = "1.0.19" 1122 | source = "registry+https://github.com/rust-lang/crates.io-index" 1123 | checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 1124 | 1125 | [[package]] 1126 | name = "ryu" 1127 | version = "1.0.18" 1128 | source = "registry+https://github.com/rust-lang/crates.io-index" 1129 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 1130 | 1131 | [[package]] 1132 | name = "scroll" 1133 | version = "0.12.0" 1134 | source = "registry+https://github.com/rust-lang/crates.io-index" 1135 | checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" 1136 | dependencies = [ 1137 | "scroll_derive", 1138 | ] 1139 | 1140 | [[package]] 1141 | name = "scroll_derive" 1142 | version = "0.12.0" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | checksum = "7f81c2fde025af7e69b1d1420531c8a8811ca898919db177141a85313b1cb932" 1145 | dependencies = [ 1146 | "proc-macro2", 1147 | "quote", 1148 | "syn", 1149 | ] 1150 | 1151 | [[package]] 1152 | name = "serde" 1153 | version = "1.0.217" 1154 | source = "registry+https://github.com/rust-lang/crates.io-index" 1155 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 1156 | dependencies = [ 1157 | "serde_derive", 1158 | ] 1159 | 1160 | [[package]] 1161 | name = "serde_derive" 1162 | version = "1.0.217" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 1165 | dependencies = [ 1166 | "proc-macro2", 1167 | "quote", 1168 | "syn", 1169 | ] 1170 | 1171 | [[package]] 1172 | name = "serde_json" 1173 | version = "1.0.135" 1174 | source = "registry+https://github.com/rust-lang/crates.io-index" 1175 | checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" 1176 | dependencies = [ 1177 | "itoa", 1178 | "memchr", 1179 | "ryu", 1180 | "serde", 1181 | ] 1182 | 1183 | [[package]] 1184 | name = "serde_spanned" 1185 | version = "0.6.8" 1186 | source = "registry+https://github.com/rust-lang/crates.io-index" 1187 | checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" 1188 | dependencies = [ 1189 | "serde", 1190 | ] 1191 | 1192 | [[package]] 1193 | name = "serde_urlencoded" 1194 | version = "0.7.1" 1195 | source = "registry+https://github.com/rust-lang/crates.io-index" 1196 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1197 | dependencies = [ 1198 | "form_urlencoded", 1199 | "itoa", 1200 | "ryu", 1201 | "serde", 1202 | ] 1203 | 1204 | [[package]] 1205 | name = "shlex" 1206 | version = "1.3.0" 1207 | source = "registry+https://github.com/rust-lang/crates.io-index" 1208 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1209 | 1210 | [[package]] 1211 | name = "slab" 1212 | version = "0.4.9" 1213 | source = "registry+https://github.com/rust-lang/crates.io-index" 1214 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1215 | dependencies = [ 1216 | "autocfg", 1217 | ] 1218 | 1219 | [[package]] 1220 | name = "smallvec" 1221 | version = "1.13.2" 1222 | source = "registry+https://github.com/rust-lang/crates.io-index" 1223 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1224 | 1225 | [[package]] 1226 | name = "socket2" 1227 | version = "0.5.8" 1228 | source = "registry+https://github.com/rust-lang/crates.io-index" 1229 | checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" 1230 | dependencies = [ 1231 | "libc", 1232 | "windows-sys 0.52.0", 1233 | ] 1234 | 1235 | [[package]] 1236 | name = "spin" 1237 | version = "0.9.8" 1238 | source = "registry+https://github.com/rust-lang/crates.io-index" 1239 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1240 | 1241 | [[package]] 1242 | name = "stable_deref_trait" 1243 | version = "1.2.0" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1246 | 1247 | [[package]] 1248 | name = "subtle" 1249 | version = "2.6.1" 1250 | source = "registry+https://github.com/rust-lang/crates.io-index" 1251 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1252 | 1253 | [[package]] 1254 | name = "syn" 1255 | version = "2.0.96" 1256 | source = "registry+https://github.com/rust-lang/crates.io-index" 1257 | checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" 1258 | dependencies = [ 1259 | "proc-macro2", 1260 | "quote", 1261 | "unicode-ident", 1262 | ] 1263 | 1264 | [[package]] 1265 | name = "sync_wrapper" 1266 | version = "1.0.2" 1267 | source = "registry+https://github.com/rust-lang/crates.io-index" 1268 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 1269 | dependencies = [ 1270 | "futures-core", 1271 | ] 1272 | 1273 | [[package]] 1274 | name = "synstructure" 1275 | version = "0.13.1" 1276 | source = "registry+https://github.com/rust-lang/crates.io-index" 1277 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 1278 | dependencies = [ 1279 | "proc-macro2", 1280 | "quote", 1281 | "syn", 1282 | ] 1283 | 1284 | [[package]] 1285 | name = "tar" 1286 | version = "0.4.43" 1287 | source = "registry+https://github.com/rust-lang/crates.io-index" 1288 | checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" 1289 | dependencies = [ 1290 | "filetime", 1291 | "libc", 1292 | "xattr", 1293 | ] 1294 | 1295 | [[package]] 1296 | name = "thiserror" 1297 | version = "1.0.69" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1300 | dependencies = [ 1301 | "thiserror-impl 1.0.69", 1302 | ] 1303 | 1304 | [[package]] 1305 | name = "thiserror" 1306 | version = "2.0.11" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" 1309 | dependencies = [ 1310 | "thiserror-impl 2.0.11", 1311 | ] 1312 | 1313 | [[package]] 1314 | name = "thiserror-impl" 1315 | version = "1.0.69" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1318 | dependencies = [ 1319 | "proc-macro2", 1320 | "quote", 1321 | "syn", 1322 | ] 1323 | 1324 | [[package]] 1325 | name = "thiserror-impl" 1326 | version = "2.0.11" 1327 | source = "registry+https://github.com/rust-lang/crates.io-index" 1328 | checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" 1329 | dependencies = [ 1330 | "proc-macro2", 1331 | "quote", 1332 | "syn", 1333 | ] 1334 | 1335 | [[package]] 1336 | name = "tinystr" 1337 | version = "0.7.6" 1338 | source = "registry+https://github.com/rust-lang/crates.io-index" 1339 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 1340 | dependencies = [ 1341 | "displaydoc", 1342 | "zerovec", 1343 | ] 1344 | 1345 | [[package]] 1346 | name = "tinyvec" 1347 | version = "1.8.1" 1348 | source = "registry+https://github.com/rust-lang/crates.io-index" 1349 | checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" 1350 | dependencies = [ 1351 | "tinyvec_macros", 1352 | ] 1353 | 1354 | [[package]] 1355 | name = "tinyvec_macros" 1356 | version = "0.1.1" 1357 | source = "registry+https://github.com/rust-lang/crates.io-index" 1358 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1359 | 1360 | [[package]] 1361 | name = "tokio" 1362 | version = "1.43.0" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" 1365 | dependencies = [ 1366 | "backtrace", 1367 | "bytes", 1368 | "libc", 1369 | "mio", 1370 | "pin-project-lite", 1371 | "socket2", 1372 | "windows-sys 0.52.0", 1373 | ] 1374 | 1375 | [[package]] 1376 | name = "tokio-rustls" 1377 | version = "0.26.1" 1378 | source = "registry+https://github.com/rust-lang/crates.io-index" 1379 | checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" 1380 | dependencies = [ 1381 | "rustls", 1382 | "tokio", 1383 | ] 1384 | 1385 | [[package]] 1386 | name = "toml" 1387 | version = "0.8.19" 1388 | source = "registry+https://github.com/rust-lang/crates.io-index" 1389 | checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" 1390 | dependencies = [ 1391 | "serde", 1392 | "serde_spanned", 1393 | "toml_datetime", 1394 | "toml_edit", 1395 | ] 1396 | 1397 | [[package]] 1398 | name = "toml_datetime" 1399 | version = "0.6.8" 1400 | source = "registry+https://github.com/rust-lang/crates.io-index" 1401 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 1402 | dependencies = [ 1403 | "serde", 1404 | ] 1405 | 1406 | [[package]] 1407 | name = "toml_edit" 1408 | version = "0.22.22" 1409 | source = "registry+https://github.com/rust-lang/crates.io-index" 1410 | checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" 1411 | dependencies = [ 1412 | "indexmap", 1413 | "serde", 1414 | "serde_spanned", 1415 | "toml_datetime", 1416 | "winnow", 1417 | ] 1418 | 1419 | [[package]] 1420 | name = "tower" 1421 | version = "0.5.2" 1422 | source = "registry+https://github.com/rust-lang/crates.io-index" 1423 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 1424 | dependencies = [ 1425 | "futures-core", 1426 | "futures-util", 1427 | "pin-project-lite", 1428 | "sync_wrapper", 1429 | "tokio", 1430 | "tower-layer", 1431 | "tower-service", 1432 | ] 1433 | 1434 | [[package]] 1435 | name = "tower-layer" 1436 | version = "0.3.3" 1437 | source = "registry+https://github.com/rust-lang/crates.io-index" 1438 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 1439 | 1440 | [[package]] 1441 | name = "tower-service" 1442 | version = "0.3.3" 1443 | source = "registry+https://github.com/rust-lang/crates.io-index" 1444 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 1445 | 1446 | [[package]] 1447 | name = "tracing" 1448 | version = "0.1.41" 1449 | source = "registry+https://github.com/rust-lang/crates.io-index" 1450 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1451 | dependencies = [ 1452 | "pin-project-lite", 1453 | "tracing-core", 1454 | ] 1455 | 1456 | [[package]] 1457 | name = "tracing-core" 1458 | version = "0.1.33" 1459 | source = "registry+https://github.com/rust-lang/crates.io-index" 1460 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 1461 | dependencies = [ 1462 | "once_cell", 1463 | ] 1464 | 1465 | [[package]] 1466 | name = "try-lock" 1467 | version = "0.2.5" 1468 | source = "registry+https://github.com/rust-lang/crates.io-index" 1469 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1470 | 1471 | [[package]] 1472 | name = "unicode-ident" 1473 | version = "1.0.14" 1474 | source = "registry+https://github.com/rust-lang/crates.io-index" 1475 | checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" 1476 | 1477 | [[package]] 1478 | name = "untrusted" 1479 | version = "0.9.0" 1480 | source = "registry+https://github.com/rust-lang/crates.io-index" 1481 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1482 | 1483 | [[package]] 1484 | name = "url" 1485 | version = "2.5.4" 1486 | source = "registry+https://github.com/rust-lang/crates.io-index" 1487 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 1488 | dependencies = [ 1489 | "form_urlencoded", 1490 | "idna", 1491 | "percent-encoding", 1492 | ] 1493 | 1494 | [[package]] 1495 | name = "utf16_iter" 1496 | version = "1.0.5" 1497 | source = "registry+https://github.com/rust-lang/crates.io-index" 1498 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 1499 | 1500 | [[package]] 1501 | name = "utf8_iter" 1502 | version = "1.0.4" 1503 | source = "registry+https://github.com/rust-lang/crates.io-index" 1504 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1505 | 1506 | [[package]] 1507 | name = "want" 1508 | version = "0.3.1" 1509 | source = "registry+https://github.com/rust-lang/crates.io-index" 1510 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 1511 | dependencies = [ 1512 | "try-lock", 1513 | ] 1514 | 1515 | [[package]] 1516 | name = "wasi" 1517 | version = "0.11.0+wasi-snapshot-preview1" 1518 | source = "registry+https://github.com/rust-lang/crates.io-index" 1519 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1520 | 1521 | [[package]] 1522 | name = "wasm-bindgen" 1523 | version = "0.2.100" 1524 | source = "registry+https://github.com/rust-lang/crates.io-index" 1525 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 1526 | dependencies = [ 1527 | "cfg-if", 1528 | "once_cell", 1529 | "rustversion", 1530 | "wasm-bindgen-macro", 1531 | ] 1532 | 1533 | [[package]] 1534 | name = "wasm-bindgen-backend" 1535 | version = "0.2.100" 1536 | source = "registry+https://github.com/rust-lang/crates.io-index" 1537 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 1538 | dependencies = [ 1539 | "bumpalo", 1540 | "log", 1541 | "proc-macro2", 1542 | "quote", 1543 | "syn", 1544 | "wasm-bindgen-shared", 1545 | ] 1546 | 1547 | [[package]] 1548 | name = "wasm-bindgen-futures" 1549 | version = "0.4.50" 1550 | source = "registry+https://github.com/rust-lang/crates.io-index" 1551 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 1552 | dependencies = [ 1553 | "cfg-if", 1554 | "js-sys", 1555 | "once_cell", 1556 | "wasm-bindgen", 1557 | "web-sys", 1558 | ] 1559 | 1560 | [[package]] 1561 | name = "wasm-bindgen-macro" 1562 | version = "0.2.100" 1563 | source = "registry+https://github.com/rust-lang/crates.io-index" 1564 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 1565 | dependencies = [ 1566 | "quote", 1567 | "wasm-bindgen-macro-support", 1568 | ] 1569 | 1570 | [[package]] 1571 | name = "wasm-bindgen-macro-support" 1572 | version = "0.2.100" 1573 | source = "registry+https://github.com/rust-lang/crates.io-index" 1574 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 1575 | dependencies = [ 1576 | "proc-macro2", 1577 | "quote", 1578 | "syn", 1579 | "wasm-bindgen-backend", 1580 | "wasm-bindgen-shared", 1581 | ] 1582 | 1583 | [[package]] 1584 | name = "wasm-bindgen-shared" 1585 | version = "0.2.100" 1586 | source = "registry+https://github.com/rust-lang/crates.io-index" 1587 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 1588 | dependencies = [ 1589 | "unicode-ident", 1590 | ] 1591 | 1592 | [[package]] 1593 | name = "web-sys" 1594 | version = "0.3.77" 1595 | source = "registry+https://github.com/rust-lang/crates.io-index" 1596 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 1597 | dependencies = [ 1598 | "js-sys", 1599 | "wasm-bindgen", 1600 | ] 1601 | 1602 | [[package]] 1603 | name = "web-time" 1604 | version = "1.1.0" 1605 | source = "registry+https://github.com/rust-lang/crates.io-index" 1606 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 1607 | dependencies = [ 1608 | "js-sys", 1609 | "wasm-bindgen", 1610 | ] 1611 | 1612 | [[package]] 1613 | name = "webpki-roots" 1614 | version = "0.26.7" 1615 | source = "registry+https://github.com/rust-lang/crates.io-index" 1616 | checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" 1617 | dependencies = [ 1618 | "rustls-pki-types", 1619 | ] 1620 | 1621 | [[package]] 1622 | name = "which" 1623 | version = "4.4.2" 1624 | source = "registry+https://github.com/rust-lang/crates.io-index" 1625 | checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" 1626 | dependencies = [ 1627 | "either", 1628 | "home", 1629 | "once_cell", 1630 | "rustix", 1631 | ] 1632 | 1633 | [[package]] 1634 | name = "winapi" 1635 | version = "0.3.9" 1636 | source = "registry+https://github.com/rust-lang/crates.io-index" 1637 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1638 | dependencies = [ 1639 | "winapi-i686-pc-windows-gnu", 1640 | "winapi-x86_64-pc-windows-gnu", 1641 | ] 1642 | 1643 | [[package]] 1644 | name = "winapi-i686-pc-windows-gnu" 1645 | version = "0.4.0" 1646 | source = "registry+https://github.com/rust-lang/crates.io-index" 1647 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1648 | 1649 | [[package]] 1650 | name = "winapi-x86_64-pc-windows-gnu" 1651 | version = "0.4.0" 1652 | source = "registry+https://github.com/rust-lang/crates.io-index" 1653 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1654 | 1655 | [[package]] 1656 | name = "windows-registry" 1657 | version = "0.2.0" 1658 | source = "registry+https://github.com/rust-lang/crates.io-index" 1659 | checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" 1660 | dependencies = [ 1661 | "windows-result", 1662 | "windows-strings", 1663 | "windows-targets", 1664 | ] 1665 | 1666 | [[package]] 1667 | name = "windows-result" 1668 | version = "0.2.0" 1669 | source = "registry+https://github.com/rust-lang/crates.io-index" 1670 | checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" 1671 | dependencies = [ 1672 | "windows-targets", 1673 | ] 1674 | 1675 | [[package]] 1676 | name = "windows-strings" 1677 | version = "0.1.0" 1678 | source = "registry+https://github.com/rust-lang/crates.io-index" 1679 | checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" 1680 | dependencies = [ 1681 | "windows-result", 1682 | "windows-targets", 1683 | ] 1684 | 1685 | [[package]] 1686 | name = "windows-sys" 1687 | version = "0.52.0" 1688 | source = "registry+https://github.com/rust-lang/crates.io-index" 1689 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1690 | dependencies = [ 1691 | "windows-targets", 1692 | ] 1693 | 1694 | [[package]] 1695 | name = "windows-sys" 1696 | version = "0.59.0" 1697 | source = "registry+https://github.com/rust-lang/crates.io-index" 1698 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1699 | dependencies = [ 1700 | "windows-targets", 1701 | ] 1702 | 1703 | [[package]] 1704 | name = "windows-targets" 1705 | version = "0.52.6" 1706 | source = "registry+https://github.com/rust-lang/crates.io-index" 1707 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1708 | dependencies = [ 1709 | "windows_aarch64_gnullvm", 1710 | "windows_aarch64_msvc", 1711 | "windows_i686_gnu", 1712 | "windows_i686_gnullvm", 1713 | "windows_i686_msvc", 1714 | "windows_x86_64_gnu", 1715 | "windows_x86_64_gnullvm", 1716 | "windows_x86_64_msvc", 1717 | ] 1718 | 1719 | [[package]] 1720 | name = "windows_aarch64_gnullvm" 1721 | version = "0.52.6" 1722 | source = "registry+https://github.com/rust-lang/crates.io-index" 1723 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1724 | 1725 | [[package]] 1726 | name = "windows_aarch64_msvc" 1727 | version = "0.52.6" 1728 | source = "registry+https://github.com/rust-lang/crates.io-index" 1729 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1730 | 1731 | [[package]] 1732 | name = "windows_i686_gnu" 1733 | version = "0.52.6" 1734 | source = "registry+https://github.com/rust-lang/crates.io-index" 1735 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1736 | 1737 | [[package]] 1738 | name = "windows_i686_gnullvm" 1739 | version = "0.52.6" 1740 | source = "registry+https://github.com/rust-lang/crates.io-index" 1741 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1742 | 1743 | [[package]] 1744 | name = "windows_i686_msvc" 1745 | version = "0.52.6" 1746 | source = "registry+https://github.com/rust-lang/crates.io-index" 1747 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1748 | 1749 | [[package]] 1750 | name = "windows_x86_64_gnu" 1751 | version = "0.52.6" 1752 | source = "registry+https://github.com/rust-lang/crates.io-index" 1753 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1754 | 1755 | [[package]] 1756 | name = "windows_x86_64_gnullvm" 1757 | version = "0.52.6" 1758 | source = "registry+https://github.com/rust-lang/crates.io-index" 1759 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1760 | 1761 | [[package]] 1762 | name = "windows_x86_64_msvc" 1763 | version = "0.52.6" 1764 | source = "registry+https://github.com/rust-lang/crates.io-index" 1765 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1766 | 1767 | [[package]] 1768 | name = "winnow" 1769 | version = "0.6.24" 1770 | source = "registry+https://github.com/rust-lang/crates.io-index" 1771 | checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" 1772 | dependencies = [ 1773 | "memchr", 1774 | ] 1775 | 1776 | [[package]] 1777 | name = "write16" 1778 | version = "1.0.0" 1779 | source = "registry+https://github.com/rust-lang/crates.io-index" 1780 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 1781 | 1782 | [[package]] 1783 | name = "writeable" 1784 | version = "0.5.5" 1785 | source = "registry+https://github.com/rust-lang/crates.io-index" 1786 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 1787 | 1788 | [[package]] 1789 | name = "xattr" 1790 | version = "1.4.0" 1791 | source = "registry+https://github.com/rust-lang/crates.io-index" 1792 | checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909" 1793 | dependencies = [ 1794 | "libc", 1795 | "linux-raw-sys", 1796 | "rustix", 1797 | ] 1798 | 1799 | [[package]] 1800 | name = "xz" 1801 | version = "0.1.0" 1802 | source = "registry+https://github.com/rust-lang/crates.io-index" 1803 | checksum = "3c887690ff2a2e233e8e49633461521f98ec57fbff9d59a884c9a4f04ec1da34" 1804 | dependencies = [ 1805 | "xz2", 1806 | ] 1807 | 1808 | [[package]] 1809 | name = "xz2" 1810 | version = "0.1.7" 1811 | source = "registry+https://github.com/rust-lang/crates.io-index" 1812 | checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" 1813 | dependencies = [ 1814 | "lzma-sys", 1815 | ] 1816 | 1817 | [[package]] 1818 | name = "yansi" 1819 | version = "1.0.1" 1820 | source = "registry+https://github.com/rust-lang/crates.io-index" 1821 | checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" 1822 | 1823 | [[package]] 1824 | name = "yoke" 1825 | version = "0.7.5" 1826 | source = "registry+https://github.com/rust-lang/crates.io-index" 1827 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 1828 | dependencies = [ 1829 | "serde", 1830 | "stable_deref_trait", 1831 | "yoke-derive", 1832 | "zerofrom", 1833 | ] 1834 | 1835 | [[package]] 1836 | name = "yoke-derive" 1837 | version = "0.7.5" 1838 | source = "registry+https://github.com/rust-lang/crates.io-index" 1839 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 1840 | dependencies = [ 1841 | "proc-macro2", 1842 | "quote", 1843 | "syn", 1844 | "synstructure", 1845 | ] 1846 | 1847 | [[package]] 1848 | name = "zerocopy" 1849 | version = "0.7.35" 1850 | source = "registry+https://github.com/rust-lang/crates.io-index" 1851 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 1852 | dependencies = [ 1853 | "byteorder", 1854 | "zerocopy-derive", 1855 | ] 1856 | 1857 | [[package]] 1858 | name = "zerocopy-derive" 1859 | version = "0.7.35" 1860 | source = "registry+https://github.com/rust-lang/crates.io-index" 1861 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 1862 | dependencies = [ 1863 | "proc-macro2", 1864 | "quote", 1865 | "syn", 1866 | ] 1867 | 1868 | [[package]] 1869 | name = "zerofrom" 1870 | version = "0.1.5" 1871 | source = "registry+https://github.com/rust-lang/crates.io-index" 1872 | checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" 1873 | dependencies = [ 1874 | "zerofrom-derive", 1875 | ] 1876 | 1877 | [[package]] 1878 | name = "zerofrom-derive" 1879 | version = "0.1.5" 1880 | source = "registry+https://github.com/rust-lang/crates.io-index" 1881 | checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" 1882 | dependencies = [ 1883 | "proc-macro2", 1884 | "quote", 1885 | "syn", 1886 | "synstructure", 1887 | ] 1888 | 1889 | [[package]] 1890 | name = "zeroize" 1891 | version = "1.8.1" 1892 | source = "registry+https://github.com/rust-lang/crates.io-index" 1893 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 1894 | 1895 | [[package]] 1896 | name = "zerovec" 1897 | version = "0.10.4" 1898 | source = "registry+https://github.com/rust-lang/crates.io-index" 1899 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 1900 | dependencies = [ 1901 | "yoke", 1902 | "zerofrom", 1903 | "zerovec-derive", 1904 | ] 1905 | 1906 | [[package]] 1907 | name = "zerovec-derive" 1908 | version = "0.10.3" 1909 | source = "registry+https://github.com/rust-lang/crates.io-index" 1910 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 1911 | dependencies = [ 1912 | "proc-macro2", 1913 | "quote", 1914 | "syn", 1915 | ] 1916 | --------------------------------------------------------------------------------