
إضافة WinDbg x64 تفكّك الدوال الحية وتستخدم نموذج LLM لإنتاج شبه كود متحقق منه.


هذا المشروع هو هيكل أساسي لملحق WinDbg لأنظمة Windows x64 يحل دالة بالاسم أو العنوان، ويعيد بناء عرض تدفق تحكم حتمي، ويطلب من LLM مباشرة من الملحق لإنتاج شبه كود.
src/extension: ملف DLL لملحق WinDbg وأمر !decomp.src/shared: كود JSON والمحلل والبروتوكول والمدقق المشترك بين الملحق.scripts: أدوات البناء ونسخ المورّدين.third_party/dbgeng: نسخة اختيارية مضمّنة من dbgeng.h وdbgeng.lib.third_party/zydis: شجرة مصادر Zydis المستقرة المضمّنة المستخدمة افتراضيًا عند وجودها.xmm0 إلى xmm3، مع حراسات لصيغة الصفر المتجهة لتجنب الوسائط الواردة الخاطئة/deobf:on|off في ما إذا كانت حقائق الإرباك المستعادة قد توجه إعادة كتابة شبه-Cقم بتحميل الملحق من مخرجات البناء، ثم قم بتشغيل !decomp على رمز أو عنوان:```text
.load C:\path\to\decomp.dll
!decomp /doctor
!decomp module!FunctionName
!decomp 0x7ffb`12345678
استخدم `/doctor` عندما يبدو الإعداد خاطئًا أو قبل تمكين مزوّد LLM:```text
!decomp /doctor
!decomp /doctor:net
/doctor لا يتطلب هدفًا ولا يستدعي المزوّد. بل يُبلغ عن مسار التكوين/حالة التحميل، وملخص المزوّد/النموذج/نقطة النهاية، ووجود المصادقة دون الأسرار، وإعدادات المهلة/الرمز/التقسيم، ودعم DML، وفئة الجلسة/المؤهل، ونوع المعالج، ومحاذير PDB./doctor:net كطلب صريح للتحقق من الشبكة، لكنه يُبلغ حاليًا بأن فحص اتصال المزوّد (ping) يتم تخطيه. لا تقوم الإضافة بإجراء فحص شبكة من وضع doctor.يمكن أن تكون الأهداف رموزًا عامة/خاصة، أو أسماء دوال مُصدَّرة، أو عناوين. إذا تم تحليل الهدف إلى عنوان داخل دالة، تحاول الإضافة استعادة نطاق الدالة الحاوية من الرموز، وبيانات unwind، واستدلالات تدفق التحكم. ضع علامات اقتباس حول الأهداف التي تحتوي على مسافات:```text !decomp "my module!Function With Spaces"
مسار الأمر العادي يقوم بالتحليل المحلي، ويبني حقائق المحلل، ويستدعي اختياريًا نقطة نهاية LLM المكوّنة، ويتحقق من الاستجابة مقابل الأدلة المسترجعة، ويطبع كود C الزائف مع الثقة والتحذيرات وملاحظات عدم اليقين:```text
!decomp ntdll!RtlAllocateHeap
!decomp kernel32!Sleep
!decomp game.exe!CheckIntegrity
يتضمن الإخراج العادي، وbrief، وexplain تدفق تقدم مضغوط حتى بدون /verbose. تُظهر عمليات تشغيل LLM الطويلة اكتمال التحليل المحلي، وتقدّم الأجزاء، وإشعارات إعادة المحاولة، وبدء الدمج، والتحقق، وتلميح الإلغاء عبر Ctrl+Break. تعمل الأوضاع القابلة للقراءة آليًا مثل /view:json و/view:facts و/view:prompt و/view:data على إخفاء خطوط التقدم وروابط مساعد DML بحيث تستقبل البرامج النصية الحمولة المطلوبة فقط.
استخدم /view:* لاختيار ما تريد رؤيته. هذا يُبقي سطح الأوامر صغيرًا: خيار واحد يتحكم في جميع أوضاع الإخراج.```text
!decomp /view:brief module!HotPath
!decomp /view:explain module!BranchyFunction
!decomp /view:json module!FunctionName
!decomp /view:facts module!FunctionName
!decomp /view:prompt module!FunctionName
!decomp /view:data module!FunctionName
!decomp /view:analyzer module!FunctionName
!decomp /view:plan module!FunctionName
- `brief` يطبع الهدف، والثقة، والملخص، وأول تحذير عدم يقين أو تحذير من المُتحقِّق.
- `explain` يضيف أقسام الأدلة، وتدفق التحكم، وتلميحات الأنواع، والسلوك الملاحَظ، وأهداف الاستدعاء.
- `json` يطبع JSON للطلب والاستجابة قابلًا للقراءة آليًا.
- `facts` يطبع حقائق المُحلِّل فقط ويعطّل مسار LLM.
- `prompt` يطبع موجّه النظام وموجّه المستخدم وحقائق الموجّه بالضبط. ويعطّل استدعاء LLM.
- `data` يطبع لقطة JSON ثابتة مخصّصة للأتمتة بأسلوب WinDbg JavaScript/NatVis.
- `analyzer` يعرض مسار الكود الزائف الحتمي الخاص بالمُحلِّل فقط دون استدعاء LLM.
- `plan` ينفّذ تحليلًا محليًا ويطبع خطة فحص مسبق دون استدعاء LLM أو تحديث ذاكرة التخزين المؤقت للنتائج. ويتضمن أعداد الأهداف/الوحدات/النطاقات، وتوفّر PDB، وسياسة الجلسة، والتقسيم التقديري، والأعداد ذات الصلة بحجم الموجّه، وتوصيات عملية.
استخدم `/verbose` عندما يبدو أن أمرًا ما عالقًا أو عندما تريد رؤية دفق التقدّم الكامل:```text
!decomp /verbose module!SlowFunction
!decomp /verbose /view:json module!SlowFunction
/verbose يطبع المراحل المحلية مثل تحليل الهدف، واستعادة نطاق الدوال، وقراءات البايت، وفك التجميع، وبناء حقائق المحلل، وإثراء PDB/الجلسة، وتقطيع الشيفرة الزائفة إلى رموز، ونتائج المدقق./verbose أيضًا أحجام المطالبات، وموازين رموز الطلب، ومراحل اتصال/إرسال/استقبال HTTP، وأحجام أجزاء الاستجابة، وسبب الإنهاء، ومعاينة JSON للنموذج المستخرج، ومحاولات إعادة المحاولة، وقرارات إعادة المحاولة بناءً على ملاحظات المدقق./verbose يستبدل دفق التقدم المدمج بالتتبع الكامل. استخدمه عندما لا تكفي أسطر التقدم المدمجة لتشخيص أين يذهب الوقت.!decomp طويل الأمد، اضغط Ctrl+Break في WinDbg لطلب الإلغاء. تتحقق الإضافة من الانقطاعات بين مراحل التحليل المحلية وأثناء انتظار عامل LLM، ثم تطلب من إدخال/إخراج HTTP المتزامن النشط التوقف.الأسماء المستعارة القديمة مثل /brief، و/explain، و/json، و/facts-only، و/debug-prompt، و/data-model، و/dx، و/no-llm لا تزال تعمل مع البرامج النصية القديمة، لكن الأمثلة الجديدة تستخدم /view:*.
عارض النافذة:```text !decomp /view:window module!FunctionName !decomp /view:window /view:explain module!FunctionName
- `/view:window` يشغّل مسار النتيجة العادي لـ `!decomp` للهدف ويفتح النتيجة المعروضة بالكامل في عارض منفصل.
- يستخدم العارض نفس مُصيّر الاستجابة المستخدم في مسار الكونسول، ثم يفتح نافذة أدوات Win32 أصلية غير نمطية (modeless) مملوكة لنافذة المُنقّح (debugger) عند العثور على واحدة.
- يُبلغ مُخرج المُنقّح عن مقبض نافذة العارض الأصلية. إذا تعذّر إنشاء نافذة العارض، يطبع الأمر تحذيرًا ويتراجع إلى نتيجة الكونسول العادية.
- تُعرض روابط DML فقط كتسميات نصية مع سلاسل أوامرها في العارض. عند توفر RichEdit، تستخدم النافذة تخطيط RTF بأسلوب GitHub مع عناوين أقسام، وتنسيق بيانات وصفية، وتمييز شبه كود؛ وإلا فإنها تتراجع إلى نص عادي.
- عندما تحتوي الجلسة الحالية على نتائج مخزنة سابقًا، يعرض العارض قائمة سجل على الجانب الأيسر بحيث يمكنك التبديل بين الإخراج الحالي ونتائج التفكيك السابقة دون إعادة تشغيل التحليل.
- تظل `/view:json` و`/view:facts` و`/view:prompt` و`/view:data` مخرجات كونسول قابلة للقراءة آليًا ولا تتم إعادة توجيهها إلى العارض.
دوال كبيرة:```text
!decomp /limit:deep module!LargeFunction
!decomp /limit:huge module!VeryLargeFunction
!decomp /limit:12000 module!VeryLargeFunction
!decomp /timeout:120000 module!SlowFunction
/limit:deep يرفع حد التعليمات إلى 8192./limit:huge يرفع حد التعليمات إلى 16384./limit:N يضبط حد تعليمات صريحًا./timeout:MS يتجاوز مهلة الطلب لهذا الاستدعاء.decomp.llm.json؛ يتحكم حد التعليمات في سطر الأوامر في مقدار الكود المحلي الذي تحاول الإضافة استعادته قبل المطالبة./deep و /huge و /maxinsn:N مدعومة.فك الترجمة المراعي للتعتيم:```text !decomp /deobf:on module!FlattenedFunction !decomp /deobf:off module!FlattenedFunction !decomp /view:facts /deobf:off module!FlattenedFunction
- `/deobf:on` هو الإعداد الافتراضي. ما يزال المحلل يُصدر حقائق أولية، لكن استعادة المُوزِّع عالية الثقة على نمط OLLVM، وإثبات الحواف الميتة المعتمة، وأنماط الاستبدال، وتراكبات CFG الدلالية قد تُوجّه حقائق التوجيه، وسياسة الدمج، وسياسة تعارض المُدقِّق، واستعادة الشبه-سي المنظمة.
- `/deobf:off` يُبقي حقائق `obfuscation` و `semantic_control_flow` و `deobfuscation_readiness` مرئية، لكنه يعطّل إجراءات إعادة الكتابة الآمنة، ويُبقي هيكلة تدفق التحكم على CFG الخام، ويُخبر مسارات التوجيه/الدمج/المدقِّق بالحفاظ على الشكل المعتم الخام.
- استخدم `/deobf:off` عندما تريد فحص المُوزِّع أو الفرع الزائف أو سطح الاستبدال مباشرةً بدلاً من مطالبة الامتداد باستعادة بنية غير معتمة.
- `/deobfuscation:on|off` يُقبل كاسم مستعار أطول.
مساعدات التخزين المؤقت وإعادة التشغيل:```text
!decomp /view:json module!FunctionName
!decomp /last:json
!decomp /view:explain module!FunctionName
!decomp /last:explain
!decomp /view:facts module!FunctionName
!decomp /last:facts
!decomp /view:data module!FunctionName
!decomp /last:data
!decomp /view:prompt module!FunctionName
!decomp /last:prompt
!decomp /history
!decomp /refresh module!FunctionName
!decomp /last:2:explain
!decomp /last:2:json
/last:json يعرض JSON الخاص بالطلب/الاستجابة السابق دون إعادة تشغيل التحليل./last:explain يعيد عرض النتيجة الكاملة السابقة مع قسم الشرح دون إعادة تشغيل التحليل أو استدعاء LLM./last:facts يعرض حقائق المحلل من النتيجة السابقة دون إعادة تشغيل التحليل./last:data يعرض لقطة نموذج البيانات السابقة دون إعادة تشغيل التحليل./last:prompt يعرض تفريغ المطالبة السابق دون إعادة تشغيل التحليل./history يسرد المخزن المؤقت الحلقي للنتائج في الذاكرة. الفهرس 1 هو أحدث نتيجة./refresh <target> يتجاوز إعادة تشغيل الأثر الدائم لهذا الهدف، ويشغّل تحليلًا محليًا جديدًا وتحليل LLM، ويستبدل الأثر المحفوظ بعد نتيجة ناجحة مدعومة بـ LLM./last:N:explain و /last:N:json و /last:N:facts و /last:N:data و يعيدون تشغيل نتيجة مخزنة أقدم حسب فهرس السجل دون إعادة تشغيل التحليل المحلي أو استدعاء LLM.التنقل عبر DML:
actions به روابط قابلة للنقر explain و json و facts و prompt و data-model و history لنفس الهدف.nav به روابط تفكيك نقطة الدخول ونقطة توقف الدخول وإعادة تشغيل آخر أثر.تفاصيل الوعي بالجلسة والسلوك المرصود:
/view:json و /view:facts و /view:prompt والوضع العادي لـ LLM session_policy.session_policy فئة التصحيح والمؤهِّل ونوع التنفيذ واستراتيجية التحليل وأعلام التفريغ/المباشر/النواة وما إذا كان دعم TTD يبدو محملاً.observed_behavior عنوان rip و rsp الحاليين وعنوان الإرجاع عندما يكون قابلاً للقراءة وعينات وسيطات سجلات x64 من مايكروسوفت (rcx, rdx, r8, r9) والنقاط الساخنة المتكررة للوصول إلى الذاكرة وأوامر TTD المقترحة.ttdext.dll أو في عملية المصحح، يضيف الامتداد استعلامات المقترحة بدلاً من الادعاء بصمت بأن بيانات التتبع قد جُمعت بالفعل.تتيح لك مفاتيح تصحيح المستخدم تصحيح حقائق المحلل من سطر الأوامر عندما يفتقر المصحح إلى معلومات دلالية كافية:```text !decomp /fix:noreturn:FatalError module!FunctionName !decomp /fix:type:rcx=MY_TYPE* module!FunctionName !decomp /fix:field:[rcx+18h]=uint32_t module!FunctionName !decomp /fix:rename:v3=request module!FunctionName !decomp /fix:clear
- `/fix:noreturn:name` يعامل الاستدعاءات المطابقة على أنها لا تُرجع قيمة (no-return) لأغراض التفكيك الاحتياطي، واستعادة مخطط تدفق التحكم (CFG)، وحقائق ABI، وفحوصات المدقق.
- `/fix:type:expr=TYPE` يضيف تلميح نوع مستخدم عالي الثقة.
- `/fix:field:expr=TYPE` يضيف تلميح حقل مستخدم عالي الثقة.
- `/fix:rename:old=new` يضيف تلميح إعادة تسمية ويطبّق إعادة التسمية على معرّفات شبه الكود النهائية.
- `/fix:clear` يمسح جميع تجاوزات التصحيح المستمرة عبر الجلسة.
يبقى متغير البيئة `DECOMP_NORETURN_OVERRIDES` مدعومًا. تُضاف قيم سطر الأوامر `/fix:noreturn:` فوق قيمة البيئة الأصلية لجلسة WinDbg الحالية.
مفاتيح التصحيح مستمرة عبر الجلسة:
- يتم تذكر `/fix:noreturn:` و`/fix:type:` و`/fix:field:` و`/fix:rename:` بواسطة الامتداد المُحمَّل وإعادة استخدامها في تشغيلات `!decomp` اللاحقة.
- يمسح `/fix:clear` جميع التصحيحات المستمرة عبر الجلسة ويعيد تجاوز البيئة الخاص بـ no-return إلى قيمته الأصلية من وقت تحميل الامتداد.
- تبقى الإصدارات القديمة `/noreturn:` و`/type:` و`/field:` و`/rename:` و`/clear-overrides` مدعومة.
يتم تجاهل قيم التصحيح غير الصالحة والإبلاغ عنها في `uncertainties` بدلاً من تخزينها مؤقتًا. على سبيل المثال، يتم تجاهل `/fix:type:rcx` لأنه لا يحتوي على زوج `expr=TYPE`.
سير العمل الموصى به للتحقيق:
1. ابدأ بـ `!decomp /view:facts target` للتأكد من أن نطاق الدالة والكتل والاستدعاءات والواردات وبيانات PDB وحقائق الجلسة تبدو معقولة.
2. استخدم `!decomp /view:plan target` لتقدير التقسيم إلى أجزاء، وحجم المطالبة، وخطر انتهاء المهلة، وجودة الرموز قبل إنفاق طلب LLM.
3. استخدم `!decomp /view:prompt target` عندما يبدو حجم المطالبة أو لغتها أو اختيار الأدلة خاطئًا.
4. شغّل `!decomp target` للحصول على نتيجة شبه-C الكاملة والمتحقق منها.
5. استخدم `!decomp /refresh target` عندما يتم إعادة تشغيل قطعة أثرية مستمرة موجودة ولكنك تحتاج إلى تحليل جديد.
6. إذا بدت النتيجة خاطئة، شغّل `!decomp /view:explain target` وافحص تحذيرات المدقق وتغطية الأدلة والإصلاحات المقترحة.
7. أضف تصحيحات مركّزة مثل `/fix:noreturn:` أو `/fix:type:` أو `/fix:field:` أو `/fix:rename:` وأعد تشغيل الهدف نفسه.
8. استخدم `/history` وإعادة تشغيل `/last:N:*` المفهرسة عند مقارنة عدة نتائج حديثة.
9. التقط `/view:json` أو `/last:json` عند تقديم تقارير الأخطاء أو مقارنة السلوك عبر الإصدارات.
## سطح حقائق المحلل
يتم تمرير حقائق المحلل الأخيرة عمدًا عبر `/view:json` و`/view:facts` و`/view:prompt` ووضع LLM العادي. الحقول عالية القيمة التي يجب فحصها أولاً:
- `stack_pointer` يسجّل فروقات المكدس لكل تعليمة، والأسماء المستعارة المرتبطة بالإطار، ومستوى الثقة.
- `call_arguments` يسجّل وسائط السجلات والمكدس المستعادة عند مواقع الاستدعاء، بما في ذلك تخزينات المكدس عبر الكتل القريبة عندما يكون الدليل قويًا بما يكفي.
- `pdb.prototype_parameters` يسجّل أسماء معاملات النموذج الأولي المهيكلة، وأنواعها، وترتيبها، ومواقع ABI، وثقة المصدر.
- `control_flow` يتضمن متغيرات عدّاد الحلقات، والقيم الأولية، والخطوات، والحدود، والاتجاه، وعنوان جدول التبديل، وأهداف الحالات، والهدف الافتراضي، وحدود النطاق، والإشارة (signedness)، وتعبير الفهرس عند استعادته.
- تتضمن `callee_summaries` وحقائق أهداف الاستدعاء مرشحي الاستدعاء المباشر وغير المباشر والاستدعاء الافتراضي/vtable بالإضافة إلى دلالات الذاكرة والتخصيص والتحرير والحالة المعروفة لـ Win32/NT/Rtl.
- يكشف `obfuscation` عن مرشحي موزّع التسطيح بنمط OLLVM، ومتغيرات الحالة، والحواف الدلالية المستعادة، والمسندات المعتمة، وأشكال استبدال السلميات.
- يكشف `semantic_control_flow` عن الحواف الحية/الميتة المستعادة المشتقة من حقائق التعتيم، وتبقى متاحة للفحص حتى عند استخدام `/deobf:off`.
- يكشف `deobfuscation_readiness` عن `enabled`، وإجراءات إعادة الكتابة الآمنة، والافتراضات المحظورة، ومسارات الحقائق ذات الأولوية، والعدادات، والثقة. وعند تعطيله، يسجّل قرار السياسة ويمنع إعادة كتابة تدفق التحكم بعد إزالة التعتيم.
- يضع اختيار حقائق المطالبة الإدخالات عالية الإشارة أولاً، ثم يحافظ على التوزيع عبر أخذ العينات الموزعة بحيث لا تفقد الدوال الكبيرة جميع الأدلة منخفضة التكرار.
## إعداد dbgeng الموصى به
أسرع مسار هو تضمين ملف الرأس ومكتبة الاستيراد داخل المشروع.
التخطيط المتوقع للتضمين:```text
third_party\dbgeng\inc\dbgeng.h
third_party\dbgeng\lib\dbgeng.lib
يمكنك نسخها يدويًا، أو استخدام البرنامج النصي المساعد.
powershell -ExecutionPolicy Bypass -File .\scripts\Prepare-DbgengVendor.ps1 ` -SourceRoot 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64'
### تحضير نسخة المورّد من مسارات الملفات الصريحة```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\Prepare-DbgengVendor.ps1 `
-HeaderPath 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sdk\inc\dbgeng.h' `
-LibraryPath 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\dbgeng.lib'
بمجرد وجود third_party\dbgeng، سيفضّله Build.ps1 تلقائيًا ولا تحتاج عادةً إلى DEBUGGERS_ROOT.
يمكن للمستودع استخدام أيٍّ من:
third_party\zydis المُضمَّنFetchContent الخاص بـ CMakeالسلوك الافتراضي هو auto، الذي يفضّل third_party\zydis عند وجوده ويعود إلى جلب Zydis أثناء إعداد CMake.
التخطيط المتوقع للتبعية:```text third_party\zydis\CMakeLists.txt third_party\zydis\include\Zydis\Zydis.h third_party\zydis\dependencies\zycore\CMakeLists.txt
قم بتحديث أو إنشاء نسخة المورّد:```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\Prepare-ZydisVendor.ps1
يمكنك أيضًا إنشاء vendor من شجرة مصدر محلية تم تنزيلها بالفعل:```powershell powershell -ExecutionPolicy Bypass -File .\scripts\Prepare-ZydisVendor.ps1 ` -SourcePath 'C:\path\to\zydis'
## البناء
المسار الموصى به هو Visual Studio Developer PowerShell أو Developer Command Prompt.
يضمّن ملف `decomp.dll` المُجمَّع الآن إصدار ملف ويندوز مأخوذًا من `version.txt`.
### البناء العادي```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\Build.ps1 -Reconfigure
cmake --build build --config Debug ctest --test-dir build -C Debug --output-on-failure cmake --build build --config Release ctest --test-dir build -C Release --output-on-failure
`decomp_snapshot_tests` يغطي تعاقدات المحلل/البروتوكول/المدقق لوسائط المكدس المستعادة، ومدخلات ABI الخاصة بـ SIMD/FP، وكبت نمط الصفر المتجهي، وتفضيل استقراء الحلقة، وبيانات switch الوصفية، وبيانات الاستدعاء الافتراضي الوصفية، وحقائق التعتيم بأسلوب OLLVM، وسياسة `/deobf:off`، وملخصات API المعروفة، واختيار حقائق الموجّه، وفحوصات إرساء المدقق.
### بناء dbgeng القديم```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\Build-Legacy.ps1 -Reconfigure
powershell -ExecutionPolicy Bypass -File .\scripts\Invoke-ReleaseBuild.ps1
يزيد هذا السكربت المكوّن الأخير في `version.txt` بمقدار `1`، ويفرض إعادة التهيئة، ثم يبني ملف DLL لإصدار Release. على سبيل المثال، `1.0.0.7` تصبح `1.0.0.8`.
### الخيارات الشائعة
- `-Configuration Release|Debug`
- `-Clean`
- `-Reconfigure`
- `-ConfigureOnly`
- `-Verbose`
- `-ZydisSource Auto|Vendor|Fetch`
- `-ZydisVendorDir 'C:\path\to\zydis'`
- `-DebuggersRoot 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64'`
- `-DbgengIncludeDir 'E:\works\windbg_llm_decomp_2\windbg_llm_decomp\third_party\dbgeng\inc'`
- `-DbgengLibrary 'E:\works\windbg_llm_decomp_2\windbg_llm_decomp\third_party\dbgeng\lib\dbgeng.lib'`
### مثال البائع أولاً```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\Build.ps1 `
-Configuration Release `
-ZydisSource Vendor `
-Reconfigure `
-Verbose
powershell -ExecutionPolicy Bypass -File .\scripts\Build.ps1 -Configuration Release
-DbgengIncludeDir 'E:\works\windbg_llm_decomp_2\windbg_llm_decomp\third_party\dbgeng\inc' -DbgengLibrary 'E:\works\windbg_llm_decomp_2\windbg_llm_decomp\third_party\dbgeng\lib\dbgeng.lib'
-Reconfigure
يحاول سكريبت البناء تلقائيًا تحديد موقع:
- `cmake.exe` من PATH، أو CMake المستقل، أو CMake المرفق مع Visual Studio
- `third_party\dbgeng` تحت جذر المشروع
- `DEBUGGERS_ROOT` من متغيرات البيئة أو المواقع الشائعة لمجموعات Windows Kits
يعمل اختيار مصدر Zydis على النحو التالي:
- `Auto`: يفضّل `third_party\zydis`، وإلا يقوم بجلب `Zydis` أثناء التكوين
- `Vendor`: يتطلب شجرة `third_party\zydis` قابلة للاستخدام أو المسار الممرر عبر `-ZydisVendorDir`
- `Fetch`: يتجاهل شجرة المورّد ويسمح دائمًا لـ CMake بتنزيل `Zydis`
قد يشير `DEBUGGERS_ROOT` إلى جذر مصحّح يستخدم أحد هذه التخطيطات:
- `sdk\inc\dbgeng.h` و `sdk\lib\dbgeng.lib`
- `sdk\inc\dbgeng.h` و `sdk\lib\amd64\dbgeng.lib`
- `sdk\inc\dbgeng.h` و `sdk\lib\x64\dbgeng.lib`
- `sdk\inc\dbgeng.h` و `dbgeng.lib`
- `inc\dbgeng.h` و `lib\dbgeng.lib`
- `inc\dbgeng.h` و `lib\amd64\dbgeng.lib`
- `inc\dbgeng.h` و `lib\x64\dbgeng.lib`
- `dbgeng.h` و `dbgeng.lib`
إذا كان تثبيتك لا يطابق تلك التخطيطات، مرّر مسارات CMake مباشرة:```powershell
cmake -S . -B build-manual -G "Visual Studio 17 2022" -A x64 `
-DDBGENG_INCLUDE_DIR='E:\works\windbg_llm_decomp_2\windbg_llm_decomp\third_party\dbgeng\inc' `
-DDBGENG_LIBRARY='E:\works\windbg_llm_decomp_2\windbg_llm_decomp\third_party\dbgeng\lib\dbgeng.lib'
cmake --build build-manual --config Release
إذا كانت نسخة dbgeng.h لديك قديمة جدًا وفشل البناء بسبب GetSymbolEntryOffsetRegions أو GetSymbolEntryString، فاستخدم Build-Legacy.ps1 أو مرر خيار CMake يدويًا.
عند ضبط DECOMP_USE_SYMBOL_ENTRY_APIS=OFF، تتراجع الإضافة إلى:
GetFunctionEntryByOffset لاستعادة النطاق المعتمدة على unwind في x64GetNameByOffset مع التفكيك الاستدلالي إذا كانت بيانات تعريف unwind مفقودةتستهلك الإضافة تلقائيًا الرموز ومعلومات الأنواع التي قام WinDbg بتحميلها بالفعل للوحدات المستهدفة.
هناك مستويان عمليان لإثراء PDB:
كيف يؤثر ذلك على توليد الكود الزائف:
arg1 إلى أسماء PDB مثل ctxctx->Statestate == StateRunningقيود مهمة:
السلوك الحالي تلقائي. لا يوجد مفتاح تكوين منفصل لاستخدام PDB؛ تعتمد الجودة على ما قام WinDbg بتحميله بالفعل وما إذا كان يمكن مطابقة النطاق الحالي مع الدالة المستهدفة.
ضع decomp.llm.json بجوار decomp.dll.
هذا الملف ليس مخصصًا لإعدادات شبكة LLM فقط.
provider و endpoint و model وميزانيات الرموز وإعدادات التقسيم على مسار LLM.display_language على اللغة الطبيعية المستخدمة في الملخصات وحالات عدم اليقين.syntax_highlighting على عرض الكود الزائف في WinDbg عندما يكون الإخراج المدعم بـ DML متاحًا.display_language و syntax_highlighting لإخراج /view:analyzer ومزود المحاكاة (mock provider).مثال:```json { "provider": "openai-compatible", "endpoint": "https://api.openai.com/v1/chat/completions", "model": "gpt-5.4-2026-03-05", "api_key_env": "OPENAI_API_KEY", "timeout_ms": 120000, "max_completion_tokens": 12000, "force_chunked": false, "chunk_trigger_instructions": 900, "chunk_trigger_blocks": 36, "chunk_block_limit": 24, "chunk_count_limit": 16, "chunk_completion_tokens": 6000, "merge_completion_tokens": 12000, "display_language": { "mode": "auto", "tag": "en-US", "name": "English" }, "syntax_highlighting": { "keyword_color": "warnfg", "type_color": "emphfg", "function_name_color": "srcid", "identifier_color": "wfg", "number_color": "changed", "string_color": "srcstr", "char_color": "srcchar", "comment_color": "subfg", "preprocessor_color": "verbfg", "operator_color": "srcannot", "punctuation_color": "srcpair" } }
مثال على اشتراك ChatGPT:```json
{
"provider": "chatgpt",
"model": "gpt-5.5",
"chatgpt_auth_file": "%USERPROFILE%\\.codex\\auth.json",
"timeout_ms": 120000,
"max_completion_tokens": 12000,
"force_chunked": false,
"chunk_trigger_instructions": 900,
"chunk_trigger_blocks": 36,
"chunk_block_limit": 24,
"chunk_count_limit": 16,
"chunk_completion_tokens": 6000,
"merge_completion_tokens": 12000,
"reasoning_effort": "medium"
}
بالنسبة إلى provider: "chatgpt"، تكون قيمة endpoint اختيارية وتُعتمد افتراضيًا على https://chatgpt.com/backend-api/codex/responses. كما يُقبل عنوان أساسي مثل https://chatgpt.com/backend-api/codex ويتم تطبيعه إلى /responses. يقرأ الامتداد tokens.access_token وtokens.refresh_token من ملف المصادقة المُهيأ، ويجدّد رموز الوصول JWT المنتهية عبر OAuth الخاص بـ OpenAI، ثم يكتب مجموعة الرموز المحدّثة مرة أخرى إلى ذلك الملف. ملف المصادقة الافتراضي هو %USERPROFILE%\.codex\auth.json، لذا يمكن إعادة استخدام تسجيل دخول Codex CLI إلى ChatGPT مباشرةً. لا يفتح الامتداد متصفحًا ولا يبدأ تدفق تسجيل دخول OAuth من داخل WinDbg؛ إذا كان ملف المصادقة مفقودًا أو غير صالح أو لم يعد قابلاً للتجديد، فشغّل codex login خارج WinDbg وأعد محاولة !decomp. للاختبارات لمرة واحدة، استخدم access_token أو access_token_env بدلاً من ملف مصادقة. و و و محجوزة لمزودي مفاتيح API المتوافقين مع OpenAI ويتم تجاهلها من قِبل مزود ChatGPT.
المفاتيح المدعومة:
providerendpointmodelapi_keyapi_key_envaccess_tokenaccess_token_envchatgpt_auth_filereasoning_efforttimeout_msmax_completion_tokensforce_chunkedchunk_trigger_instructionschunk_trigger_blocksمفاتيح display_language المدعومة:
modetagnameيقبل display_language.mode القيم التالية:
autofixedمفاتيح syntax_highlighting المدعومة:
keyword_colortype_colorfunction_name_coloridentifier_colornumber_colorstring_colorchar_colorcomment_colorpreprocessor_coloroperator_colorpunctuation_colorكيفية عمل قيم ألوان syntax_highlighting:
<col fg="...">.verbfg وwarnfg وemphfg وsrcid والأسماء المشابهة لا تُرتبط بلون واحد عام عبر جميع الأجهزة.#FF8800. اللون الفعلي يأتي من WinDbg، وليس من decomp.llm.json.النتيجة العملية:
syntax_highlighting بدلاً من افتراض أن الامتداد يتجاهل الإعداد.عندما يكون التمييز مرئيًا:
/view:json لا تُعرض عبر DML. بدلاً من ذلك، تحمل pseudo_c_tokens لتتمكن الأدوات الخارجية من تطبيق تمييز الصيغة الخاص بها.فتحات اللون الأمامي الشائعة في DML:
wfg
نص المقدمة الافتراضي للنافذة.normfg
نص نافذة الأوامر العادي.emphfg
نص مؤكَّد. توثّق Microsoft هذا كلون أزرق فاتح افتراضيًا، لكن المظهر الدقيق لا يزال يعتمد على السمة.warnfg
نص تحذير.errfg
نص خطأ.verbfg
نص مطوّل.changed
بيانات متغيّرة. توثّق Microsoft هذا كلون أحمر افتراضيًا.فتحات اللون الأمامي الشائعة في DML الموجّهة للمصدر:
srcnum
الثوابت الرقمية.srcchar
ثوابت الأحرف.srcstr
ثوابت السلاسل النصية.srcid
المعرّفات.srckw
الكلمات المفتاحية.srcpair
الأقواس أو أزواج الرموز المتطابقة.srccmnt
التعليقات.srcdrct
التوجيهات.srcspid
معرّفات خاصة.srcannot
التعليقات التوضيحية للمصدر أو العناصر الشبيهة بالتعليقات التوضيحية.أمثلة:
verbfg تعني "فتحة اللون الأمامي للنص المطوّل"، وليس "لونًا أزرق محددًا".warnfg تعني "فتحة اللون الأمامي للتحذير"، وليس "أصفر أو برتقالي دائمًا".function_name_color: "srcid" تعني "عرض أسماء الدوال باستخدام فتحة المعرّفات في WinDbg".إذا كنت تضبط الألوان على سمة داكنة:
function_name_color: "emphfg" أو function_name_color: "verbfg" إذا كانت أسماء الدوال تبدو باهتة مع srcid.identifier_color: "normfg" أو identifier_color: "wfg" للرموز العامة التي يجب أن تبقى مقروءة دون أن تطغى على الكلمات المفتاحية.comment_color: "subfg" إذا كنت تريد أن تتراجع التعليقات دون أن تختفي تمامًا.المرجع الرسمي:
يحتوي ملف decomp.llm.json.example المُضمَّن في المستودع على إعدادات صالحة على المستوى الأعلى يقرؤها الامتداد فعليًا فقط.
أمثلة مرجعية فقط:
اتبع لغة واجهة المستخدم للكمبيوتر:```json { "display_language": { "mode": "auto" } }
فرض اللغة الإنجليزية:```json
{
"display_language": {
"mode": "fixed",
"tag": "en-US",
"name": "English"
}
}
فرض اللغة الكورية:```json { "display_language": { "mode": "fixed", "tag": "ko-KR", "name": "Korean" } }
إعداد مسبق لتلوين الصيغة الداكن:```json
{
"syntax_highlighting": {
"keyword_color": "warnfg",
"type_color": "emphfg",
"function_name_color": "srcid",
"identifier_color": "wfg",
"number_color": "changed",
"string_color": "verbfg",
"char_color": "srcchar",
"comment_color": "subfg",
"preprocessor_color": "normfg",
"operator_color": "srcannot",
"punctuation_color": "srcpair"
}
}
الإعداد المسبق لتلوين الصيغة الفاتح:```json { "syntax_highlighting": { "keyword_color": "emphfg", "type_color": "warnfg", "function_name_color": "srcid", "identifier_color": "normfg", "number_color": "changed", "string_color": "verbfg", "char_color": "srcchar", "comment_color": "subfg", "preprocessor_color": "srcannot", "operator_color": "wfg", "punctuation_color": "subfg" } }
مثال لتفاصيل استجابة `/view:json`:
- تتضمن استجابة JSON الحقلين `pseudo_c` و`pseudo_c_tokens`.
- `pseudo_c_tokens` هو دفق رموز حتمي مناسب لتمييز الصيغة البرمجية خارجيًا.
- يتضمن الطلب المُسلسَل الحقلين `preferred_natural_language_tag` و`preferred_natural_language_name`، اللذين يعكسان لغة العرض المُحدَّدة بعد تطبيق `display_language.mode`.
- تتضمن حقائق المحلّل الآن حقول الجودة من المستوى P0: `ir_values` و`block_value_states` و`control_flow` و`abi`.
- يكشف `ir_values` عن معرّفات قيم شبيهة بـ SSA، ومواقع التعريف، والأهداف، والتعبيرات الأساسية، وروابط الاستخدام، وأعلام الثبات/النسخ، وتلميحات التعريفات الميتة.
- يكشف `block_value_states` عن التعريفات الواصلة live-in/live-out لكل كتلة أساسية، والقيم الأساسية، وفئة التخزين، وحالة التقارب، ومستوى الثقة.
- يكشف `stack_pointer` عن فروق المكدس لكل تعليمة، والأسماء المستعارة المرتبطة بالإطار، والقيم الخام للقاعدة/الإزاحات، ومستوى الثقة.
- يكشف `control_flow` عن مرشّحات المناطق المهيكلة مثل `natural_loop` و`if_else_candidate` و`switch_candidate` مع أدلة الكتل، وبيانات استقراء الحلقات، وبيانات جدول switch/الافتراضي/النطاق، والإشارة (signedness)، وتعبيرات الفهرس، ومستوى الثقة.
- يكشف `abi` عن افتراضات مساحة الظل (shadow space) في Microsoft x64، وأدلة فتحات الإيداع (home slots)، والتعرّف على الإطار/التمهيد/الختام (frame/prolog/epilog)، وأدلة استدعاءات no-return، ومرشّحات الاستدعاءات الذيلية، ومرشّحات الـ thunk، ومرشّحات مغلّفات الاستيراد، ووسائط الاستدعاء المستعادة من السجلات وعمليات تخزين المكدس.
- تتضمن حقائق المحلّل الآن أيضًا حقولًا دلالية من المستوى P1: `type_hints` و`idioms` و`callee_summaries`.
- يكشف `type_hints` عن أدلة المؤشرات، والمتغيرات المحلية، وإزاحات الحقول، والأنماط الشبيهة بالمصفوفات، والشبيهة بالتعدادات، والشبيهة بأعلام البت، ومرشّحات vtable، مع المصدر ومستوى الثقة. وعند توفّر بيانات PDB، تُرفع أيضًا الوسائط/المتغيرات المحلية ذات النطاق، وتلميحات الحقول، وثوابت التعداد إلى دفق تلميحات الأنواع الموحّد هذا.
- يكشف `idioms` عن بدائل عالية المستوى لاستدعاءات المساعدين وأنماط المترجم المعروفة، مثل نسخ/تعبئة الذاكرة، ونسخ السلاسل النصية، وفحوصات كعكة الأمان (security cookies)، ومجسّات المكدس (stack probes)، ومساعدي التخصيص/التحرير، ومهيّئات الأنواع التجميعية، وعمليات تحميل العموميات/الاستيراد النسبية إلى RIP.
- يكشف `callee_summaries` عن تلميحات نوع الإرجاع للاستدعاءات المباشرة وغير المباشرة، ونموذج الوسائط، والآثار الجانبية، وتأثيرات الذاكرة، والملكية، والمصدر، ومستوى الثقة؛ وتستبدل أهداف الاستدعاء المُثراة بالرموز/الأنواع الملخصات الاستدلالية الأولية عندما تتمكن WinDbg من حلها، وتتضمن مرشّحات الاستدعاءات الافتراضية تعبيرات الأهداف بالإضافة إلى إزاحات vtable عند استعادتها.
- تصف ملخصات واجهات برمجة تطبيقات Win32/NT/Rtl المعروفة سلوك نسخ/تعبئة/تصفير الذاكرة، والتخصيص، والتحرير، والحالة، والأخطاء عند توفّر أسماء الرموز.
- تتضمن حقائق التلقين `analyzer_skeleton` و`graph_summary` ليصقل النموذج مسودة مدعومة بالأدلة بدلًا من البدء من صفحة فارغة.
- يوفر `graph_summary` كتلة الدخول، ومناطق تدفق التحكم، والشروط المُطبَّعة (normalized)، وكتلًا تمثيلية عالية الإشارة مع سياسة اقتطاع صريحة. ويقوم اختيار حقائق التلقين الآن بترتيب الإدخالات عالية الإشارة ويستخدم أخذ العينات الموزّع للحفاظ على تمثيلية مجموعات الحقائق الكبيرة.
- يكشف `evidence_graph` عن عُقد الحقائق عالية الإشارة وحواف تتبع المصدر (provenance edges) بحيث يمكن تتبّع قيم IR، وحالات قيم الكتل، والوصول إلى الذاكرة، وأهداف الاستدعاءات، وتلميحات الأنواع، وتلميحات PDB، والسلوك المرصود إلى أدلة التعليمة والكتلة.
- تكشف `obfuscation` و`semantic_control_flow` و`deobfuscation_readiness` عن حقائق الاستعادة بأسلوب OLLVM وعن ما إذا كان توجيه إعادة كتابة إزالة التعتيم مفعّلًا للأمر الحالي.
- تتضمن استجابة المدقّق إدخالات `warnings` القديمة بالإضافة إلى إدخالات `issues` المهيكلة. تحمل كل مشكلة `severity` و`code` و`message` و`evidence` اختياريًا، بحيث يمكن للأدوات فصل أخطاء مثل `branch.true_target_not_successor` عن التحذيرات منخفضة الخطورة.
- تقارن فحوصات المدقّق الآن أهداف الفروع الصحيحة/الخاطئة المُطبَّعة مع خلفاء CFG، وتقارن كثافة فروع الكود الزائف مع الفروع الشرطية المستعادة، وتتحقق تبادليًا من ملخصات المستدعَين المباشرة مع تأثيرات استدعاءات الكود الزائف، وتتحقق من إرساء عُقد/حواف evidence_graph، وتفحص مراجع حالات قيم الكتل عائدًا إلى الكتل وقيم IR المستعادة.
- قد يتضمن المخرَج العادي ومخرَج الشرح قسمًا موجزًا باسم `suggested fixes`. وهي أوامر `/fix:*` متحفّظة مستمدة من مشكلات المدقّق، أو فرص إعادة التسمية المدعومة بـ PDB، أو نقاط الذاكرة الساخنة المتكررة المرصودة. ويعرض المخرَج المدرِك لـ DML الاقتراحات القابلة للتطبيق فورًا كروابط إعادة تشغيل قابلة للنقر للهدف نفسه؛ وتبقى اقتراحات نوع الحقل النائبة (placeholder) نصًا عاديًا حتى يتم استبدال `TYPE`.
- في وضع LLM، يُعيد الامتداد تغذية مشكلات المدقّق تلقائيًا في تلقين إعادة محاولة واحد. يُحتفظ بإعادة المحاولة عندما تحافظ على جودة المدقّق أو تحسّنها؛ وإلا يُحتفظ بالاستجابة الأصلية مع إضافة ملاحظة عدم اليقين.
- يكشف `session_policy` و`observed_behavior` عن سياق خاص بـ WinDbg مثل سياسة live/dump/kernel/الشبيهة بـ TTD، وعيّنات وسائط سجلات الإطار الحالي، ونقاط الذاكرة الساخنة، واستعلامات التتبّع المقترحة.
- يتضمن الطلب المُسلسَل الآن أيضًا كائن `pdb` عند توفّر بيانات الرموز/الأنواع.
- يُبلغ `pdb.availability` عن مستوى الإثراء مثل `none` أو `symbols` أو `typed` أو `scoped`.
- تُعد `pdb.params` و`pdb.locals` و`pdb.field_hints` و`pdb.enum_hints` و`pdb.source_locations` تلميحات دلالية قابلة للقراءة آليًا موجهة للأدوات الخارجية أو التحليل دون اتصال.
تجاوزات بيئية اختيارية:
- `DECOMP_LLM_PROVIDER`
- `DECOMP_LLM_ENDPOINT`
- `DECOMP_LLM_MODEL`
- `DECOMP_LLM_API_KEY`
- `OPENAI_API_KEY`
- `DECOMP_LLM_CHATGPT_ACCESS_TOKEN`
- `DECOMP_LLM_CODEX_ACCESS_TOKEN`
- `KERNFORGE_CODEX_ACCESS_TOKEN`
- `DECOMP_LLM_CHATGPT_AUTH_FILE`
- `DECOMP_LLM_CODEX_AUTH_FILE`
- `KERNFORGE_CODEX_AUTH_FILE`
- `DECOMP_LLM_REASONING_EFFORT`
- `DECOMP_LLM_TIMEOUT_MS`
- `DECOMP_LLM_MAX_COMPLETION_TOKENS`
- `DECOMP_LLM_FORCE_CHUNKED`
- `DECOMP_LLM_CHUNK_TRIGGER_INSTRUCTIONS`
- `DECOMP_LLM_CHUNK_TRIGGER_BLOCKS`
- `DECOMP_LLM_CHUNK_BLOCK_LIMIT`
- `DECOMP_LLM_CHUNK_COUNT_LIMIT`
- `DECOMP_LLM_CHUNK_COMPLETION_TOKENS`
- `DECOMP_LLM_MERGE_COMPLETION_TOKENS`
- `DECOMP_NORETURN_OVERRIDES`
أجزاء أسماء دوال مفصولة بفواصل أو فواصل منقوطة، تُعامَل كأهداف no-return أثناء التفكيك الاحتياطي، واستعادة خلفاء CFG، وحقائق ABI، وفحوصات المدقّق. مثال: `DECOMP_NORETURN_OVERRIDES=MyAbort;PanicAndExit`.
ملاحظة الجودة أولًا:
- يدعم الامتداد الآن التحليل متعدد المراحل المُقسَّم للدوال الكبيرة.
- يرسل المحلّل حقائق قيم IR، وحالات قيم الكتل، ومناطق تدفق التحكم، وحقائق evidence_graph، وأدلة x64 ABI/no-return إلى نموذج LLM قبل مرحلة الصقل، بحيث تتشارك أوضاع `/view:analyzer` و`/view:json` ووضع LLM العادي نفس قاعدة أدلة P0.
- يتحقق المدقّق تبادليًا من الحلقات، وswitch، وno-return، وأهداف الفروع، وسلوك الإرجاع، وتأثيرات استدعاءات المستدعَين، وإرساء evidence_graph، واتساق حالات قيم الكتل، وتغطية الأدلة، وادعاءات المعرّفات المشبوهة، مقابل أدلة المحلّل. ويخفض مستوى الثقة عندما يتجاوز النثر الواثق الحقائق المستعادة، ويسمّي كل مشكلة بزوج مستقر من severity/code.
- عندما تعثر تعليقات المدقّق على أخطاء في المخطط، أو تعارضات في الحقائق، أو ثقة معدَّلة منخفضة جدًا، ينفّذ مسار LLM محاولة إعادة واحدة تلقائيًا مع إلحاق مشكلات المدقّق بالتلقين.
- نقطة بداية جيدة للنماذج السحابية هي `max_completion_tokens=12000` و`chunk_completion_tokens=6000` و`merge_completion_tokens=12000`، مع `force_chunked=false` ومحفّزات تقسيم حول `900 instructions` أو `36 blocks`.
- أبقِ `force_chunked=true` لاختبارات إجهاد خط أنابيب التقسيم فقط. عادةً ما تحتاج إزالة التحويل البرمجي الموجهة بالجودة للدوال المسطَّحة أو كثيفة الموزّعات (dispatchers) إلى تلقين واحد حتى تصبح الدالة كبيرة بما يكفي لتجاوز محفّزات التقسيم المهيأة.
- أبقِ `timeout_ms` مرتفعًا للنماذج السحابية. `120000` نقطة بداية أكثر أمانًا من `15000`.
- إذا كانت الجودة ما تزال ضعيفة على الدوال الضخمة، ارفع `chunk_count_limit` قبل تقليص `/limit:N`.
- إذا لم يتم تكوين أي نقطة نهاية، يتراجع الامتداد إلى مزوّد المحاكاة الحتمي.
- حتى عندما يستخدم الامتداد `/view:analyzer` أو مزوّد المحاكاة، ما يزال `display_language` و`syntax_highlighting` يؤثران على ما يراه المستخدم.
## اختبار دخان WinDbg
1. قم بالبناء باستخدام `Build.ps1` أو `Build-Legacy.ps1`.
2. ضَع `decomp.llm.json` بجوار ملف `decomp.dll` المُبنى.
3. شغّل WinDbg. متغيرات البيئة هي تجاوزات اختيارية فقط.
4. حمّل الامتداد.
5. تحقّق من وضع المحلّل فقط قبل تفعيل مسار LLM.```text
.load C:\path\to\decomp.dll
!decomp /view:analyzer ntdll!RtlAllocateHeap
!decomp /view:facts kernel32!Sleep
ثم تحقق من وضع LLM:```text !decomp ntdll!RtlAllocateHeap !decomp /view:json ntdll!RtlAllocateHeap !decomp 0x7ffb`12345678
الفحوصات المتوقعة:
- يجب أن تُحل `target` و`entry` و`module` بشكل متسق
- يجب أن تكون `regions` غير صفرية للدوال العادية
- يجب أن يستمر `/view:analyzer` في طباعة ثقة المحلل وكعب الكود الزائف
- يجب أن يملأ وضع LLM الحقول `summary` و`pseudo_c` و`pseudo_c_tokens` و`verified`
- يجب أن يتضمن مخرج `/view:json` كلاً من `preferred_natural_language_tag` و`preferred_natural_language_name` في الطلب المتسلسل
- عند تحميل ملفات PDB خاصة أو غنية، يجب أن يتضمن `/view:json` أيضاً `pdb.prototype` و`pdb.params` وربما `pdb.locals`
- بالنسبة إلى البنى والتعدادات المعرّفة، قد يتضمن `/view:json` `pdb.field_hints` و`pdb.enum_hints`
## مثال اشتراك ChatGPT```powershell
$env:DECOMP_LLM_PROVIDER = "chatgpt"
$env:DECOMP_LLM_MODEL = "gpt-5.5"
$env:DECOMP_LLM_CHATGPT_AUTH_FILE = "$env:USERPROFILE\.codex\auth.json"
$env:DECOMP_LLM_TIMEOUT_MS = "120000"
إذا كان ملف المصادقة يحتوي على رمز تحديث (refresh token)، فتقوم الإضافة بتحديث رمز الوصول منتهي الصلاحية قبل إرسال الطلب. يمكن استخدام DECOMP_LLM_CHATGPT_ACCESS_TOKEN كرمز حامل مؤقت، لكن مسار ملف المصادقة أفضل لجلسات WinDbg العادية لأنه يبقى صالحًا بعد انتهاء صلاحية الرمز. لا تفتح الإضافة متصفحًا أبدًا أثناء !decomp؛ شغّل codex login خارج WinDbg عند الحاجة إلى تسجيل دخول ChatGPT تفاعلي.
$env:DECOMP_LLM_ENDPOINT = "http://127.0.0.1:11434/v1/chat/completions" $env:DECOMP_LLM_MODEL = "qwen2.5-coder:14b" $env:DECOMP_LLM_API_KEY = "ollama"
### LM Studio```powershell
$env:DECOMP_LLM_ENDPOINT = "http://127.0.0.1:1234/v1/chat/completions"
$env:DECOMP_LLM_MODEL = "local-model"
$env:DECOMP_LLM_API_KEY = "lm-studio"
$env:DECOMP_LLM_ENDPOINT = "http://127.0.0.1:8000/v1/chat/completions" $env:DECOMP_LLM_MODEL = "Qwen/Qwen2.5-Coder-14B-Instruct" $env:DECOMP_LLM_API_KEY = "local"
/last:N:prompt/last:* هي أوامر إعادة تشغيل طرفية. إذا وُجد هدف في نفس الأمر، تتم إعادة تشغيل الأثر المخزن ولا يبدأ أي تحليل محلي أو طلب LLM لذلك الهدف.artifact بجوار decomp.dll المُحمَّل. لا يحتاج المشغّل إلى أمر حفظ منفصل.request و response و data_model و debug_prompt وكائن kernel_build بقيم إصدار Win32/KD وسلسلة بناء وNtBuildLab اختياري وبصمة بناء.!decomp <target> تلقائيًا من المسار artifact\<kernel_build>\... بعد حلّ الهدف واستعادة RVA للدالة. إذا كان kernel_build المحفوظ يطابق بناء نظام التشغيل الحالي، يعيد الامتداد تشغيل الأثر دون قراءة بايتات الدالة أو تشغيل تمريرات المحلل المحلي أو استدعاء LLM./last:*، لذا فإن النقر على explain أو json أو facts أو prompt أو data-model لا يبدأ تشغيل تفكيك جديد./last-json و /last-explain و /last-facts و /last-data-model و /last-dx و /last-prompt مدعومة.TTDReplay.dlldx @$cursession.TTD.Calls(...)api_keyapi_key_envDECOMP_LLM_API_KEYOPENAI_API_KEYchunk_block_limitchunk_count_limitchunk_completion_tokensmerge_completion_tokensdisplay_languagesyntax_highlighting