التقاط كود Claude باستخدام `mitmproxy` — دليل خطوة بخطوة (مع إضافات جاهزة للتشغيل ونصوص تحليل)

٢٢ سبتمبر ٢٠٢٥

Capture Claude Code with `mitmproxy` — step-by-step guide (with ready-to-run addons & analysis scripts)

هل ترغب في رؤية ما يرسله Claude Code فعليًا إلى Anthropic؟ هذا المنشور يرشدك عبر سير عمل عملي وقابل للتكرار لاعتراض وحفظ وتحليل حركة مرور Claude Code باستخدام mitmproxy. ستحصل على:

  • إعداد خطوة بخطوة لتحويل Claude Code عبر mitmproxy.
  • إضافة جاهزة للتشغيل تستخرج التحذيرات النظامية المخفية (قواعد "المهم: ...").
  • إضافة متكاملة تلتقط الطلبات + الردود (التحذيرات النظامية، تعريفات الأدوات، رسائل المستخدم، والردود المتدفقة/الجزئية) في سجلات موقعة بطابع زمني.
  • أدوات تحليل صغيرة لاستخراج التحذيرات النظامية وربط الطلبات بالردود في تنسيق JSON لإعادة التشغيل أو التحليل.
  • تحذيرات أمنية وخصوصية وقانونية.

ملخص سريع: شغّل mitmproxy في الوضع العكسي، وضبط ANTHROPIC_BASE_URL=http://localhost:8000، ووثّق شهادة mitm CA أثناء الاختبار، ثم شغّل Claude Code — وستحفظ لك الإضافات أدناه الحمولات.


السلامة & الأخلاقيات (اقرأ أولاً)

  • لا تعترض حركة المرور إلا إذا كنت مالكها أو مصرحًا لك صراحةً بالتحقق منها. اعتراض حركة مرور المستخدمين الآخرين غير قانوني/غير أخلاقي.
  • ستحتوي السجلات الملتقطة على API مفاتيح ورموز وأسرار. عاملها كبيانات حساسة. قم بحذفها قبل المشاركة.
  • بعد الاختبار، أزل شهادة mitmproxy CA من مخزن الثقة الخاص بنظامك. لا تثق بها بشكل دائم.
  • إذا كان العميل يستخدم TLS pinning، فسيتم حظرك — لا تحاول تجاوز التثبيت لأنظمة لا تملكها.

المتطلبات المسبقة

  • macOS أو Linux (التعليمات مقدمة لـ macOS؛ Linux مشابه).
  • Python 3.8+ (لإضافة mitmproxy).
  • Homebrew (اختياري) أو pip لتثبيت mitmproxy.
  • عميل claude/Claude Code الذي يمكن توجيهه إلى ANTHROPIC_BASE_URL مخصص (أو أي عميل يطلب API.anthropic.com).

1- تثبيت mitmproxy

macOS (Homebrew):

brew install mitmproxy

أو باستخدام pip (يُوصى بـ virtualenv):

python3 -m venv venv
source venv/bin/activate
pip install mitmproxy

الأدوات التي تمتلكها الآن:

  • mitmproxy — واجهة مستخدم تفاعلية في طرفية
  • mitmweb — واجهة ويب (مُفتش الويب الافتراضي على :8081)
  • mitmdump — وضع رأسية/سكريبت (ممتاز لتشغيل الإضافات)

2— تشغيل mitmproxy في الوضع العكسي

يقوم Claude Code عادةً بالاتصال بـ https://API.anthropic.com. شغّل mitmproxy كـ بروكسي عكسي يُعيد التوجيه إلى Anthropic API الحقيقي:

mitmweb --mode reverse:https://API.anthropic.com --listen-port 8000
  • يستمع على http://localhost:8000 ويعيد التوجيه إلى https://API.anthropic.com.
  • يمكنك الوصول إلى الواجهة عبر http://127.0.0.1:8081 لفحص التدفقات مباشرة.

3— ثق بشهادة mitmproxy CA (لـ HTTPS)

يُنشئ mitmproxy شهادة CA محلية لتوقيع شهادات TLS للخوادم المُعتَرَضة. لتجنب أخطاء TLS، يجب أن تثق بها مؤقتًا:

  1. شغّل mitmproxy مرة واحدة — سيُنشئ الشهادات في ~/.mitmproxy/mitmproxy-ca-cert.pem.
  2. على macOS: افتح Keychain AccessFile → Import Items → استيراد ~/.mitmproxy/mitmproxy-ca-cert.pem.
    • انقر مرتين على الشهادة → Trust → عيّن Always Trust لـ SSL.
  3. لـ Firefox أو iOS/Android، استورد شهادة CA إلى مخازن الشهادات الخاصة بها (Firefox تستخدم مخزن شهادات خاص بها).

مهم: عند الانتهاء من الاختبار، أزل شهادة mitmproxy CA من مخازن الثقة.


4— أشرطة كود Claude على mitmproxy

قم بتعيين عنوان URL الأساسي لـ Anthropic إلى عنوان mitmproxy الخاص بك قبل تشغيل Claude Code:

