
OBFUS.H เป็นไลบรารีขนาดมหภาคสำหรับการรวบรวมแอปพลิเคชัน C ที่น่าเบื่อหน่ายซึ่งออกแบบมาโดยเฉพาะสำหรับ C (TCC) ขนาดเล็ก มันได้รับการปรับแต่งสำหรับแพลตฟอร์ม Windows X86 และ X64 และรองรับคอมไพเลอร์เกือบทุกรุ่น เกราะที่เชื่อถือได้มากสำหรับโปรแกรม C ของคุณ!
การรวม OBFUS.H เข้ากับโครงการของคุณเป็นกระบวนการที่ง่าย เพียงรวมบรรทัดต่อไปนี้ในรหัสของคุณ:
#include "obfus.h"สิ่งนี้จะทำให้งงงวยรหัสของคุณโดยอัตโนมัติในระหว่างการรวบรวมเพื่อให้มั่นใจว่าการป้องกันและการรักษาความลับของทรัพย์สินทางปัญญาของคุณ
ตัวเลือกที่มีอยู่สำหรับการกำหนดค่าการป้องกัน:
// Advanced code protection (see the "Virtualization" part of the documentation!) #define VIRT 1 // Allows you to use the functions of a math VM // Additional options #define CFLOW_V2 1 // More powerful Control Flow obfuscation (slowly!) #define ANTIDEBUG_V2 1 // Use better dynamic anti-debugging protection #define FAKE_SIGNS 1 // Adds fake signatures of various protectors or packers // Disabling default features #define NO_CFLOW 1 // Don't use Control-Flow obfuscation #define NO_ANTIDEBUG 1 // Don't build in debugging protectionหรือใช้กับคอมไพเลอร์ args:
tcc "app.c" -w -D NO_CFLOW -D ANTIDEBUG_V2 -D FAKE_SIGNS -D VIRT
คำเตือน
เมื่อรวบรวมแอปพลิเคชันด้วยการทำให้งงงวยให้ใช้อาร์กิวเมนต์ -w เพื่อระงับคำเตือน มิฉะนั้นคอนโซลจะแสดงบันทึกที่น่ากลัวมากมายที่ไม่มีผลกระทบต่อผลลัพธ์สุดท้าย ไม่จำเป็นต้องตื่นตระหนก
- การป้องกันการดีบักถูกเรียกใช้โดยการโทรไปยังฟังก์ชั่น MSVCRT พื้นฐานมากมาย ในสถานที่สำคัญในรหัสคุณสามารถใช้ ANTI_DEBUG; สร้าง. ตัวอย่างเช่น:
ANTI_DEBUG ;
if (! licenseExpired ()) {
// ...
} นี่คือเทคนิคการป้องกันที่การคำนวณบางอย่างดำเนินการผ่านเครื่องเสมือนที่ฝังตัวตามคำสั่ง ทำให้การวิเคราะห์การดำเนินการทางคณิตศาสตร์ ยากมาก ! มันจะทำงานกับตัวเลือก VIRT ตัวเลือก (และเท่านั้น!) มิฉะนั้นคำสั่งเครื่องเสมือนทั้งหมดจะถูกแทนที่ด้วยตัวดำเนินการทางคณิตศาสตร์ทั่วไป
คำเตือน
การจำลองเสมือนในสถานที่สำคัญสามารถส่งผลกระทบต่อการเพิ่มประสิทธิภาพ ใช้ด้วยความระมัดระวังเฉพาะในพื้นที่ที่จำเป็นจริงๆ
| การทำงาน | พิมพ์ | หน้าตา | คำอธิบาย | ตัวอย่าง |
|---|---|---|---|---|
VM_ADD | ยาว | + | เพิ่มสองตัวเลข | VM_ADD(5, 3) = 8 |
VM_SUB | ยาว | - | ลบตัวเลขสองตัว | VM_SUB(5, 3) = 2 |
VM_MUL | ยาว | * | ทวีคูณสองตัวเลข | VM_MUL(5, 3) = 15 |
VM_DIV | ยาว | / | แบ่งสองตัวเลข | VM_DIV(6, 3) = 2 |
VM_MOD | ยาว | % | คำนวณโมดูลัสของตัวเลขสองตัว | VM_MOD(5, 3) = 2 |
VM_EQU | บูล | == | ตรวจสอบว่าตัวเลขสองตัวเท่ากัน | VM_EQU(5, 5) = true |
VM_NEQ | บูล | != | ตรวจสอบว่าตัวเลขสองตัวไม่เท่ากัน | VM_NEQ(5, 3) = true |
VM_LSS | บูล | < | ตรวจสอบว่าหมายเลขแรกน้อยกว่าหมายเลขที่สอง | VM_LSS(3, 5) = true |
VM_GTR | บูล | > | ตรวจสอบว่าหมายเลขแรกมากกว่าหมายเลขที่สองหรือไม่ | VM_GTR(5, 3) = true |
VM_LEQ | บูล | <= | ตรวจสอบว่าหมายเลขแรกน้อยกว่าหรือเท่ากับหมายเลขที่สอง | VM_LEQ(3, 5) = true |
VM_GEQ | บูล | >= | ตรวจสอบว่าหมายเลขแรกมากกว่าหรือเท่ากับหมายเลขที่สอง | VM_GEQ(5, 3) = true |
VM_ADD_DBL | คู่ยาว | + | เพิ่มสองตัวเลขสองตัว | VM_ADD_DBL(5.5, 3.2) = ≈8.7 |
VM_SUB_DBL | คู่ยาว | - | ลบตัวเลขสองตัวสองตัว | VM_SUB_DBL(5.5, 3.2) = ≈2.3 |
VM_MUL_DBL | คู่ยาว | * | ทวีคูณสองตัวเลขสองตัว | VM_MUL_DBL(5.5, 3.2) = ≈17.6 |
VM_DIV_DBL | คู่ยาว | / | แบ่งสองตัวเลขสองตัว | VM_DIV_DBL(6.0, 3.0) = ≈2.0 |
VM_LSS_DBL | บูล | < | ตรวจสอบว่าหมายเลขสองคู่แรกน้อยกว่าหมายเลขสองครั้งที่สอง | VM_LSS_DBL(3.5, 5.2) = true |
VM_GTR_DBL | บูล | > | ตรวจสอบว่าหมายเลขสองคู่แรกมากกว่าหมายเลขสองครั้งที่สอง | VM_GTR_DBL(5.5, 3.2) = true |
เครื่องเสมือนไม่รองรับการดำเนินการเปรียบเทียบ
doubleพื้นฐาน
คุณสามารถใช้ตัวดำเนินการแบบลอจิคัลที่ใช้การโทรเสมือนจริงเพื่อทำให้ความเข้าใจของรหัสของคุณซับซ้อนขึ้น
| ผู้ดำเนินการ | คำอธิบาย |
|---|---|
VM_IF | ใช้แทน if |
VM_ELSE_IF | ใช้แทน else if |
VM_ELSE | ใช้แทน else |
ตัวอย่างง่ายๆของการใช้การจำลองเสมือน:
// ...
#define VIRT 1
// ...
// if ((2 + 2) == 4) { ... }
VM_IF ( VM_EQU ( VM_ADD ( 2 , 2 ), 4 )) {
printf ( "2 + 2 == 4!" );
}
// if (condition1) { ... }
// else if (condition2) { ... }
// else { ... }
VM_IF ( condition1 ) {
// if
} VM_ELSE_IF ( condition2 ) {
// else if
} VM_ELSE {
// else
}คุณสามารถค้นหาตัวอย่างของการใช้ฟังก์ชั่นทั้งหมดของเครื่องเสมือนในการทดสอบไฟล์/virtualmachine.c
หากคุณต้องการการป้องกันขั้นสูงจากตัวเลือกที่มีทักษะให้ใช้ตัวเลือก CFLOW_V2 และ ANTIDEBUG_V2
// Let's obfuscate your code!
#include <stdio.h>
#define VIRT 1 // [+] Use math virtual machine
#define CFLOW_V2 1 // [+] ControlFlow v2
#define FAKE_SIGNS 1 // [+] Fake signatures
#define ANTIDEBUG_V2 1 // [+] AntiDebug v2
#define NO_CFLOW 0 // [-] Disable ControlFlow
#define NO_ANTIDEBUG 0 // [-] Disable AntiDebug
#include "obfus.h"
void main () {
char * out = malloc ( 256 );
strcpy ( out , "Hello, world!n" );
if ( out ) {
printf ( out );
} else {
printf ( "Error!n" );
}
free ( out );
int result = VM_ADD ( 5 , 7 ); // 5 + 7
VM_IF ( VM_EQU ( result , 12 )) { // (5 + 7) == 12
printf ( "5 + 7 == 12" );
}
} แนะนำให้ใช้ Tiny C ( 0.9.27 ) รุ่นล่าสุดสำหรับการใช้งาน น่าเสียดายที่คอมไพเลอร์บางรุ่นไม่สนับสนุนการทำงานที่จำเป็นในการทำให้งงงวยอย่างสมบูรณ์ Visual C , GCC และ Clang ไม่ได้รับการสนับสนุน และไม่น่าจะได้รับการสนับสนุน
คุณสามารถใช้สคริปต์พิเศษสำหรับ Windows เพื่อรับ obfus.h เวอร์ชันล่าสุดโดยการดาวน์โหลดแพ็คเกจจากที่เก็บอย่างเป็นทางการ สิ่งนี้มีประโยชน์หากคุณต้องการอัปเดตความปลอดภัยโดยอัตโนมัติโดยไม่ต้องใช้ git
ตัวอย่างเช่นคุณสามารถใช้ก่อนที่จะสร้างโครงการของคุณ:
+ C:...> call obfh-update C:...> tcc app.c -wสคริปต์จะอัปเดตเนื้อหาของไฟล์ obfus.h ในไดเรกทอรีปัจจุบัน (ตามการกำหนดค่าที่ระบุ)
รหัสของโปรแกรม (และตรรกะดั้งเดิมดั้งเดิม) ได้รับการปกป้องโดยใช้ OBFUS.H แทบจะ เป็นไปไม่ได้ที่จะกู้คืน (deobfuscate) อย่างไรก็ตามการใช้เครื่องหมั่นไส้นี้ไม่รับประกันการป้องกันที่สมบูรณ์จากภัยคุกคามทุกประเภท การพัฒนาและดูแลระบบความปลอดภัยของโปรแกรมภายในเป็นสิ่งสำคัญ
รหัสไดอะแกรมจะเป็นอย่างไรหลังจากทำให้งงงวย:
ตัวกลับจะเห็นอะไรแบบนี้ถ้าเขาพยายามใช้ decompiler:
ขอบคุณทุกคนที่ช่วยในการพัฒนาโครงการนี้ ฉันซาบซึ้ง!
และ ขอบคุณคุณ ? สำหรับการให้ความสนใจกับโครงการนี้!