Das Ziel dieser Bibliothek ist es, sowohl statische als auch dynamische (Debugging) -Analysen schwieriger zu gestalten.
Die Bibliothek richtet sich an Linux -Umgebungen.
Es basiert derzeit auf ptrace Anti-Analyse-Trick und bietet die folgenden Hauptmerkmale:
Direkter Aufruf, ohne sich auf LIBC zu verlassen (dies macht den Bypass -Mechanismus von LD_PREAD unwirksam);
Systemanruf Verschleierung, die statische Reverse Engineering erschwert (diese Funktion wird derzeit nur in x86_64 unterstützt);
Mehrere ptrace -Syscall -Aufrufe. Jeder Anruf bei ptrace muss den erwarteten Wert zurückgeben (dh 0 bei der ersten Aufforderung und danach -1) und zur Berechnung eines " offset " -Werts beiträgt, der am Ende der ptrace Call -Kette mit einem erwarteten Wert übereinstimmen muss (siehe hier). Wenn PTRACE einen nicht genannten Wert zurückgibt oder der Wert " offset " nicht übereinstimmt, wird der Prozess beendet.
'Ptrace' wird in verschachtelten Schleifen genannt. Die Schleifen werden abgerollt und die Anzahl der Iterationen wird bei jeder Zusammenstellung randomisiert. Darüber hinaus wird auch der Wert " offset " bei jeder Iteration radomisiert;
Der generierte Code kann noch mehr verschleiert werden, indem die obfuscate Verschleiftungsmerkmal, das auf Goldberg -Kiste beruht, aktiviert werden.
Um die Kiste zu verwenden, fügen Sie sie Ihren Abhängigkeiten hinzu:
[dependencies]
debugoff = { version = "0.2.1, features = ["obfuscate"] }
Verwenden Sie die syscallobf -Funktion (dies ist eine experimentelle Funktion und wirken sich auf nur Binärdateien aus, die sich auf x86_64 -Architektur abzielen):
[dependencies]
debugoff = { version = "0.2.1, features = ["obfuscate", "syscallobf"] }
Angesichts der Tatsache, dass die Bibliothek bei jeder Kompilierung zufälligen Code generiert, stellen Sie jedes Mal alles wieder auf. So etwas:
cargo clean
cargo build --release
Das Streifen von Symbolen aus dem Release -Build ist auch eine gute Idee:
[profile.release]
debug = false
strip = "symbols"
panic = "abort"
Im folgenden Beispiel wird debugoff nur verwendet, wenn das Ziel -Betriebssystem Linux ist und nur für Release -Builds (auf diese Weise, wenn der Code im Debug -Modus kompiliert wird, kann er debuggen werden, ohne dass debugoff umgehen muss).
// 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!" ) ;
}Weitere Beispiele finden Sie im Beispielverzeichnis, das mit:
cargo build --release --features obfuscate,syscallobf --examples Wenn wir den folgenden Code erstellen (der DebugOff nicht verwendet) im Release -Modus:
use std :: time :: SystemTime ;
fn main ( ) {
println ! (
"Time: {}" ,
SystemTime :: now ( )
. duration_since ( SystemTime :: UNIX_EPOCH )
. unwrap ( )
. as_millis ( )
) ;
println ! ( "Example complete!" ) ;
} Dies ist das entsprechende Funktionsgraphen der main :
.
Wenn wir den gleichen Code mit DebugOff mit obfuscate -Funktion erstellen:
# [ 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!" ) ;
} Dies ist das verschleierte Funktionsgraphen der main :
.
In diesem speziellen Beispiel wurde der gesamte von DebugOff generierte Code in die main eingebaut. Es ist nicht immer garantiert, dass es immer der Fall ist, da die integrierenden Funktionen durch viele Faktoren wie die Orte, an denen DebugOff aufgerufen wird, und die Toolchain -Version für die Erstellung des Projekts beeinflusst werden können. In anderen Fällen könnte das resultierende Funktionsdiagramm einfacher sein als das im Beispiel angegebene, aber in jedem Fall komplexer als das, das beim DebugOff nicht verwendet wird.
Lizenziert unter:
obfuscate -Funktion aktiviert ist;obfuscate nicht aktiviert ist ; x86_64 unterstützt);