export ANTHROPIC_BASE_URL="http://localhost:8000"
claude

الآن Claude Code → mitmproxy → Anthropic API.


5— ما ستلتقطه

الأشياء النموذجية التي ستلتقطها في الطلبات:

  • حقل system: رسالة النظام الخفية / قواعد السياسة (نص "المهم: ...").
  • tools: مخطط الأداة (بحث، git، تحرير، إلخ).
  • messages: رسائل المستخدم / المساعد.

قد تصل الاستجابات بشكل متدفق ومجزأ (قطع JSON جزئية). يعرض mitmproxy كلاً من أجسام الطلبات والاستجابات، لذا يمكنك حفظها.


6— إضافة جاهزة للتشغيل: استخراج رسائل النظام فقط

أنشئ dump_claude_prompts.py بهذا المحتوى. إنها تستخرج حقول system وتضيفها إلى ملف نصي.

# dump_claude_prompts.py
from mitmproxy import http
import json

OUTPUT_FILE = "claude_system_prompts.txt"

def request(flow: http.HTTPFlow):
    if "anthropic.com" not in flow.request.pretty_host:
        return
    try:
        body = flow.request.get_text()
        data = json.loads(body)
        if "system" in data:
            system_prompt = data["system"]
            with open(OUTPUT_FILE, "a", encoding="utf-8") as f:
                f.write("\n=== New System Prompt Captured ===\n")
                f.write(system_prompt)
                f.write("\n----------------------------------\n")
            print(f"[+] Captured system prompt ({len(system_prompt)} chars)")
    except Exception as e:
        print(f"[!] Error parsing request: {e}")

تشغيله:

mitmdump -s dump_claude_prompts.py --mode reverse:https://API.anthropic.com --listen-port 8000

الإخراج: claude_system_prompts.txt يحتوي على كل كتلة system تم التقاطها.


7— إضافة موسعة: التقاط مطالبات النظام + تعريفات الأدوات

إذا كنت ترغب في التقاط كل مطالبات النظام وتعريفات tools في ملف نصي منظم، استخدم:

# dump_claude_prompts_and_tools.py
from mitmproxy import http
import json

OUTPUT_FILE = "claude_prompts_and_tools.txt"

def request(flow: http.HTTPFlow):
    if "anthropic.com" not in flow.request.pretty_host:
        return
    try:
        body = flow.request.get_text()
        data = json.loads(body)
        with open(OUTPUT_FILE, "a", encoding="utf-8") as f:
            f.write("\n==============================\n")
            f.write(" NEW CLAUDE REQUEST CAPTURED\n")
            f.write("==============================\n\n")
            if "system" in data:
                f.write("### SYSTEM PROMPT ###\n")
                f.write(data["system"].strip())
                f.write("\n\n")
            if "tools" in data:
                f.write("### TOOL DEFINITIONS ###\n")
                for tool in data["tools"]:
                    name = tool.get("name", "<no name>")
                    desc = tool.get("description", "<no description>")
                    params = json.dumps(tool.get("parameters", {}), indent=2)
                    f.write(f"- Tool: {name}\n")
                    f.write(f"  Description: {desc}\n")
                    f.write(f"  Parameters:\n{params}\n\n")
            f.write("----------------------------------\n")
        print("[+] Captured Claude system + tools")
    except Exception as e:
        print(f"[!] Error parsing request: {e}")

تشغيل:

mitmdump -s dump_claude_prompts_and_tools.py --mode reverse:https://API.anthropic.com --listen-port 8000

الإخراج: claude_prompts_and_tools.txt


هذه هي الإضافة الكاملة التي تنشئ ملف .log مُرَّقَم زمنيًا لكل زوج من الطلب/الرد. احفظه باسم dump_claude_full.py.

التشغيل:
mitmdump -s dump_claude_full.py --mode reverse:https://API.anthropic.com --listen-port 8000

الإخراج: ملف واحد .log لكل طلب في claude_captures/. يحتوي كل ملف على:

  • SYSTEM PROMPT
  • TOOLS
  • MESSAGES
  • RAW JSON RESPONSE أو RAW TEXT RESPONSE (بما في ذلك شظايا البث)

9— المُحلل: استخراج & إزالة التكرار لتعليمات النظام

استخدم هذا السكريبت extract_system_prompts.py لفحص سجلات claude_captures/، واستخراج أقسام تعليمات النظام، وإزالة التكرار باستخدام SHA-256، ثم كتابة:

  • all_system_prompts.txt — تعليمات قابلة للقراءة البشرية (واحدة لكل تعليمة فريدة)
  • system_prompts_index.csv — فهرس يحتوي على filename، prompt_excerpt، captured_at، و hash.

extract_system_prompts.py (احفظ وشغّل):

التشغيل: قدم فقط الترجمة العربية:
python3 extract_system_prompts.py --dir claude_captures --out all_system_prompts.txt --index system_prompts_index.csv

10— زوج الطلب + الاستجابة في JSON (لإعادة التشغيل/التحليل)

