Add symbolic refs for fn names

This commit is contained in:
Michael Mikovsky
2026-02-20 19:23:36 -07:00
parent 689c4ac714
commit fd71e6930f
2 changed files with 41 additions and 14 deletions
+2 -2
View File
@@ -58,9 +58,9 @@ pub mod proc_impl {
use proc_macro::TokenStream; use proc_macro::TokenStream;
use syn::{LitStr, parse_macro_input}; use syn::{LitStr, parse_macro_input};
unwrap_string!(xor); passtrough!(xor, crate::obfuscate::xor);
delete!(junk_asm); delete!(junk_asm);
passtrough!(sym, crate::symbolic_ref::sym_ref); passtrough!(sym, crate::symbolic_ref::sym_ref);
unwrap_string!(sym_fn); passtrough!(sym_fn, crate::symbolic_ref::sym_ref_fn);
} }
+39 -12
View File
@@ -3,7 +3,7 @@ use std::collections::HashMap;
use base62::{Base62, hash}; use base62::{Base62, hash};
use proc_macro::TokenStream; use proc_macro::TokenStream;
use quote::quote; use quote::quote;
use syn::{LitStr, parse_macro_input}; use syn::{ItemFn, LitStr, parse_macro_input};
use crate::env::get_encryption_key; use crate::env::get_encryption_key;
@@ -15,34 +15,61 @@ pub fn get_symbol_number() -> usize {
} }
#[allow(static_mut_refs)] #[allow(static_mut_refs)]
pub fn get_symbol(text: String) -> usize { pub fn get_symbol(text: &str) -> usize {
unsafe { unsafe {
if let Some(n) = SYM_COUNTER.iter().position(|r| r == &text) { if let Some(n) = SYM_COUNTER.iter().position(|r| r == text) {
n n
} else { } else {
SYM_COUNTER.push(text); SYM_COUNTER.push(text.to_string());
SYM_COUNTER.len() - 1 SYM_COUNTER.len() - 1
} }
} }
} }
fn ref_string(input: String) -> String {
let n = get_symbol(&input);
let data = base62::encode_usize(n);
let key = hash(&get_encryption_key().as_bytes());
let encoded = format!("_{}_", Base62::encode_full(&data, &key));
println!("Aliased '{}' as '{encoded}'", input);
encoded
}
pub fn sym_ref(input: TokenStream) -> TokenStream { pub fn sym_ref(input: TokenStream) -> TokenStream {
// Parse the input as a string literal // Parse the input as a string literal
let lit_str = parse_macro_input!(input as LitStr); let lit_str = parse_macro_input!(input as LitStr);
let original_name = lit_str.value(); let original_name = lit_str.value();
let n = get_symbol(original_name); let encoded = ref_string(original_name);
let data = base62::encode_usize(n);
let key = hash(&get_encryption_key().as_bytes());
let encoded = format!("_{}_", Base62::encode_full(&data, &key));
println!("Aliased '{}' as '{encoded}'", lit_str.value());
// Expand to a static string literal // Expand to a static string literal
TokenStream::from(quote! { TokenStream::from(quote! {
#encoded #encoded
}) })
} }
pub fn sym_ref_fn(input: TokenStream) -> TokenStream {
// Parse the input function
let func = parse_macro_input!(input as ItemFn);
// Get the original function name
let fn_name = func.sig.ident.to_string();
// Generate the new, obfuscated name
let obfuscated_name = ref_string(fn_name);
// Create a new string literal for the name
let new_name_lit = LitStr::new(&obfuscated_name, func.sig.ident.span());
// Re-build the function, but add #[no_mangle]
// and rename the *exported* symbol via #[export_name]
TokenStream::from(quote! {
#[unsafe(export_name = #new_name_lit)]
#func
})
}