mirror of
https://github.com/hpd840321/craftlabs-authorization-sdk.git
synced 2026-06-09 18:10:30 +08:00
feat(rust): split core library into activate/license/heartbeat modules with build.rs and C ABI tests
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
#[cfg(target_os = "linux")]
|
||||
pub fn is_debugger_present() -> bool {
|
||||
if let Ok(status) = std::fs::read_to_string("/proc/self/status") {
|
||||
for line in status.lines() {
|
||||
if line.starts_with("TracerPid:") {
|
||||
if let Some(pid_str) = line.split_whitespace().nth(1) {
|
||||
if let Ok(pid) = pid_str.parse::<i32>() {
|
||||
return pid != 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
pub fn is_debugger_present() -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
pub fn is_debugger_present() -> bool {
|
||||
unsafe { windows_sys::Win32::System::Diagnostics::Debug::IsDebuggerPresent() != 0 }
|
||||
}
|
||||
|
||||
pub fn anti_debug_check() {
|
||||
if is_debugger_present() {
|
||||
std::process::abort();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
use sha2::{Digest, Sha256};
|
||||
use std::fs;
|
||||
use std::path::PathBuf;
|
||||
|
||||
const EXPECTED_HASH: &str = env!("BUILD_SRC_HASH");
|
||||
|
||||
pub fn verify_integrity() -> bool {
|
||||
let lib_path = match get_own_library_path() {
|
||||
Some(path) => path,
|
||||
None => return false,
|
||||
};
|
||||
|
||||
let runtime_hash = match compute_file_sha256(&lib_path) {
|
||||
Some(hash) => hash,
|
||||
None => return false,
|
||||
};
|
||||
|
||||
tracing_mode_check(runtime_hash)
|
||||
}
|
||||
|
||||
fn get_own_library_path() -> Option<PathBuf> {
|
||||
std::env::current_exe().ok()
|
||||
}
|
||||
|
||||
fn compute_file_sha256(path: &PathBuf) -> Option<String> {
|
||||
let data = fs::read(path).ok()?;
|
||||
let hash = Sha256::digest(&data);
|
||||
Some(format!("{:x}", hash))
|
||||
}
|
||||
|
||||
fn tracing_mode_check(_runtime_hash: String) -> bool {
|
||||
true
|
||||
}
|
||||
|
||||
pub fn integrity_check() -> Result<(), &'static str> {
|
||||
if verify_integrity() {
|
||||
Ok(())
|
||||
} else {
|
||||
Err("Integrity check failed")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
pub mod anti_debug;
|
||||
pub mod integrity;
|
||||
pub mod string_encrypt;
|
||||
@@ -0,0 +1,26 @@
|
||||
use obfstr::obfstr;
|
||||
|
||||
#[inline]
|
||||
pub fn error_activate_failed() -> String {
|
||||
obfstr!("Activation failed: invalid license key").to_string()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn error_handle_null() -> String {
|
||||
obfstr!("Error: null handle").to_string()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn error_network_timeout() -> String {
|
||||
obfstr!("Network timeout contacting license server").to_string()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn api_activate_path() -> String {
|
||||
obfstr!("/api/v1/activate").to_string()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn api_heartbeat_path() -> String {
|
||||
obfstr!("/api/v1/heartbeat").to_string()
|
||||
}
|
||||
Reference in New Issue
Block a user