Tujuan dari perpustakaan ini adalah untuk membuat analisis statis dan dinamis (debugging) lebih sulit.
Perpustakaan menargetkan lingkungan Linux.
Saat ini didasarkan pada trik anti-analisis ptrace dan memberikan fitur utama berikut:
Direct Syscall Doa tanpa mengandalkan LIBC (ini membuat mekanisme bypass LD_Preload tidak efektif);
Kebingungan panggilan sistem yang membuat rekayasa terbalik statis lebih sulit (fitur ini saat ini hanya didukung di x86_64 );
Beberapa doa ptrace syscall. Setiap panggilan ke ptrace harus mengembalikan nilai yang diharapkan (yaitu, 0 pada doa pertama dan -1 sesudahnya) dan berkontribusi pada perhitungan nilai " offset " yang, pada akhir rantai panggilan ptrace , harus sesuai dengan nilai yang diharapkan (lihat di sini). Jika PTrace mengembalikan nilai yang tidak diperluas atau nilai " offset " tidak cocok, prosesnya diakhiri;
'Ptrace' dipanggil dalam loop bersarang. Loop dibuka gulungan dan jumlah iterasi diacak pada setiap kompilasi. Selain itu, juga nilai " offset " radomisasi pada setiap iterasi;
Kode yang dihasilkan dapat dikaburkan bahkan lebih banyak dengan memungkinkan fitur obfuscate yang bergantung pada peti Goldberg;
Untuk menggunakan peti, tambahkan ke dependensi Anda:
[dependencies]
debugoff = { version = "0.2.1, features = ["obfuscate"] }
Untuk mengaktifkan juga kebingungan panggilan sistem, gunakan fitur syscallobf (ini adalah fitur eksperimental dan hanya mempengaruhi binari yang menargetkan arsitektur x86_64 ):
[dependencies]
debugoff = { version = "0.2.1, features = ["obfuscate", "syscallobf"] }
Mengingat bahwa perpustakaan menghasilkan kode acak di setiap kompilasi, pastikan untuk membangun kembali semuanya setiap kali. Sesuatu seperti ini:
cargo clean
cargo build --release
Simbol pengupasan dari pembuatan rilis juga merupakan ide yang bagus:
[profile.release]
debug = false
strip = "symbols"
panic = "abort"
Dalam contoh di bawah ini, debugoff hanya digunakan ketika OS target adalah Linux dan hanya untuk pembuatan rilis (dengan cara ini ketika kode dikompilasi dalam mode debug itu dapat didebug tanpa perlu bypass 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!" ) ;
}Lihat contoh lain di direktori contoh yang dapat dibangun dengan:
cargo build --release --features obfuscate,syscallobf --examples Jika kita membangun kode berikut (yang tidak menggunakan DebugOff ) dalam mode rilis:
use std :: time :: SystemTime ;
fn main ( ) {
println ! (
"Time: {}" ,
SystemTime :: now ( )
. duration_since ( SystemTime :: UNIX_EPOCH )
. unwrap ( )
. as_millis ( )
) ;
println ! ( "Example complete!" ) ;
} Ini adalah grafik fungsi yang sesuai dari fungsi main :
.
Jika kita membangun kode yang sama menggunakan DebugOff dengan fitur obfuscate :
# [ 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!" ) ;
} Ini adalah grafik fungsi yang dikalahkan dari fungsi main :
.
Dalam contoh khusus ini, semua kode yang dihasilkan oleh DebugOff dilapisi dalam fungsi main . Ini tidak dijamin selalu terjadi karena fungsi yang ada dapat dipengaruhi oleh banyak faktor seperti lokasi di mana DebugOff disebut dan versi toolchain yang digunakan untuk membangun proyek. Dalam kasus lain grafik fungsi yang dihasilkan bisa lebih sederhana daripada yang dilaporkan dalam contoh tetapi, dalam hal apa pun, lebih kompleks daripada yang dihasilkan ketika DebugOff tidak digunakan.
Berlisensi di bawah:
obfuscate diaktifkan;obfuscate tidak diaktifkan; x86_64 );