
Obfusk8: مكتبة تشويش خفيفة الوزن مبنية على C++17 / رأس فقط لملفات ويندوز الثنائية
Obfusk8 هي مكتبة خفيفة الوزن، تعتمد على الرؤوس فقط (header-only) بلغة C++17، مصممة لتعزيز تعقيم تطبيقاتك بشكل كبير، مما يجعل الهندسة العكسية مهمة أكثر صعوبة. تحقق ذلك من خلال مجموعة متنوعة من التقنيات في وقت الترجمة ووقت التشغيل تهدف إلى حماية منطق وبيانات الكود الخاص بك.

main_mainيتم تحويل نقطة الدخول لتطبيقك (main) إلى محرك تعقيم معقد متعدد الطبقات:
main_body الفعلي، تقوم آلة افتراضية صغيرة (معالج محاكي) بتشغيل سلسلة من التعليمات "المشفرة". هذا يخفي نقطة الدخول الحقيقية والعمليات الأولية. يتم تهيئة حالة الآلة الافتراضية (السجلات، عداد البرنامج، مفتاح التوزيع) بقيم عشوائية في وقت التشغيل._main (سواء في المقدمة أو الخاتمة) إلى آلات حالة معقدة. تدفق التحكم ليس مباشرًا بل يتم تحديده بواسطة متغيرات حالة "مشفرة" بشدة. مفاتيح التشفير/فك التشفير لمتغيرات الحالة هذه ديناميكية، مشتقة من حالة الآلة الافتراضية، عدادات الحلقة، العشوائية في وقت الترجمة (مثل __COUNTER__، __LINE__، __TIME__)، وبذرة غير شفافة عامة. هذا يجعل التحليل الثابت لتدفق التحكم صعبًا للغاية.
obf_icff_ns_dcff و obf_icff_ns_epd) بمنطق انتقال حالة وتوليد مفاتيح مختلفين، مما يزيد من تعقيد التحليل.OBF_BOGUS_FLOW_*): يتم حقن العديد من أنماط القفز المضللة والهياكل الشرطية المعقدة في جميع أنحاء _main. تستخدم هذه عبارات goto مقترنة بمسندات غير شفافة (شروط تُقيم دائمًا إلى صواب أو خطأ ولكنها مكلفة حسابيًا أو يصعب تحديدها بشكل ثابت). هذا يخلق متاهة من المسارات الزائفة لمفككات التجميع ومفككات التجميع.
OBF_BOGUS_FLOW_LABYRINTH و OBF_BOGUS_FLOW_GRID و OBF_BOGUS_FLOW_SCRAMBLE و OBF_BOGUS_FLOW_WEAVER و OBF_BOGUS_FLOW_CASCADE و OBF_BOGUS_FLOW_CYCLONE لتوليد تدفقات مزيفة متنوعة ومعقدة.Runtime، SEH):
__except حالة البرنامج، مما يجعل من الصعب متابعتها إذا تجاوز المصحح الاستثناءات.Runtime على شروط يمكنها، إذا تحققت (بسبب حالات أو توقيت معين للآلة الافتراضية)، تشغيل __debugbreak() أو إلقاء استثناءات، مصممة لتعطيل جلسات التصحيح.obf_vm_engine)مكون أساسي في تعقيم ماكرو _main:
r0، r1، r2)، وعداد برنامج (pc)، ومفتاح توزيع (dispatch_key). ينفذ "تعليمات" مخصصة (معالجات).reg_dispatch_idx).get_mem_dispatch_table).mixed_dispatch_idx).
يتم تحوير dispatch_key باستمرار، مما يجعل تسلسل المعالجات المنفذة غير قابل للتنبؤ بشدة.vm_handler_table) نفسه في وقت التشغيل داخل مقدمة وخاتمة _main، مما يزيد من إخفاء سلوك الآلة الافتراضية.OBFUSCATE_STRING من AES8.hpp)__FILE__، __LINE__)، ووقت البناء (__DATE__، __TIME__).AES8.hpp).STEALTH_API_OBFSTR / STEALTH_API_OBF من Resolve8.hpp)GetModuleHandle و GetProcAddress القياسيين للحل الأولي إذا لم يتم حل تلك نفسها بعد بواسطة هذه الآلية.CT_HASH) لأسماء DLL وواجهات API للبحث. هذا يمنع ظهور أسماء DLL وواجهات API بنص صريح في بيانات الاستيراد أو جداول السلاسل للثنائي عند استخدام هذه الماكرو.K8_SYSCALL)يدمج Obfusk8 الآن آلية استدعاء نظام غير مباشر متطورة لتجاوز خطافات وضع المستخدم (EDRs/AVs) وفحوصات التحليل الثابت.
K8_SYSCALL("ZwOpenProcess", ...) بدلاً من NtOpenProcess.OBF_METHOD)يوفر Obfusk8 الآن تحكمًا دقيقًا في أمان ثنائيك من خلال التعقيم القائم على الطريقة. بدلاً من تعقيم مشروعك بالكامل (والذي قد يؤثر على الأداء)، يمكنك الآن حماية وظائف أو طرق فئة محددة وعالية القيمة بشكل انتقائي.
OBF_METHOD: ```cpp
OBF_METHOD(ret_type, func_name, params, method_body)
ret_type: نوع الإرجاع لدالتك (مثل bool، int، void*).func_name: اسم الطريقة.params: معاملات الدالة (يجب أن تكون محاطة بأقواس).method_body: المنطق الفعلي لدالتك محاط بـ { }.في هذا المثال، PrintStatus هي دالة عادية قابلة للقراءة. Obfusk8_PrintStatus محمية بواسطة Obfusk8.```cpp
#include "../Instrumentation/materialization/state/Obfusk8Core.hpp"
#include "../Instrumentation/materialization/transform/K8_UTILS/k8_utils.hpp" // for the printf_, u can change the printf_ with anything else...
class Obfusk8_C { public: // standard method which is visible to reverse engineers void PrintStatus(void) { printf_("method\n"); }
// Obfuscated method protected by Obfusk8
OBF_METHOD_(void, Obfusk8_PrintStatus, (void),
{
printf_("same method but Obfuscated\n");
})
};
_main({ Obfusk8_C *pp = new Obfusk8_C; pp->PrintStatus(); pp->Obfusk8_PrintStatus(); delete pp; })
*يمكنك مشاهدة المثال الكامل هنا: [obfusk8_methods.cpp](https://github.com/x86byte/Obfusk8/blob/main/Obfusk8/EXAMPLES/obfusk8_methods.cpp)*
---
### 6. فئات تجريد واجهات برمجة التطبيقات (API) مع تمويه مدمج
يوفر Obfusk8 فئات مساعدة تغلف مجموعات شائعة من واجهات برمجة تطبيقات Windows. تستخدم هذه الفئات تلقائياً آلية حل واجهات برمجة التطبيقات الخفية (`STEALTH_API_OBFSTR`) أثناء إنشائها، مما يضمن حل دوال Windows الأساسية دون ترك آثار استيراد ثابتة واضحة.
- **`K8_ProcessManipulationAPIs::ProcessAPI` (`k8_ProcessManipulationAPIs.hpp`)**:
* يوفر وصولاً مريحاً لواجهات برمجة تطبيقات Windows للتعامل مع العمليات، مثل `OpenProcess`, `TerminateProcess`, `CreateRemoteThread`, `VirtualAllocEx`, `WriteProcessMemory`, `ReadProcessMemory`, `GetProcAddress`, `GetModuleHandleA`, `NtQueryInformationProcess`, `SuspendThread`, و `GetCurrentProcessId`.
* **الحل الخفي التلقائي**: يحل الدوال الضرورية من `kernel32.dll` و `ntdll.dll` بشكل خفي.
* يبسط تنفيذ العمليات المتعلقة بالعمليات مع بصمة تحليل ثابتة مخفضة. يتضمن العداد `PROCESSINFOCLASS` لاستخدامه مع `NtQueryInformationProcess`.
- **`k8_CryptographyAPIs::CryptographyAPI` (`k8_CryptographyAPIs.hpp`)**:
* يقدم أغلفة لوظائف Windows Cryptography API (CAPI/CNG) الشائعة. (تعتمد الوظيفة على التنفيذ الفعلي لهذا الملف - المقتطف المقدم كان مكرراً. بافتراض وظائف CAPI نموذجية مثل `CryptAcquireContextA`, `CryptCreateHash`, إلخ.)
* **الحل الخفي التلقائي**: يحل الدوال الضرورية أساساً من `advapi32.dll` (و `kernel32.dll` للوظائف الأساسية) بشكل خفي.
* يسهل العمليات التشفيرية مع تقليل التعرض لاستخدام واجهات برمجة التطبيقات التشفيرية.
- **`k8_NetworkingAPIs::NetworkingAPI` (`k8_NetworkingAPIs.hpp`)**:
* يوفر وصولاً سهلاً لمجموعة واسعة من وظائف الشبكات من `wininet.dll` (مثل `InternetOpenA`, `HttpOpenRequestA`, `FtpPutFileA`)، `urlmon.dll` (مثل `URLDownloadToFileA`)، `ws2_32.dll` (مثل `socket`, `connect`, `WSAStartup`)، `shell32.dll` (مثل `ShellExecuteA`)، `dnsapi.dll` (مثل `DnsQuery_A`) و `mpr.dll` (مثل `WNetOpenEnumA`).
* **الحل الخفي التلقائي**: في دالة البناء الخاصة به، يستخدم `STEALTH_API_OBFSTR` و `OBFUSCATE_STRING` لحل جميع الدوال المطلوبة من مكتبات DLL الخاصة بها (و `kernel32.dll` لـ `LoadLibraryA`/`GetLastError`) دون ترك آثار استيراد واضحة.
* يبسط إجراء طلبات شبكية مموهة وأداء مهام أخرى متعلقة بالشبكات.
- **`RegistryAPIs::RegistryAPI` (`k8_RegistryAPIs.hpp`)**:
* يغلف وظائف سجل Windows شائعة الاستخدام مثل `RegSetValueExA`, `RegCreateKeyExA`, `RegOpenKeyExA`, `RegQueryValueExA`, `RegCloseKey`, إلخ.
* **الحل الخفي التلقائي**: يحل الدوال من `advapi32.dll` (و `kernel32.dll`) بشكل خفي أثناء البناء.
* يساعد في إجراء عمليات السجل باستدعاءات واجهة برمجة تطبيقات أقل تتبعاً.
### 7. الأساسيات الأساسية للتمويه (ماكرو في `Obfusk8Core.hpp`)
هذه هي اللبنات الأساسية المستخدمة بكثافة في جميع أنحاء المكتبة، خاصة في ماكرو `_main` ومحرك VM:
* **الحساب المختلط البولياني-الحسابي (MBA)**: يحول العمليات الرياضية والمنطقية البسيطة (ADD, SUB, XOR, NOT, MUL) إلى متواليات معقدة ولكنها مكافئة من الصيغ البتية والحسابية (مثل `OBF_MBA_ADD`, `OBF_MBA_XOR`). وهي مصممة لتصعب جداً على برامج فك التجميع تبسيطها إلى أشكالها الأصلية.
* **المسندات المعتمة**: تُدرج فروعاً شرطية حيث الشرط يقيم دائماً إلى true (مثل `OBF_OPAQUE_PREDICATE_TRUE_1`) أو دائماً إلى false (مثل `OBF_OPAQUE_PREDICATE_FALSE_1`). تُبنى هذه الشروط من تعبيرات معقدة يصعب تقييمها بشكل ثابت تتضمن `__COUNTER__`, `__LINE__`, `__TIME__` و `_obf_global_opaque_seed`. وهي تنشئ مسارات كود مضللة ويمكن استخدامها لحراسة الكود الميت أو فرض تدفقات تنفيذ محددة.
* **حقن الكود غير المرغوب فيه**:
* `OBF_CALL_ANY_LOCAL_JUNK`: يستدعي واحدة من العديد من الدوال غير المرغوب فيها الصغيرة والعشوائية المعرفة في `obf_junk_ns`. تنفذ هذه الدوال عمليات تافهة ومتطايرة ويتم اختيارها عشوائياً في وقت التجميع. الغرض منها هو زيادة إنتروبيا الكود، وكسر أنماط الكود البسيطة، وربما تضليل أدوات الكشف أو التحليل القائمة على التوقيع.
* `NOP()`: ماكرو يُدرج عمليات متطايرة مصممة لمنع الإزالة السهلة بواسطة المحسّنات ولتعديل بذرة عامة بشكل خفي.
* **حيل مضادة لفك التجميع والتحليل**:
* **القفزات المموهة (ماكرو `OBF_JUMP_*`)**: ينشئ عبارات `goto` تكون شروطها أو أهدافها مموهة، غالباً بالاعتماد على المسندات المعتمة أو MBA.
* **تحولات الحالة المموهة (ماكرو `OBF_SET_NEXT_STATE_*`)**: تُستخدم في ICFF، وهذه الماكروات تحدد متغير الحالة التالية لموزع تدفق التحكم المسطح باستخدام تقنيات تمويه مشابهة للقفزات المموهة.
* **التلاعب بالمكدس (`OBF_STACK_ALLOC_MANIP`, `OBF_FAKE_PROLOGUE_MANIP`)**: يخصص قطعاً ذات أحجام متغيرة على المكدس ويقوم بتلاعبات مزيفة عليها. تحاول المقدمات المزيفة إرباك تحليل المكدس.
* **استدعاءات الدوال المموهة (`OBF_CALL_VIA_OBF_PTR`)**: يتم XOR لمؤشرات الدوال بمفتاح ديناميكي قبل وبعد الاستخدام، مما يحجب الهدف الحقيقي للاستدعاء.
* `K8_ASSUME(0)`: يُستخدم في مسارات الكود الميت لتلميح لمترجم MSVC أن هذه المسارات غير قابلة للوصول، مما قد يسمح بتحسينات أو توليد كود مختلف قد يزيد من إرباك التحليل إذا تم انتهاك الافتراض بواسطة رقعة.
### التبعيات
مكتبة Obfusk8 معيارية. تعتمد الوظائف الأساسية على:
- `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp`: (هذا الملف) الرأس المركزي الذي ينسق ويوفر ماكروات وأساسيات التمويه الرئيسية.
- `Obfusk8/Instrumentation/materialization/transform/AES8.hpp`: يوفر تشفير سلسلة يعتمد على AES في وقت التجميع وميزات اختيارية للتعامل مع أقسام PE.
- `Obfusk8/Instrumentation/materialization/transform/Resolve8.hpp`: ينفذ حل واجهات برمجة تطبيقات Windows الخفي القائم على PEB.
* `Obfusk8/Instrumentation/materialization/transform/k8_indsys.hpp`: ينسق **محرك الاستدعاءات النظامية غير المباشرة (Indirect Syscall Engine)**. يدير دورة حياة الكتل الانتقالية ويوفر الواجهة لتنفيذ الاستدعاءات النظامية من خلال أدوات الذاكرة الجانبية.
* `Obfusk8/Instrumentation/materialization/transform/getpeb8.hpp`: يسهل التمهيد الأولي و **اكتشاف PEB**. يحتوي على منطق التجزئة المخصص، وتعريفات الهياكل الأصلية، وخوارزمية "قبعة الفرز" لاستنتاج SSN. يعمل كأساس منخفض المستوى لجميع مهام تعداد الوحدات.
يتم توفير فئات API المساعدة الاختيارية في رؤوس منفصلة، توجد عادة في المجلدات الفرعية:
- `k8_ProcessManipulationAPIs/k8_ProcessManipulationAPIs.hpp`: لواجهات برمجة تطبيقات التعامل مع العمليات الخفية.
- `k8_CryptographyAPIs/k8_CryptographyAPIs.hpp`: لواجهات برمجة تطبيقات التشفير الخفية.
- `k8_NetworkingAPIs/k8_NetworkingAPIs.hpp`: لواجهات برمجة تطبيقات الشبكات الخفية.
- `k8_RegistryAPIs/k8_RegistryAPIs.hpp`: لواجهات برمجة تطبيقات السجل الخفية.
### التصور
* **رسم IDA**:

* **بعض الأجزاء من IDA Pro**:



* **نتائج توقيع Detect It Easy**:

* **قواعد YARA الجماعية من VirusTotal**:

* **خريطة الذاكرة (من DIE)**:

* **الأقسام**:

* **الملفات المرفقة**:

### تحليل المحرك وملف الكشف
تم تصميم Obfusk8 لإعطاء الأولوية لتجاوز محركات الكشف القائمة على التوقيع الثابت. أظهر الاختبار ضد البائعين المعروفين في الصناعة أن منطق التمويه الأساسي لا يزال غير مكتشف من قبل منتجات الأمان الرئيسية، بما في ذلك:
* **Microsoft Defender**: غير مكتشف
* **Kaspersky**: غير مكتشف
* **ESET-NOD32**: غير مكتشف
* **BitDefender**: غير مكتشف
بينما يتم تجاوز التوقيعات الثابتة، قد تولد بعض أنظمة مكافحة الفيروسات من الجيل التالي و EDRs (مثل CrowdStrike أو Symantec) علامات استدلالية مصنفة كـ "مشبوهة" أو "عالية الثقة خبيثة". عادة ما يتم تشغيل هذه الكشوفات بسبب التعقيد المعماري العالي ووجود أقسام PE مخصصة بدلاً من الكود الخبيث القابل للتحديد.
### الخصائص الهيكلية والأدلة الجنائية
* **إدارة الإنتروبيا**: ينتج التنفيذ الحالي إنتروبيا عالمية تبلغ حوالي 6.2. يتم موازنة ذلك عمداً ليكون مرتفعاً بما يكفي لإخفاء المنطق ولكن منخفضاً بما يكفي لتجنب تنبيهات "الملف المضغوط" الشائعة الناتجة عن مستويات الإنتروبيا فوق 7.0.
* **تخصيص الأقسام**: يتضمن التكوين الافتراضي 23 قسم PE، بعضها يستخدم أسماء خادعة (مثل `.themida`, `.vmp0`, `.enigma2`) لمحاكاة الحمايات التجارية المعروفة.
* **التحسين الاستدلالي**: لتقليل درجة الاشتباه بشكل أكبر، يمكن للمستخدمين إعادة تسمية هذه الأقسام إلى سلاسل عامة (مثل `.data_01`, `.rdata_aux`). غالباً ما يؤدي توحيد أسماء الأقسام إلى خفض درجة "التفرد" الاستدلالية، مما يجعل الثنائي يبدو أكثر كتطبيق مترجم تقليدي.
* **تمويه الواردات**: تقوم المكتبة بإلغاء بصمة جدول عناوين الواردات (IAT) لوظائف API الهامة في Windows. باستخدام كتلة عملية البيئة (PEB) للحل ومحرك الاستدعاءات النظامية غير المباشرة، يحافظ الثنائي على مكدس استدعاء نظيف، مما يمنع مراقبي السلوك من تتبع الاستدعاءات النظامية إلى مناطق الكود المحمي.
- **شرح سريع**:
* **استنتاج SSN**: لتجاوز خطافات وضع المستخدم التي غالباً ما توضع على تيار تعليمات ntdll.dll، يستخدم المحرك خوارزمية فرز نسبي. عن طريق تحليل دليل التصدير وفرز جميع الدوال ذات البادئة Zw حسب عناوين الذاكرة الخاصة بها، يستنتج المحرك أرقام خدمات النظام (SSNs) بناءً على فهرسها النسبي. هذا يسمح للإطار بتحديد فهرس الاستدعاء النظامي الصحيح دون الحاجة لقراءة البايتات المخطوفة لمقدمة الدالة.
* **كتل الاستدعاء النظامي الديناميكية**: بدلاً من استخدام تعليمات الاستدعاء النظامي الثابتة داخل الثنائي على مستوى المستخدم، تقوم المكتبة بتخصيص ذاكرة قابلة للتنفيذ ديناميكياً لاستضافة كتل انتقالية عابرة. يملأ المحرك هذه الكتل بتسلسل شيل كود مخصص (`mov r10, rcx; mov eax, ssnnumber; syscall; ret`) لتنفيذ الاستدعاءات النظامية بشكل غير مباشر.
* **التمهيد المتسلسل**: عملية الحل متمهدة ذاتياً؛ يستخدم المحرك استدعاءاً محلولاً أولياً لتأسيس البيئة للاستدعاءات النظامية غير المباشرة اللاحقة. هذا يضمن أن دورة حياة العملية بأكملها - من تعداد الوحدات إلى تنفيذ الدوال - تظل غير شفافة لمراقبي السلوك وتحافظ على مكدس استدعاء نظيف.
* **مكافحة الأدلة الجنائية**: يضمن استخدام الحساب المختلط البولياني-الحسابي (MBA) وهندسة مجموعة التعليمات الافتراضية متعددة الطبقات (V-ISA) أنه حتى إذا تم الحصول على تفريغ ذاكرة، فإن المنطق الأساسي غير تافه لإعادة بنائه من خلال أدوات إزالة التمويه الآلية.
### الاستخدام
1. قم بتضمين `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` في ملف مشروعك الرئيسي (مثل `main.cpp`).
```cpp
#include "Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp" // ضبط المسار حسب الحاجة
```
2. قم بتغليف نص دالة `main` الخاصة بك باستخدام `_main`:
```cpp
_main({
// كود main الأصلي لتطبيقك هنا
// مثال:
// OBFUSCATE_STRING("Hello, Obfuscated World!").c_str();
// استخدام فئة تغليف API
k8_NetworkingAPIs::NetworkingAPI* netAPI = new k8_NetworkingAPIs::NetworkingAPI;
if (netAPI->IsInitialized() && netAPI->pInternetOpenA) {
HINTERNET hInternet = netAPI->pInternetOpenA(OBFUSCATE_STRING("MyAgent").c_str(), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (hInternet) {
// ... استخدم hInternet ...
netAPI->pInternetCloseHandle(hInternet);
}
}
delete netAPI;
})
```
3. استخدم `OBFUSCATE_STRING("your string")` لجميع السلاسل النصية الهامة. قم بالوصول إلى السلسلة المفككة عبر دالة `.c_str()` إذا لزم الأمر لاستدعاءات API، أو استخدم دوالها الأخرى مثل `.print_to_console()` إذا كانت متوفرة من `Obfusk8/Instrumentation/materialization/transform/AES8.hpp`.
4. استخدم `STEALTH_API_OBFSTR("dll_name.dll", "FunctionNameA")` لاستدعاءات API خفية مباشرة، أو استخدم فئات تغليف API (مثل `K8_ProcessManipulationAPIs::ProcessAPI`, `k8_NetworkingAPIs::NetworkingAPI`) للراحة والتمويه المدمج.
5. أضف `OBF_BOGUS_FLOW_*`, `OBF_CALL_ANY_LOCAL_JUNK`, `NOP()` وأساسيات أخرى في أجزاء الكود الحساسة للأداء لمزيد من طبقات التمويه.
* انظر الملف main.cpp.
### البناء
* **متطلبات المترجم**: هذه المكتبة مصممة لـ C++17. مترجم Microsoft C++ (`cl.exe`) هو المستهدف الأساسي، خاصة لميزات أقسام PE واستخدام SEH.
* **الحصول على `cl.exe` (مترجم MSVC) على Windows**:
1. **تثبيت Visual Studio**: أسهل طريقة للحصول على `cl.exe` هي تثبيت Visual Studio. يمكنك تنزيل إصدار Visual Studio Community مجاناً من [موقع Visual Studio](https://visualstudio.microsoft.com/downloads/).
2. **اختيار عبء العمل**: أثناء التثبيت، تأكد من تحديد عبء العمل "Desktop development with C++". سيقوم هذا بتثبيت مترجم C++، وWindows SDK، وأدوات ضرورية أخرى.
3. **استخدام موجه أوامر المطور**: بعد التثبيت، ابحث عن "Developer Command Prompt for VS" (مثل "x64 Native Tools Command Prompt for VS 2022") في قائمة ابدأ وقم بتشغيله. يقوم موجه الأوامر هذا بتعيين متغيرات البيئة (PATH, INCLUDE, LIB) اللازمة لاستخدام `cl.exe` تلقائياً.
* **مسارات التضمين**:
* تأكد من أن الدليل الذي يحتوي على `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` موجود في مسار التضمين للمترجم.
* إذا كانت `Obfusk8/Instrumentation/materialization/transform/AES8.hpp`، `Obfusk8/Instrumentation/materialization/transform/Resolve8.hpp`، وأدلة تغليف API (مثل `k8_NetworkingAPIs/`) ليست في نفس الدليل الذي به `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp`، فتأكد من تهيئة مساراتها بشكل صحيح. يستخدم `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` مسارات نسبية مثل `../Obfusk8Core.hpp` لبعض تضميناته الداخلية لأغلفة API، لذلك فإن هيكل الدليل مهم. إذا كان `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` في جذر دليل التضمين الخاص بك لهذه المكتبة، فيجب أن تكون أغلفة API في مجلدات فرعية مثل `k8_NetworkingAPIs/` نسبة إلى المكان الذي يتوقعه `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` أو قم بتعديل مسارات التضمين داخل `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` نفسه.
* **مثال على التجميع (باستخدام موجه أوامر المطور)**:
بافتراض أن `main.cpp` ورؤوس Obfusk8 مهيأة بشكل صحيح، يمكنك التجميع باستخدام أمر مشابه لـ:
```bash
cl /std:c++17 /EHsc main.cpp
```
* بعد فتح `x64 Native Tools Command Prompt for VS 2022`:

* `/std:c++17`: يحدد معيار C++17.
* `/EHsc`: يحدد نموذج معالجة الاستثناءات في C++.
* `main.cpp`: ملف المصدر الرئيسي الخاص بك.
* `/I"path/to/your/obfusk8_includes"`: (اختياري، إذا لم تكن الرؤوس في المسارات الافتراضية) أضف الدليل حيث يوجد `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` وتبعياته. إذا كانت في مجلدات فرعية، فتأكد من تطابق المسارات النسبية داخل `Obfusk8Core.hpp` مع تخطيطك.
* **ملاحظة حول المكتبات**: بينما يهدف حل API الخفي إلى تجنب الربط الثابت للدوال المموهة، فإن رؤوس Windows SDK نفسها قد تتطلب توفر ملفات `.lib` معينة للرابط لحل أي استخدام غير مموه لـ SDK أو أنواع داخلية (مثل `Ws2_32.lib`, `Wininet.lib`, `Advapi32.lib`, إلخ.). بالنسبة لمشروع بسيط مثل `cl /std:c++17 /EHsc main.cpp`، غالباً ما يقوم الرابط بحلها تلقائياً إذا كانت مكتبات Windows قياسية.
* **CMAKE**: يمكنك بناء Obfusk8 باستخدام cmake أيضاً.
1. استنساخ والانضمام إلى المستودع: `git clone https://github.com/x86byte/Obfusk8.git` والانضمام إلى الدليل `cd Obfusk8`
2. تكوين وإنشاء الملفات: `cmake CMakeLists.txt`
3. التحديد التلقائي لأدوات البناء والتجميع: `cmake --build .`
* بعد فتح `x64 Native Tools Command Prompt for VS 2022`:

* **CMAKE && Microsoft Visual Studio**:
* بعد فتح `microsoft visual studio`، انقر على `Ctrl + B` لتجميع المشروع:

* **اعتبارات حول حجم الثنائي والتحسينات المستقبلية**:
* **تأثير الحجم**: كن على علم بأن الاستخدام المكثف للتمويه القائم على الرؤوس، خاصة مع تقنيات مثل تضمين الكود غير المرغوب فيه، وتوسعات MBA، وتدفق التحكم المسطح، يمكن أن يؤدي إلى زيادة كبيرة في حجم الثنائي النهائي. قد ينمو برنامج صغير من كيلوبايتات إلى 2 ميجابايت أو أكثر، اعتماداً على شدة التمويه المطبق.
* **التخصيص والتعبئة (اتجاه مستقبلي)**:
* حالياً، يركز Obfusk8 على التمويه داخل الكود. قد يحتاج المستخدمون إلى ضبط استخدام الماكروات المختلفة بدقة (مثل تقليل كثافة `OBF_CALL_ANY_LOCAL_JUNK` أو تعقيد حلقات `_main`) إذا كان حجم الثنائي قيداً بالغ الأهمية.
* لتقليل الحجم بشكل كبير بعد التمويه، سيكون دمج أو استخدام أداة تعبئة PE خارجية (مثل UPX, MPRESS، أو حلول مخصصة) خطوة منفصلة.
* يمكن للتطوير المستقبلي لـ Obfusk8 استكشاف خيارات للتحكم الأكثر دقة في شدة التمويه أو حتى دمج كتل تعبئة/ضغط خفيفة الوزن مباشرة داخل المكتبة، على الرغم من أن هذا سيزيد من تعقيدها بشكل كبير.
### تمويه PE بعد البناء
يتضمن Obfusk8 سكريبت ما بعد البناء لزيادة تعزيز الثنائي المترجم عن طريق إزالة الآثار الجنائية.
* **موقع السكريبت**: `Obfusk8/SCRIPTS/obfuscate_pe.ps1`
* **ما يفعله**:
1. **يزيل الرأس الغني (Rich Header)** — يزيل بصمة بيئة بناء MSVC التي تكشف عن إصدار المترجم وتفاصيل مجموعة الأدوات.
2. **يزيف TimeDateStamp** — يستبدل طابع وقت رأس PE بقيمة ثابتة لإخفاء وقت البناء.
3. **يمسح دليل التصحيح** — يمحو إدخالات دليل التصحيح التي قد تسرب مسارات PDB أو بيانات تعريف البناء.
* **الاستخدام**:
قم بتشغيله كخطوة ما بعد البناء بعد التجميع:
```powershell
PowerShell -NoProfile -ExecutionPolicy Bypass -File Obfusk8/SCRIPTS/obfuscate_pe.ps1 -Path "path\to\Obfusk8.exe"
```
يقوم السكريبت بتعديل الثنائي في مكانه. لا يتم إنشاء نسخة احتياطية.
### عرض توضيحي
[[Obfusk8: مكتبة تمويه تعتمد على C++17 - عرض رسومي لـ IDA pro] ~فيديو توضيحي](https://youtu.be/B9g4KSg3tHQ)
### المساهمة والملاحظاتهذا المشروع، Obfusk8، هو استكشاف مستمر لتقنيات التعتيم المتقدمة بلغة C++. الإصدار الحالي يضع أساسًا قويًا بمجموعة من الاستراتيجيات المتشابكة.
* **ملاحظاتك لا تُقدر بثمن**: بصفتي مطور Obfusk8، أنا مهتم جدًا بوجهة نظرك ورؤيتك وأي ملاحظات قد تكون لديك. سواء كانت اقتراحات لميزات جديدة، تحسينات للتقنيات الحالية، تقارير عن محاولات هندسة عكسية ناجحة (أو غير ناجحة) ضد الكود المحمي بواسطة Obfusk8، أو أفكار عامة حول سهولة استخدام المكتبة وفعاليتها.
* **المساهمة**: جميع المساهمات مرحب بها ومقدرة للغاية. يزدهر هذا المشروع من خلال مدخلات المجتمع والاختبارات الواقعية لدفع حدوده وجعله أداة أكثر قوة لحماية الكود. لا تتردد في مشاركة أفكارك، أو طرح المشكلات، أو المساهمة في تطوره!.
* **[كيف تساهم في Obfusk8؟](https://opensource.guide/how-to-contribute/)**
### شكر خاص
* [sadMosquito](https://github.com/sadMosquito) — للإبلاغ عن المشكلات واختبار المشروع
**إخلاء مسؤولية**
التعتيم هو طبقة دفاع، وليس حلاً مضمونًا. يمكن للمهاجمين المصممين ذوي المهارات والوقت الكافيين غالبًا إجراء هندسة عكسية للكود المُعتم. يهدف Obfusk8 إلى رفع مستوى الصعوبة بشكل كبير لمثل هذه المحاولات. استخدمه بالتزامن مع إجراءات أمنية أخرى.
**تواصل معنا**
إذا كنت ترغب في مشاركة ملاحظات، أو مناقشة تقنيات التعتيم، أو الإبلاغ عن محاولات هندسة عكسية، أو مجرد إجراء نقاش تقني، فلا تتردد في التواصل مباشرة. أنا دائمًا منفتح على المحادثات البناءة والتعاون (سأكون سعيدًا بالتعاون في مشاريع متعلقة بالتعتيم أو أي شيء آخر).
- x : https://x.com/x86byte
- telegram: https://t.me/x86byte
- discord: @x86byte