เป้าหมายของห้องสมุดนี้คือการวิเคราะห์ทั้งแบบคงที่และแบบไดนามิก (การดีบัก) ยากขึ้น
ห้องสมุดกำหนดเป้าหมายสภาพแวดล้อม Linux
ปัจจุบันมีพื้นฐานมาจากเคล็ดลับต่อต้านการวิเคราะห์ ptrace และให้คุณสมบัติหลักต่อไปนี้:
การเรียกใช้ Syscall โดยตรงโดยไม่ต้องพึ่งพา LIBC (ทำให้กลไกการบายพาส LD_PRELOAD ไม่มีประสิทธิภาพ);
การทำให้เกิดความสับสนในระบบซึ่งทำให้วิศวกรรมย้อนกลับแบบคงที่ยากขึ้น (คุณลักษณะนี้รองรับในปัจจุบันใน x86_64 เท่านั้น);
การเรียกใช้ ptrace Syscall หลายรายการ การโทรแต่ละครั้งไปยัง ptrace จะต้องส่งคืนค่าที่คาดหวัง (เช่น 0 ในการเรียกร้องครั้งแรกและ -1 หลังจากนั้น) และมีส่วนร่วมในการคำนวณค่า " offset " ที่ในตอนท้ายของห่วงโซ่การโทร ptrace จะต้องตรงกับค่าที่คาดหวัง (ดูที่นี่) หาก PTRACE ส่งคืนค่าที่ไม่ได้รับการยกเว้นหรือค่า " offset " ไม่ตรงกันกระบวนการจะถูกยกเลิก
'ptrace' เรียกว่าในลูปซ้อนกัน ลูปจะคลี่คลายและจำนวนการวนซ้ำจะถูกสุ่มในการรวบรวมแต่ละครั้ง ยิ่งไปกว่านั้นค่า " offset " จะถูกทำให้เรเดียลในการวนซ้ำแต่ละครั้ง
รหัสที่สร้างขึ้นสามารถทำให้งงงวยได้มากขึ้นโดยการเปิดใช้งานคุณสมบัติที่ obfuscate ซึ่งอาศัย Crate Goldberg;
หากต้องการใช้ลังให้เพิ่มลงในการพึ่งพาของคุณ:
[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 จะใช้เฉพาะเมื่อระบบปฏิบัติการเป้าหมายเป็น 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 :
-
หากเราสร้างรหัสเดียวกันโดยใช้ DebugOff ด้วยคุณสมบัติ 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!" ) ;
} นี่คือกราฟฟังก์ชั่นที่ทำให้งงของฟังก์ชั่น main :
-
ในตัวอย่างนี้โดยเฉพาะรหัสทั้งหมดที่สร้างโดย DebugOff ถูก inlined ในฟังก์ชัน main สิ่งนี้ไม่ได้รับประกันว่าจะเป็นกรณีเสมอเพราะฟังก์ชั่นการ inlining อาจได้รับอิทธิพลจากปัจจัยหลายอย่างเช่นสถานที่ที่เรียกว่า DebugOff และรุ่นเครื่องมือที่ใช้สำหรับการสร้างโครงการ ในกรณีอื่น ๆ กราฟฟังก์ชั่นที่ได้อาจง่ายกว่าที่รายงานในตัวอย่าง แต่ไม่ว่าในกรณีใดจะซับซ้อนกว่าที่สร้างขึ้นเมื่อไม่ได้ใช้ DebugOff
ได้รับใบอนุญาตภายใต้:
obfuscate คุณสมบัติที่ทำให้งงงวยobfuscate คุณสมบัติที่ทำให้งงงวย x86_64 );