이 라이브러리의 목표는 정적 및 동적 (디버깅) 분석을 더욱 어렵게 만드는 것입니다.
라이브러리는 Linux 환경을 대상으로합니다.
현재 ptrace 항 분석 트릭을 기반으로하며 다음과 같은 주요 기능을 제공합니다.
LIBC에 의존하지 않고 직접 SyScall 호출 (LD_PRELOAD 바이 패스 메커니즘이 효과가 없음);
정적 리버스 엔지니어링을 더욱 어렵게 만드는 시스템 호출 난독 화 (이 기능은 현재 x86_64 에서만 지원됩니다).
다중 ptrace syscall 호출. ptrace 에 대한 각 호출은 예상 값 (예 : 첫 번째 호출에서 0, 그 후 -1)을 반환해야하며 ptrace Call 체인의 끝에서 예상 값과 일치 해야하는 " offset "값의 계산에 기여해야합니다 (여기 참조). ptrace가 예상치 못한 값을 반환하거나 " offset "값이 일치하지 않으면 프로세스가 종료됩니다.
'Ptrace'는 중첩 루프에서 호출됩니다. 루프는 풀리지 않고 반복 횟수가 각 컴파일에서 무작위 배정됩니다. 또한, " offset "값은 각 반복에서 방사화됩니다.
생성 된 코드는 Goldberg Crate에 의존하는 obfuscate 기능을 가능하게하여 더욱 난독화할 수 있습니다.
상자를 사용하려면 종속성에 추가하십시오.
[dependencies]
debugoff = { version = "0.2.1, features = ["obfuscate"] }
시스템 통화 난독 화도 활성화하려면 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"
아래의 예에서 debugoff 대상 OS가 Linux 일 때와 릴리스 빌드에만 사용됩니다 (코드가 디버그 모드에서 컴파일 될 때는 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 기능이 활성화 될 때 GPL-3.0;obfuscate 기능이 활성화 되지 않은 경우 MIT; x86_64 에 대해서만 지원되지 않음).