該庫的目的是使靜態和動態(調試)分析更加困難。
該庫針對Linux環境。
它目前基於ptrace抗分析技巧,並提供以下主要特徵:
直接syscall調用而無需依賴libc(這使得LD_PRELOAD旁路機制無效);
系統調用混淆,這使靜態反向工程更加困難(目前僅在x86_64中支持此功能);
多個ptrace SYSCALL調用。對ptrace的每個調用都必須返回預期值(即,第一次調用時為0,此後為-1),並有助於計算“ offset ”值,該值在ptrace呼叫鏈的末尾必須匹配期望值(請參閱此處)。如果Ptrace返回未表達的值或“ offset ”值不匹配,則該過程將終止;
“ ptrace”在嵌套環中被稱為。循環是展開的,並且在每次彙編時迭代的數量是隨機的。此外,在每次迭代時,“ offset ”值也會輻射。
通過啟用依賴Goldberg Crate的obfuscate功能,可以使生成的代碼更加混淆。
要使用板條箱,請將其添加到您的依賴項中:
[dependencies]
debugoff = { version = "0.2.1, features = ["obfuscate"] }
為了啟用系統,請調用obfuscation,請使用syscallobf功能(這是一個實驗功能,僅影響針對x86_64體系結構的二進制功能):
[dependencies]
debugoff = { version = "0.2.1, features = ["obfuscate", "syscallobf"] }
鑑於庫在每次編譯中都會生成隨機代碼,請確保每次重建所有內容。這樣的事情:
cargo clean
cargo build --release
發行版構建中的剝離符號也是一個好主意:
[profile.release]
debug = false
strip = "symbols"
panic = "abort"
在下面的示例中,僅當目標操作系統是Linux而僅用於發行版構建時才使用debugoff (通過這種方式,當代碼以調試模式編譯時,它可以在無需繞過debugoff情況下進行調試)。
// Include only for Linux and when building in release mode
# [ cfg ( target_os = "linux" ) ]
# [ cfg ( not ( debug_assertions ) ) ]
use debugoff ;
use std :: time :: SystemTime ;
fn main ( ) {
// Call only for Linux and when building in release mode
# [ cfg ( target_os = "linux" ) ]
# [ cfg ( not ( debug_assertions ) ) ]
debugoff :: multi_ptraceme_or_die ( ) ;
println ! (
"Time: {}" ,
SystemTime :: now ( )
. duration_since ( SystemTime :: UNIX_EPOCH )
. unwrap ( )
. as_millis ( )
) ;
// Call only for Linux and when building in release mode
# [ cfg ( target_os = "linux" ) ]
# [ cfg ( not ( debug_assertions ) ) ]
debugoff :: multi_ptraceme_or_die ( ) ;
println ! ( "Example complete!" ) ;
}請參閱示例目錄中的其他示例,這些示例可以與以下方式構建:
cargo build --release --features obfuscate,syscallobf --examples如果我們在發布模式下構建以下代碼(不使用DebugOff ):
use std :: time :: SystemTime ;
fn main ( ) {
println ! (
"Time: {}" ,
SystemTime :: now ( )
. duration_since ( SystemTime :: UNIX_EPOCH )
. unwrap ( )
. as_millis ( )
) ;
println ! ( "Example complete!" ) ;
}這是main函數的相應函數圖:
。
如果我們使用具有obfuscate功能的DebugOff構建相同的代碼:
# [ cfg ( target_os = "linux" ) ]
# [ cfg ( not ( debug_assertions ) ) ]
use debugoff ;
use std :: time :: SystemTime ;
fn main ( ) {
# [ cfg ( target_os = "linux" ) ]
# [ cfg ( not ( debug_assertions ) ) ]
debugoff :: multi_ptraceme_or_die ( ) ;
println ! (
"Time: {}" ,
SystemTime :: now ( )
. duration_since ( SystemTime :: UNIX_EPOCH )
. unwrap ( )
. as_millis ( )
) ;
# [ cfg ( target_os = "linux" ) ]
# [ cfg ( not ( debug_assertions ) ) ]
debugoff :: multi_ptraceme_or_die ( ) ;
println ! ( "Example complete!" ) ;
}這是main函數的混淆函數圖:
。
在此特定示例中, DebugOff生成的所有代碼都在main函數中列入。不能保證總是這樣的情況,因為內在的功能可能會受到稱為DebugOff的位置以及用於構建項目的工具鏈版本的許多因素。在其他情況下,所得的函數圖可能比示例中報告的函數圖更簡單,但是無論如何,比不使用DebugOff時生成的功能圖更複雜。
許可以下:
obfuscate功能時;obfuscate功能時; x86_64 );