إذا كنت تفضل زوجة سهلة للآلة (JSON واحد لكل التقاط + JSON رئيسي)، استخدم نص الزوج أدناه. إنه يقرأ ملفات .log التي أنتجها dump_claude_full.py، ويحلل الأقسام، ويسجل:

  • paired_captures.json — مصفوفة رئيسية من كائنات التقاط
  • paired_jsons/*.json — ملفات JSON لكل تقاط

نص الزوج (تنفيذ مثال):

# pair_captures.py (مفهوم)
# مُحاكاة: قراءة ملفات .log من claude_captures، وتحليل العناوين باستخدام التعبيرات المنتظمة،
# بناء الكائن: {source_file, captured_at, system_prompt, tools (قائمة)، messages, raw_response, response_json}
# كتابة ملفات JSON لكل تقاط في paired_jsons/، وملف رئيسي paired_captures.json.

# (انظر كود الزوج التفصيلي السابق في هذا الدليل — يمكنك نسخه حرفيًا أو تعديله)

يمكنك بعد ذلك:

  • استخدام ملف JSON لكل تقاط لبناء طلبات إعادة التشغيل (curl، httpie) أو لإدخاله في بيئة اختبار محلية.
  • تحويل التقاطات إلى تنسيق إعادة التشغيل الخادم في mitmproxy إذا أردت إعادة تشغيل حركة المرور بدقة دون اتصال.

11— إعادة تشغيل التقاطات (ملاحظة سريعة)

  • يدعم mitmproxy إعادة التشغيل الخادم باستخدام تدفقات المسجلة (mitmdump -w flows.mitm للتسجيل؛ --server-replay flows.mitm لإعادة التشغيل).
  • مخرجات زوج JSON مخصصة للتحليل البرمجي أو نصوص إعادة التشغيل المخصصة (curl/requests). لإجراء إعادة تشغيل طلب/استجابة حقيقية بتنسيق mitmproxy، فكّر في تسجيل ملفات تدفق .mitm باستخدام mitmdump -w flows.mitm بدلًا من النسخ النصية العادية .log.

12— تخفيف الأسرار والتنظيف

قبل مشاركة أو أرشفة السجلات:

  • احذف أو خفّي قيم الرؤوس (التوثيق، الكوكيز). مثال (مقتطف بايثون):
# مثال تخفيف رؤوس بدائي
if "Authorization" in flow.request.headers:
    flow.request.headers["Authorization"] = "<REDACTED>"
  • احذف ثقة CA من Keychain بعد الاختبار لاستعادة أمان النظام.
  • احتفظ بملفات التقاط في دليل مشفر إذا كانت ستستمر.

13— استكشاف الأخطاء وإصلاحها والنصائح

  • أخطاء TLS → على الأرجح لم تثق في شهادة mitm CA أو العميل يربط الشهادات.
  • لا توجد حركة مرور ملتقطة → تأكد من ضبط ANTHROPIC_BASE_URL على http://localhost:8000 أو تكوين العميل لاستخدام وكيل HTTP.
  • استجابات JSON مجزأة → غالبًا ما تُرسل Anthropic JSON جزئيًا؛ يجب أن تعامل مُحلّلاتك JSON الجزئي/غير الصحيح بسلاسة (حاول التقاط RAW TEXT RESPONSE ثم إعادة بنائه).
  • الشهادة على الأجهزة المحمولة → استيراد شهادة mitm إلى مخزن الثقة للجهاز؛ بالنسبة لـ iOS، احصل على تعقيدات التهيئة.
  • السجلات الكبيرة → دوّر السجلات أو اضغطها. فكّر في تخزين الحقول المستخرجة فقط (النظام، الأدوات، الرسائل) لتقليل الحجم.

14— سير العمل النموذجي (التشغيل الكامل)

  1. ابدأ mitmproxy بإضافة كاملة:
mitmdump -s dump_claude_full.py --mode reverse:https://API.anthropic.com --listen-port 8000
  1. صدّر البيئة وشغّل Claude Code:
export ANTHROPIC_BASE_URL="http://localhost:8000"
claude
# تفاعل مع Claude Code كما هو معتاد
  1. بعد الجلسة، أوقف mitmproxy. راجع claude_captures/ للبحث عن ملفات .log مُرَقَّمة حسب التوقيت.
  2. استخرج تعليمات النظام الفريدة:
python3 extract_system_prompts.py --dir claude_captures --out all_system_prompts.txt --index system_prompts_index.csv
  1. زوج الطلبات/الاستجابات في JSON:
python3 pair_captures.py   # أو شغّل سكريبت الزوجة الجاهز المذكور أعلاه
  1. قم بإزالة الأسرار وحذف شهادة mitm من الثقة (تنظيف).

ملاحظات أخيرة

هذا السير العمل هو الطريقة التي استخدمها الباحثون والمهندسون لفحص عملاء مثل Claude Code لفهم:

  • كيفية توصيل تعليمات النظام/القيود إلى النموذج، وكيفية التعامل مع JSON الجزئي المُتدفّق، وما هي السياسات التي يرفقها العميل بكل طلب.