
أداة فك تعتيم لـ ConfuserEx2 مع دعم لمكافحة العبث، والضاغط، والثوابت، وتدفق التحكم، واستعادة الموارد.
تفرّع محسّن من UnconfuserEx مع دعم محسّن لنسخ ConfuserEx2 الحديثة، واستعادة anti-tamper، وإزالة الضاغط، واستعادة تدفق التحكم، وإعادة بناء الموارد.
https://github.com/user-attachments/assets/de2c7fd9-6736-4f39-83c0-3c25aa9c1f24
إذا سبق لك أن لعبت مع عينات من البرمجيات الخبيثة، فإن بعضها مُعمّى باستخدام ConfuserEx، وقد جرّبت بعض أدوات إزالة التعتيم العامة على أحدث إصدار لكنها لم تعمل فقط، لذلك قررت التفرّع من أداة عامة عملت فعلًا مع ذلك الإصدار الأحدث وتعديلها حسب احتياجاتي.
هذا المستودع هو تفرّع من MadMin3r/UnconfuserEx. يعود الفضل إليه أيضًا. لقد أنجز المشروع الأصلي الجزء الصعب المتمثل في صنع أداة إزالة تعتيم مركّزة لـ ConfuserEx2 قادرة فعلًا على إزالة الحمايات الحقيقية.
هذا هو ما يفعله هذا المشروع. يشغّل قائمة من أدوات الإزالة بترتيب ثابت، ويعيد كتابة نصوص الدوال/الموارد/البيانات الوصفية حيثما أمكن، ثم يكتب تجميعة جديدة في النهاية. الجزء المهم هو الترتيب. يجب أن يعمل كل من الضاغط وanti-tamper مبكرًا لأن بقية الوحدة قد لا تكون حتى IL حقيقية بعد.
كانت النسخة الأصلية مفيدة بالفعل، لكن بعض الحالات ظلّت تظهر باستمرار.
كان أحدها مسار LZMA. بعض العينات تمنحك بايتات تبدو وكأنها حمولة الثوابت/الموارد، لكن خصائص LZMA تكون هراءً. إذا مرّرت ذلك مباشرةً إلى وحدة فك الترميز، ستحصل على أحجام قاموس سخيفة وفي النهاية استثناءات مثل أبعاد مصفوفة تتجاوز النطاق المدعوم. لذلك تتحقق هذه النسخة من الخصائص، وتضع حدًا أقصى لحجم القاموس، وحدًا أقصى لحجم البيانات غير المضغوطة، وتنسحب قبل أن تخصّص وحدة فك الترميز شيئًا سخيفًا.
LZMA properties => CE FD 62 5F 9F
Invalid LZMA properties byte 0xCE or unreasonable dictionary size
كانت هناك مشكلة أخرى متعلقة بـ Constants، غبية لكنها حقيقية. جزء كبير من كود الحلّ يريد أن يكون المعرّف الموجود أمام استدعاء الجالب ldc.i4. أحيانًا لم يعد تعليمة واحدة. بل أصبح تعبيرًا حسابيًا صغيرًا.
ldc.i4 0x1234
ldc.i4 0x55
xor
call string <const getter>(int32)
يرى التفرّع الأصلي xor، ويستدعي GetLdcI4Value()، ثم ينهار لأن xor ليس تحميل عدد صحيح بوضوح. هذه النسخة تعيد السير عبر التسلسل الحسابي الصغير، وتحاكي المكدس، وتطويه مرة أخرى إلى ldc.i4 واحدة، ثم تترك الحلّ الطبيعي يكمل عمله.
إذن بدلًا من التعامل مع هذا كحماية Constants مختلفة تمامًا، يصبح هكذا:
ldc.i4 0x1261
call string <const getter>(int32)
ثم يمكن لمسار حلّ الثوابت العادي/x86 الحالي أداء وظيفته.
أما تدفق التحكم فكان أداؤه متوسطًا.
يمكن لأداة إزالة التبديل التعامل مع الشكل الطبيعي لمُوزِّع التبديل في ConfuserEx. فهي تتنقل بين الكتل، وتستعيد الهدف التالي، وتحذف الكتل الميتة، وتُخرج نص دالة سليمًا. لكن هناك عينات لا يُفهم منها سوى جزء من الدالة. إذا عَدّلت نصف دالة ثم اكتشفت أنها ما زالت مُعمّاة، فإن الناتج يكون أسوأ من عديم الفائدة، لأن لديك الآن IL مكسورًا ولا توجد طريقة نظيفة لفهم ما حدث.
لذلك تلتقط هذه النسخة لقطة من نص الدالة قبل لمسه:
instructions
exception handlers
إذا ما ألقى إجراء إزالة التعتيم استثناءً، أو إذا بدت الدالة ما زالت مُعمّاة بعد ذلك، تتم استعادة النص الأصلي. يمكن أن يظل السجل يقول «لم يتم حلّ هذه الدالة»، لكن التجميعة لن تُتلف بصمت لمجرد أن دالة واحدة احتوت على مُوزِّع غريب.
حصل تدفق التحكم عبر القفزات/الترامبولين على معالجة خاصة به أيضًا. بعض الدوال ليست مجرد مُوزِّعات تبديل. إنها ترامبولينات فرع صغيرة متسلسلة حتى الوصول إلى الكتلة الحقيقية. تُكتشف هذه الآن وتُطوى بدلًا من تجاهلها عبر مسار التبديل فقط.
أداة إزالة الضاغط هي الجزء الذي يجب أن يعمل قبل أي شيء آخر.
عادةً ما تُبقي أكواد ضاغط ConfuserEx الوهمية التجميعة الحقيقية مضغوطة، وتُقلع محمّلًا صغيرًا، وتفك ضغط الحمولة، وتحمّلها في وقت التشغيل.
تجد أداة الإزالة شكل المحمّل، وتستخرج الحمولة المضمنة، وتفك ضغطها، وتستبدل الوحدة بالتجميعة الحقيقية. تتم معالجة تخطيطَي الضاغط العادي والمضغوط معًا.
[+] Compressor detected
[+] Extracted compressed module payload
[+] Decompressed real module
[+] Continuing pipeline on unpacked assembly
أصبح لدى Anti-tamper مساران الآن.
يعمل anti tamper العادي/الديناميكي على فك تشفير نصوص الدوال من الأقسام المحمية وإعادة كتابة النصوص المستعادة في الوحدة. أما JIT anti tamper فهو أكثر إزعاجًا لأن النصوص مُصممة لتُستحضر عندما يطلبها وقت التشغيل.
الشكل التقريبي هو:
find init
extract keys
find encrypted JIT body section
derive per method key
read body
write CilBody back
ما زال هذا قائمًا على الأنماط. إذا تغيّر الكود الوهمي بما يكفي، فسيُخطئ الهدف، وهذا واضح.
تتم معالجة الموارد بشكل مشابه لـ Constants: العثور على كتلة الموارد المشفّرة، واستعادة شكل المفتاح/وحدة فك التشفير، وفك التشفير، وفك الضغط إذا لزم الأمر، ثم إعادة الموارد إلى المكان الذي تتوقعها فيه أدوات .NET العادية.
هناك أيضًا مسار اختياري لإعادة بناء الـ PE المضمن. بعض العينات المحمية تحمل PE مُدارًا داخل مورد. مع تفعيل إعادة البناء، تحاول أداة الإزالة تحليل تلك الحمولة وإعادة كتابتها أيضًا، بدلًا من ترك تجميعة خارجية بعد إزالة التعتيم مع تجميعة داخلية لم تُمسّ.
UnConfuserEx.exe sample.exe sample.clean.exe --rebuild-embedded-pe
استخدم ذلك عندما تعلم أن العينة تخفي تجميعة مُدارة أخرى داخل الموارد. إذا لم تكن الحمولة PE مُدارًا، فيجب أن يتركها مسار إعادة البناء وشأنها.
قم ببنائها:
dotnet build .\UnConfuserEx.sln -c Release
قم بتشغيلها:
.\UnConfuserEx\bin\Release\net9.0\UnConfuserEx.exe .\protected.exe
أو أعطِها مسار إخراج صريحًا:
.\UnConfuserEx\bin\Release\net9.0\UnConfuserEx.exe .\protected.exe .\protected.clean.exe
إذا لم تعطِ مسار إخراج، فستكتب واحدًا بجوار المدخل مع إضافة -deobfuscated إلى الاسم.
للحمولات المُدارة المضمنة:
.\UnConfuserEx\bin\Release\net9.0\UnConfuserEx.exe .\protected.exe .\protected.clean.exe --rebuild-embedded-pe
هذه هي قائمة الدعم الحالية. لا يعني ذلك أن كل تفرّع محتمل من ConfuserEx يعمل. بل يعني أن هذه هي الأشكال التي يعرف خط الأنابيب كيفية البحث عنها.
ربما يوجد المزيد مخفيًا في الكود نسيتُ إدراجه xD.
السجلات المفيدة هي التي تخبرك أي مرحلة فشلت، وليس فقط أن الناتج لم يعمل.
مثال على مسار Constants بعد إصلاحه:
Constants detected, attempting to remove
Found 3 constant getter(s)
Detected constant decryption type is Dynamic
Decompressed constants blob to 18492 byte(s)
Resolving getter <Module>::???????? as String with 41 call site method(s)
Removed all instances of getter <Module>::????????
مثال على دالة تدفق تحكم تُركت كما هي عمدًا:
Removing obfuscation from method System.Void Example::Run()
Method System.Void Example::Run() still appears obfuscated after deobfuscation -- left original body intact
Removed obfuscation from 42 methods. Failed to remove from 0 methods. 1 methods left untouched
هذا السجل الثاني ليس مثاليًا، لكنه صادق على الأقل
تفرّع مخصص من ConfuserEx يغيّر كل شكل من أشكال الدوال المساعدة.
جالب Constants يحسب معرّفه عبر فوضى تدفق تحكم كاملة بدلًا من تعبير مكدس صغير.
رسم بياني لتدفق التحكم حيث يعتمد المُوزِّع على قيم وقت تشغيل لا يعرفها المحاكي الثابت.
دوال مساعدة أصلية تحتاج تنفيذًا فعليًا في وقت التشغيل بدلًا من محاكاة IL.
تجميعات كانت معطوبة أصلًا قبل تعميتها.
نسخ JIT anti-tamper ذات تخطيط مختلف للنص المشفّر.
إذا أردت أن يكون تقرير المشكلة مفيدًا، فقم بتضمين بيانات كافية لإعادة إنتاجها.
أزل امتدادات الملفات من العينات قبل رفعها.
ضع كل شيء في أرشيف معًا وأدرج ما يلي:
Command:
UnConfuserEx.exe <target> <optional output>
Failure stage:
- compressor
- anti tamper
- constants
- control flow
- resources
- writing output
- runtime after deobfuscation
Expected result:
Actual result:
Console output:
Archive link:
Notes / investigation:
إذا كان كل ما ترسله هو «لا يعمل»، فستكون الإجابة على الأرجح «نعم».
الإصلاحات الصغيرة المركّزة أفضل من إعادة الكتابة الضخمة.
إذا أضفت دعمًا لشكل حماية جديد، فأبقِه معزولًا في أداة الإزالة المختصة به. إذا أضفت سلوك تراجع احتياطي، فتأكد من أن الفشل لا يُتلف التجميعة الناتجة. إذا تعاملت مع تدفق التحكم، فافترض أن العينة الغريبة التي أصلحتها ليست العينة الغريبة الوحيدة الموجودة :DDD.
فقط لا تجعل الأداة أصعب في التصحيح.
يعتمد هذا المشروع على MadMin3r/UnconfuserEx.
وفّر المشروع الأصلي الأساس ومعظم خط أنابيب إزالة التعتيم الأساسي. يركز هذا التفرّع على تحسين الموثوقية، وإضافة دعم لنسخ حماية إضافية، ومعالجة الحالات الحدّية التي لوحظت في عينات من العالم الحقيقي.
بدأ هذا المشروع كأداة عملية في الهندسة العكسية وليس كممارسة في هندسة البرمجيات. كان التركيز دائمًا على استعادة التجميعات المحمية بشكل موثوق بدلًا من الحفاظ على جودة كود مثالية.
هذه الأداة مخصّصة لتحليل البرمجيات الخبيثة المصرّح به، والهندسة العكسية، واستعادة البرمجيات، وقابلية التشغيل البيني، والبحث التعليمي.
يتحمّل المستخدمون مسؤولية الامتثال للقوانين المعمول بها والحصول على أي تصريح مطلوب قبل تحليل أي برمجيات أو أنظمة أو الوصول إليها أو معالجتها.
لا تأذن Zypherion Technologies بالاستخدام غير القانوني لهذه الأداة وتتبرّأ من المسؤولية عن إساءة الاستخدام من قبل أطراف ثالثة.
لا شيء في هذا المستودع أو على www.zypherion.tech يُعدّ استشارة قانونية.