Phase 13: Tools & Protocols

الأدلة والثقة والجهول في التحليل الثنائي

اكتشاف حول برنامج مرتب هو سجل مع الاختبار، الثقة، السلطة، و قائمة من ما لا يمكن أن يظهر.

Type: Build

Languages: Python, C

Prerequisites: Phase 13 · 32 (ELF from scratch), Phase 13 · 33 (disassembly and control flow), Phase 13 · 34 (lifting to pseudocode)

Time: ~105 minutes

أهداف التعلم

  • بناء سجل دليل على النموذج من REALEvidenceمع الاعتقاد الملاحظ والمستحوذ والإستنتاج
  • احسب هاشات المحتوى التي تبقى نفسها عندما ينتقل الملف إلى مجلد آخر.
  • تسجيل ما لا يمكن لكل مزود أن يظهر كقيود التي تسافر مع السجل.
  • رفض إعلان النتيجة حتى تدعمها تشغيل الملاحظ للعمل.
  • حفظ البقايا غير المعروفة كسجلات مراجعة يضمها سلسلة الهاش.
  • مزود الاحتفاظ بالإجابة تحت مفتاح دقيق ورفض إعادة تشغيل قديم.

المشكلة

سألت عميل ماذاgradeفيledger-x86_64-O1.oيعود الوكيل لدرجة 55، يتصل rea، يقرأ رمز Ghidra، ويرجح 0.uVar1 = -(param_1 >> 0x1f) ^ (uint)((ulong)((long)param_1 * 0x66666667) >> 0x3f);البايتات في تلك النقطة تقولxor eax, eax. . .

يُنتج التعليمات والعبرة كلتا 0 لكل إدخال. لم يكن العامل يعلم ذلك. كان يثق بالنص لأنه أداة أنتجته. أجريت دراسة عام 2026 على ثلاثة عملاء على 24 مهمة هندسة عكسية (NDSS BAR 2026وقد أعلنت الدراسة عن أربع نقاط ضعف متكررة: تحيز التدريب، والثقة المفرطة في الملاحظات، والحدود السياقية، ومواصلة الخطة. وقد وضعت دراسة أخرى عام 2026 النص داخل النصوص الثنائية ووجدت أن النماذج قد اقترحت العمل غير الآمن في 35 من أصل 40 حالة (arXiv 2607.12507)

rea 6.5.0 يعطي الوكيل ذخيرة لغوية لهذا. كل مكالمة أداة ناجحة تنتج واحدة Evidenceسجل مع confidenceمنobserved،derivedأوinferred، وauthorityو قائمةlimitations. المهارة المعبأة تخبر العميل: "كل نتيجة يجب أن تميز الملاحظات، الاستنتاجات، وغير المعروفة. اقتباس هويات الأدلة، الحفاظ على القيود والغطاء غير الكامل، ولا يعني أبدا أن التحليل الدولي لاحظ التنفيذ".

ثلاثة أشياء تترك لك rea. تحفظ صورها الفورية نتائج الاستفسار الدقيقة ، وليس التحليل. تتم إثباتها بمطالبة عندما لا يتغير بعدة مقارنة ، وتقول تعليقها الخاص أن المرور "لا يضع تعادل تنفيذ عالمي. " يأخذ دفتر التزامها المرشحين فقط من جاوا سكريبت وجرافات مدروسة ، لذلك لا يصل وظيفة محلية أبداًverifiedعبرها

هذه الدروس تبني الجزء المفقود في بيثون البسيط. أنت تكتب دفترًا كبيرًا يحتوي على كل حقائق حول العضو كسجل مع hash المحتوى. أنت تقوم بتنبؤات حولpercent_changeوgradeو تُستورد سجلين حقيقيين و اللقطة الفورية التي جاءوا منها، و يقوم دفترك الرئيسي بإعادة حساب كل رسالة hash rea كتبت.

ثلاث كلمات لثقة وخمسة لسلطة

confidenceهو عدد مع ثلاثة قيم، أبدا رقم. authorityعندما لا يقول المنتج شيئاً، يستخدمshipped-artifactمعobserved. . .

ValueMeaning on the fixtureRecords in this lesson
observedA fact read from bytes or from a runthe ELF reader's section and symbol reads, the two Ghidra records, 17 host runs
derivedA fact computed from observed recordsthe switch table model, the division model, every unknown mutation
inferredAn expectation that no observation states yet18 predictions
shipped-artifactThe file on disk was the sourceevery read of ledger-x86_64-O1.o
controlled-replayA run you controlled produced the factthe host runs of harness.c
analyst-inferenceYour own judgementpredictions and unknown mutations
historical-referenceAn older source tree or documentnone here
external-serviceA service outside the file and the hostnone here

اثنين من الخلطات تكلف أكثر من الوقت. الأول يعامل الرمز السوداني كملاحظة للسلوك. إنه ملاحظة لما طبعته غيدرا. الثاني يعامل قائمة فارغة كدليل على غياب. ملاحظة تصميم rea صارمة: "التغطية المفقودة غير معروفة، وليس غياب. "code/main.pyيرمز كلا القواعد

السجل

سجل لديه بالضبط 16 حقل، و 6.5.0 رفض أي حقل آخر. code/main.pyتحتفظ بنفس الأسماء التي يستخدمها ريا، لذا سجل من كلا الجانبين يؤكد على الآخر.relationship_coverage، يظهر كم عدد المُتصلين أو المُدعوين كامل.complete،partialأوunknownأوnullعندما لا تُبلغ العملية عن أي اتصال

FieldWhat it holds
evidence_idev_ and 64 hex digits, a hash of the content
subjectname, digest.sha256, format, architecture, local_path, or null
providerid, name, version or null
analysis_profilethe provider's settings and their digest, or null, always present
predicate_typea tag, rea.analysis by default
operation, parametersthe tool and its input
raw_result, normalized_resultprovider output and the canonical result
confidence, authoritythe enums above
environmentid, platform, architecture, isolation, or null
limitationsplain sentences
relationship_coveragestatus complete, partial, or unknown with diagnostics, or null
locationsaddress, address-range, artifact-path, file-offset, file-offset-range
evidence_linksthe ev_ ids this record rests on

هذا هو السجل الحقيقي الذي كتبته رياgrade، وقطع إلى الحقول التي تهم هناcode/fixtures/rea-evidence-grade.json، 37،573 بايت

json{
  "evidence_id": "ev_67b6d3f992eaf49a2e16de084b6ebfdd9884e8c5c7f75e175b7bb20f4f748ce1",
  "subject": {
    "name": "ledger-x86_64-O1.o",
    "digest": { "sha256": "9a4a8082ba5e285a732552981a6935e0c5255725664f380e37c44ebfb04d803f" },
    "format": "elf",
    "architecture": "x86_64",
    "local_path": "/private/tmp/aiefs-re/phases/13-tools-and-protocols/35-evidence-confidence-and-unknowns/code/fixtures/ledger-x86_64-O1.o"
  },
  "provider": { "id": "ghidra", "name": "Ghidra", "version": "12.1.4" },
  "analysis_profile": {
    "provider": { "id": "ghidra", "name": "Ghidra", "version": "12.1.4" },
    "parameters": { "jump_table_evidence": "typed-case-default-blocks-v1", "import_mode": "ephemeral-source-immutable" },
    "digest": "9c7f6b24be69294e61da046e4583e3856cb9e40433b149c1bf8bb534d2fe03ef"
  },
  "operation": "analyze_function",
  "parameters": { "procedure": "grade" },
  "confidence": "observed",
  "authority": "shipped-artifact",
  "environment": null,
  "limitations": [
    "Default-space addresses use lowercase 0x-prefixed hexadecimal; other address spaces use <percent-encoded-space>:0x<hex>.",
    "Resolved reference metadata identifies computed, indirect, external, call, jump, and data edges; unresolved targetless flows remain unknown, and function classifications distinguish thunks and externals."
  ],
  "relationship_coverage": {
    "status": "complete",
    "diagnostics": [
      "Only resolved Ghidra call references are returned; unresolved computed or indirect calls remain unknown, while function classifications distinguish thunks and externals."
    ]
  },
  "locations": [],
  "evidence_links": []
}

الحقيقيparametersالملف المُلف يحتوي على 25 مفتاحاً.limitationsالقائمة لديها عشر جمل. احتفظ بها. الحد هو جزء من المحتوى، لذلك إلقاء واحد يغير الهوية، وسوف دفتر الكتب الخاص بك بعد ذلك رفض السجل.

لاحظ ما لا يخبرنا به السجل.environmentهوnullلأن (غيدرا) قرأ ملفاً ولم يجد شيئاًlocationsهو فارغ لأن هذه العملية تقارير العناوين داخل normalized_result. .relationship_coverageلديه الوضعcomplete. تشخيصها يقول أن إشارات المكالمة الحلّة فقط هي التي يتم إرجاعها، وأن المكالمات الحاسوبية أو غير المباشرة غير الحلّة تظل مجهولة. لذا فإن قوائم المكالمين والمكالمات كاملة للمكالمات الحلّة فقط.

الهوية هي حش من السعاده، والطريق ليس فيها

الحوسبة الحقيقيةevidence_idكـev_بالإضافة إلى SHA-256 على RFC 8785 JSON القنوني من مشهد من السجل.digest،formatوarchitectureوقطراتnameوlocal_path- إنّه ينزلقrelationship_coverageعندما تكون قيمتهاnull، لذا سجل بدون علاقات المكالمة يحافظ على نفس الهوية التي كانت بها قبل وجود الحقل. كل شيء آخر، بما في ذلكraw_resultوكل قيود، يتم تحديدها

يقوم RFC 8785 بتنظيم مفاتيح الأشياء ، وإزالة الفضاء الأبيض ، وتصنيع أشكال الأرقام والسلسلة. بالنسبة للسجلات التي تكون أرقامها عدداً صحيحاً ، تنتج مكتبة Python القياسية نفس البايت:

pythondef canonical_json(value):
    return json.dumps(value, sort_keys=True, separators=(",", ":"), ensure_ascii=False, allow_nan=False)

code/main.pyيرفض العائدات قبل أن يضخ، لأن RFC 8785 و Python طبع بعض العائدات بشكل مختلف. السجلين rea والتصوير الفوري لا تحتوي على أي العائدات، لذلك الوصفة تعيد كل hash rea:

rea valueRecomputed by code/main.py
ev_67b6d3f992eaf49a… for gradeequal
ev_e88b10dc0c6400e5… for percent_changeequal
profile digest 9c7f6b24be69294e… over {provider, parameters}equal
query_26122aebe9d8abae… for the grade snapshot entryequal
query_0f95ef38038d3666… for the percent_change entryequal

لماذا استبعاد المسار؟ نفس الملاحظة من نفس البايتات تحصل على نفس الهوية على أي آلة وفي أي مجلد.local_pathفي القائمة أعلاه أسماء المجلد على جهاز Mac واحد. لا يتغير الهوية عند نسخ الجهاز إلى /home/you/re. .rebind_subject_path()يسمح لك بإظهار سجل تحت مسار جديد.sha256،formatأوarchitectureيختلف.rebindEvidenceToTargetPathعندما يعيد تشغيل سجل لقطة لهدف في مسار جديد.

validate_evidence()يعيد حساب الهوية ويرفض عدم مطابقة مع جملة "الادلة المعرفية المفصلة لا تتطابق مع سجلها"analysis_profile.providerيختلف عن الـprovider- الاختبارtest_tampered_id_and_mismatched_profile_are_rejectedيُحَرّر سطر واحد من الرمز الخفيف داخل الفيديو الحقيقي gradeسجل ومشاهدة دفتر التسجيل رفض ذلك.

لاحظوا الشيء بنفسك

قبل أي مزود، يقرأ الكاتب الملف.observe_object()يدرس عناوين القسم ELF64, .symtab،.strtabو.rela.textمعstruct.unpack_from- يكتب واحدinspect_objectسجل و واحد read_function_bytesسجل لكل رمز وظيفة. كل خمسة هيobservedمع السلطةshipped-artifact، لأن المصدر كان الملف على القرص

RecordContentId
inspect_objectfive sections with offsets, sizes, and hashes, four functions, three relocationsev_645e0a145f28bd5c…
read_function_bytes percent_change16 bytes at .text+0x00ev_2572a7d254ad15cb…
read_function_bytes grade46 bytes at .text+0x10, SHA-256 ffcb75c2a7bb1104…ev_a467c2427bfc0c56…
read_function_bytes total31 bytes at .text+0x40ev_b1e845cea2543073…
read_function_bytes grade_label63 bytes at .text+0x60ev_c50041be26e6b7f4…

llvm-objdump -tيوافق: gradeفي0000000000000010مع حجم2e. ثلاث عمليات نقل في.rela.textهل هيR_X86_64_PC32ضد.rodataفي التكافؤات0x36،0x84و0x93، مع إضافات0x10،0x24و-0x4كل سجل يحمل رقمfile-offset-rangeالموقع والقيود الواحد: "تقرأ البايتات من القسم من الملف على القرص. القارئ لا يطبق أي نقل ولا يعمل أي رمز".

الدرس 32 يبني القارئ بالكامل. هنا هو 60 سطر، لأن هذا الدرس يتعلق بما تسجل عن القراءة.

استنتاج الجدول، وقول أنك استنتاجته

الـ 46 بايت من gradeتحتوي على أربعة أنماط التي فك الدروس 33:

BytesInstructionOffset in grade
48 69 c0 67 66 66 66imul rax, rax, 0x666666673
48 c1 f9 22sar rcx, 3413
83 c1 faadd ecx, -623
83 f9 04 77 0ccmp ecx, 4 then ja28

مضاعفة بـ 0x66666667يليها تحويل من 34 هو تقسيم موقّم بـ 10. الملف يحمل رقم 10.derive_grade_model()يكتب هذا الحقيقة كحد: "مقسم 10 هو مشتق من المضاعف 0x66666667 والتحول 34. الملف يحمل رقم 10. "

  • نعمadd ecx, -6يضع الحالة الأولى إلى 6.cmp ecx, 4مع قفزة غير موقعة يعترف خمسة قضايا، 6 إلى 10.
  • نعمleaفي.text+0x33يُحمل الإنتقال مع إضافة0x10. PC32 تدير عمليات نقل من نهاية التنقل البايت 4، لذلك تبدأ الجدول في .rodata+0x14خمسة كلمات صغيرة من القراءة1, 2, 3, 4, 4- المفتاح فيledger.cيعود 1 ل 60 إلى 69, 2 ل سبعينات، 3 ل الثمانينيات، و 4 ل 90 إلى 100. قام المجمع بتحويل المفتاح إلى جدول بحث من القيم العائدة.

السجل الناتجev_605106bff2d9998f…- نعمconfidence derived، و هوevidence_linksاسم السجلين الملاحظين الذي يتوقف عليه. إزالة سجل البايتز من دفتر التسجيل والسجل المشتق له رابط متعلق. الرسم أعلاه يظهر هذه الحالة عندما تقوم بتعطيلev_a467c242…. . .

الآن مقارنة مع غيدرا، رمزها السيدو للعمليات نفسها:

cuint grade(int param_1)
{
  uint uVar1;
  uint uVar2;

  uVar2 = param_1 / 10 - 6;
  uVar1 = -(param_1 >> 0x1f) ^ (uint)((ulong)((long)param_1 * 0x66666667) >> 0x3f);
  if (uVar2 < 5) {
    uVar1 = *(uint *)(&DAT_001000b4 + (ulong)uVar2 * 4);
  }
  return uVar1;
}

جيدرا قام بتنفيذ عملية الإنتقال وسمّى الجدولDAT_001000b4، وهو.rodata+0x14بعد وضعها.textفي0x100000. استعاد القسم بال 10 والحالات الخمسة. للقيمة الافتراضية طبعت تعبيرًا هو 0 دائماً ولا يقول أبداً 0.native_value_flowيُعَلِّم هذه العمليات is_dead: trueالسجل هو ملاحظة صادقة من غيده، والمعنى الذي تقرأ منه مشتق، والقيمة التي تتوقعها من ركض يتم استنتاجها.

  • نعمpercent_changeالسجل يظهر الفشل الآخر توقيع غيدرا يقرأundefined1 [16] percent_change(int param_1,int param_2,ulong param_3)المصدر يقولint percent_change(int before, int after). .idivيكتبEDX:EAX، و سلك الصفر يتركEDXغير متأثر، لذا قام المُفكّر بإستنتج عودة 16 بايت وبرامج ثالثة.native_api.return_type.confidenceلـgradeهو"low". اعتبر توقيعًا تم استعادته استنتاجًا للمقدم ، واكتبها بهذه الطريقة

التنبؤات هي سجلات

التنبؤ هو ادعاء حول السلوك الذي لم يظهر أي ملاحظة. claim_suite()يُبني ثمانية عشر منها من النماذج المستمدة ومن المصدر. record_prediction()تخزن كل واحد كسجل مع confidence inferredوauthority analyst-inference، مرتبطة بالسجلات التي تستند إليها

ClaimPredicted valueRests on
percent_change(12400, 15500)25, from 310000 / 12400division model ev_076a9167…
percent_change(0, 5)0, the zero guarddivision model
percent_change(100, 50)-50division model
percent_change(-7, 3)-142, because idiv truncates toward zerodivision model
grade(55)0, index -1 fails the unsigned comparetable model ev_605106bf…
grade(60), grade(69)1, 1table model
grade(70), grade(85)2, 3table model
grade(95), grade(100), grade(105)4, 4, 4table model
grade(110), grade(-5)0, 0table model
total(1, 2, 3), total()6, 0source record ev_2f1e6d25…
grade_label(85)"B"source record and table model
grade(score) for 90 to 1004 for all eleven inputstable model

predict()يستخدم المفاهيم C، وليس المفاهيم Python. c_div()يختصر نحو الصفر، وwrap32()يطوي كل متوسطة إلى 32 بت.//الجولات نحو اللانهاية السلبية، لذلك (3 - -7) * 100 // -7يعطي -143 وبرنامج C يعطي -142. الدروس 36 يجعل هذه الشبكة أكبر بكثير.

كل تنبؤ يفتح بقية مجهولة.observedدليل مع السلطةcontrolled-replayو يوصي بمسح واحد:execute_functionعلى بناء المضيف. القسم التالي ينتج هذا الدليل. يسأل السؤال لمتطلب الصف الأول "هل تصفية ((95) == 4 تحافظ عندما تعمل الوظيفة المجمعة؟"

تحقق منهم من السباق

code/fixtures/harness.cيشمل ledger.cويقوم بطبع نتيجة واحدة لكل دعوةobserve_runs()يجمعها مع أول من clang،ccأوgccعلى طريقك وتشغيل كل مدخل في الشبكة مرة واحدة. كل جولة تصبح سجل واحد:

json{
  "operation": "execute_function",
  "parameters": { "function": "grade", "args": [95] },
  "normalized_result": { "result": 4, "stdout": "4\n", "exit_code": 0 },
  "confidence": "observed",
  "authority": "controlled-replay",
  "environment": { "id": "host-process", "platform": "darwin", "architecture": "arm64", "isolation": "process" },
  "limitations": [
    "The run executed a host build of ledger.c, not the x86-64 object. The claim about the object rests on the shared source and on the compiler.",
    "One run observes one input. It proves nothing about other inputs."
  ]
}

موضوع سجل تشغيل هو ثنائي الحزام، ملف Mach-O arm64 على هذا ماك، مع SHA-256 الخاص به.course-harnessمع خط نسخة المُجمّع، هنا Apple clang version 17.0.0 (clang-1700.6.3.2)- المُؤمنونevidence_linksاسم سجل المصدر ev_2f1e6d251543d017…، لأن الجري والجسم يتشاركونledger.cولا شيء آخر

قراءة الحد الأول مرتين. لم يتم تشغيل كائن x86-64 على هذه الآلة. ما تم تشغيله كان بناء ثان من نفس المصدر لمهندسة معمارية أخرى. هذا ما زال ملاحظة، وهو أقوى واحد متاح دون محاكاة، لذلك يمر المطالبة مع هذه الجملة المرفقة. تقرير يفقده فقد المعلومات التي يحتاجها القارئ.

17 مدخل واحد يوافقون على التنبؤاتcode/fixtures/run-evidence.jsonيحتفظ بهذه السجلات الـ 17 و سجل المصدر ، يتم تصديرها مع --recordفي 2026-10-13. عندما لا يوجد محفز،build_ledger()ويقول التقرير ذلك في تقريرهrunsالمجال

قواعد الترقية

يتحرك المطالبة من المستنتاج إلى المُدعم فقط من خلال عمليات الملاحظة. check_claim()يبحث عنexecute_functionتسجل نفس الوظيفة والحجج، وتقارن كل نتيجة مع التنبؤ، وتحسب المدخلات المغطاة:

StatusConditionrea's completion ledger
passevery input has an agreeing run and none disagreespass
failany run disagreesfail
unknownsome inputs have runs, others have noneunknown
unsupportedno input has a rununsupported

promote_claim()هو الشكل الصارم.ClaimErrorعندما يكون أي هويةinferredأوderivedيُثير عندما يطلق اسم id على سلسلة من وظيفة أخرى أو من حجج أخرى. يُثير عندما تكون القائمة فارغة، وعندما تغطي الرحلات أدخلاً أقل من المطالبة. سجل رمز غيدرا السيدو كود ونموذج الجدول موجودان لـgrade(55)ولا يمكن أن يروج لها إطفئev_7be90c0c…في الرسم وشاهد انخفاض المطالبة إلى unsupportedبينما سجلين حولgradeالبقاء

يظهر ادعاء المدى الحالة الجزئية. فقط اثنان من مدخلاته الحادية عشر، 95 و100، تظهر في شبكة التشغيل. check_claim()العائداتunknownمعcovered2 من 11 ، و promote_claim()رفض مع "2 من 11 مدخلات قد لاحظت الجري".

completion_ledger()مرآة رياEvidenceCompletionLedgerهو هوecl_بالإضافة إلى الـ "هاش" من سجلاته، وcompleteصحيح فقط عندماpassمتساويةtotal. بصمات التجربةecl_da64933ea13befed…معcomplete: false، بسبب هذا المطالبة المدى الواحد

المجهولات هي سجلات مع سلسلة هاش

تُخزن rea بقايا غير معروفة كسجل صارم. code/main.pyيحتفظ بنفس الحقول والخيارات المتغيرة

الهوية هيunk_+ SHA-256 فوق {domain, question, scope_digest}و مع انهيار الفضاء البيضاء للأسئلة إلى فراغات فردية. تحليلين يسألون نفس السؤال عن نفس الملف يحصلون على نفس الهوية.scope_digestهو SHA-256 من الكائن.

كل تغيير هو مراجعة جديدة.previous_revision_digest nullكل مراجعة لاحقة تسميrevision_digestمن قبلها، والحذف يغطي كل حقل إلا نفسه.verify_unknown_chain()يمر قائمة ويعيد حساب كل إعادة. يُحقق من أن كل رابط يشير إلى الإصلاح السابق. يُحقق من أن أدلة الطفرة لكل أسماء الإصلاح موجودة في دفتر التسجيل.

كل طفرة هي نفسها سجل دليل، كما هو الحال مع المقدم rea-unknown-registry. حمولاتناconfidence derived،authority analyst-inferenceو لا يوجد موضوع، ويقول حدوده "التحولات السجلية تسجل ما قرر المحلل، إنها ليست دليل على الإجابة".

لهذا السبب تتضمن سجلات الديمو 81 سجلات طفرات مشتقة 36: 18 فتحة و 18 تحديث.

يتم فرض ثلاثة ثنائيات على كل مراجعة:

  • فقطresolvedلا يعرف يحملresolution، و فقط الإصلاح 1 ليس لديه سلف
  • أcontradictedأسماء مجهولة على الأقل هوية واحدة تتناقض، ولا يوجد هوية في كلتا القائمين.
  • أverifiedتحديد اسم واحد على الأقل من أشكال الأدلة التي تتمتع بالثقة والسلطة المطلوبة.

القاعدة الثالثة هي حيث يرفض دفتر التسجيل في أغلب الأحيان. ملاحظات سير العمل في rea تقول "لا يمكن إلا التحقق من الأدلة الملاحظة المؤهلة التحقق من القرار". resolve_unknown()ولهذا السبب يرفض نموذج الجدول، يرفض سجل مراقب مع السلطةshipped-artifact، ويقبل سجل الجريev_f4ffbe8f922ec7fe…. الإصلاح المقرر لـgrade(95)هو مراجعة 2، و previous_revision_digestهوffca840b55a8a188…، إعادة النظر 1

update_unknown()يأخذexpected_revisionو يرفعrevision-conflictعندما يكون قديمًا، كما هو الحالupdate_unknownرد فعل صحيح هو أن ملاحظات ريا تعطى: إعادة قراءة مراجعة الحالية وقرار مرة أخرى.

واحد غير معروف يبقى مفتوح بعد التجربة:unk_f2eb0d7f84c80a19…هل تصنيف ((نقطة) == 4 لكل نقطة من 90 إلى 100 تحتفظ عندما يتم تشغيل الوظيفة المجمعة؟ وضعها هو investigating، وتشمل أرقامها الداعمة الجريتين، ولا تزال صنعتها تسمي التسعة المدخلات دون جري.

مخزن الإجابات ليس قاعدة بيانات للتحليل

في الواقع، هناك ثلاثة أشياء تبدو مثل التخزين.-readOnly -deleteProjectو تم حذفها في وقت قريبAnalysisSnapshotCacheيحتوي على ما يصل إلى 10،000 إدخال لتحديد هوية ثنائية واحدة. الملف الفوري يحتوي على target،binding،entries،workflow_entriesوevidence_bundle. . .

مفتاح التخزين هوquery_+ SHA-256 فوق {target, binding, operation, parameters}. .targetهو{sha256, kind, format, architecture}وraw-binaryالهدف أيضاًentry_point. .bindingهو المقدم وكل ملف التحليل، ومضمنة التهليل. تغيير أي من 25 ملف ملف، على سبيل المثال jump_table_evidenceمنtyped-case-default-blocks-v1إلىv2ويتغير الهضم، لذا كل مفتاح يتغير.

code/fixtures/rea-snapshot.jsonهو الملف الذي كتبه rea خلال الإجراءات الثنائية، 142,690 بايت. كتبه rea مع الإذنات المالكة فقط، والنسخة الملتزمة يمكن قراءتها من قبل الجميع.AnswerCache.import_snapshot()يعيد حساب كل واحدquery_idو يرفض الملف عندما يختلف أي.targetأوbindingيختلف عن النشطة، مع صياغة rea profile_mismatch. يرفض صورةformat_versionليس كذلكcourse-answer-cache-1. . .

ثلاثة قياسات من هذه الآلة.gradeاستغرق استفسار 8.6 ثانية، مع استيراد جديد Ghidra.percent_changeاستغرق استفسار ضد نفس اللقطة الفورية 8.5 ثانية، لأن استفسار مختلف هو خطأ التخفيض.gradeاستغرق الاستطلاع 2.1 ثانية وعاد السجل نفسه مع نفس evidence_id. إعادة تشغيل في الذاكرة في rea يضيف الحد "حملت من صورة تحليل REA محلية؛ هذه المكالمة لم تعيد تشغيل المقدم. "lookup()يضيف جملة من نفس النوع، حتى القارئ يمكن أن تعرف التكرار من إجابة جديدة.

ينتهي الطفرة الاحتفاظ بالخزنة. في rea 6.5.0، يتم إعادة تسمية أو تعليق تطهير الاحتفاظ بالقطة اللقطية قبل أن ترسل rea المكالمة إلى المقدم. لا يمكن أن يثبت رد فشل أن الكتابة قد تم إعادة التدوير، لذلك توقف الكتابة الفاشلة أيضًا عن التردد. يقوم استيراد البيانات المعدنية التي تغير قاعدة البيانات بنفس الشيء.

لماذا العميل يحتاج هذا

وكيل الذي يدير " ريا " عبر " ميكب " يرى السجل الكامل في كل مكالمة ويمكن أن يقتبسevidence_idفي تقريرها. يوضح البحث من عام 2026 أين يذهب ذلك خطأ. كان الثقة المفرطة في إنتاج الأدوات أحد نقاط الضعف الأربعة في دراسة NDSS BAR. في دراسة النص المزرع، التي أظهرت المحتوى الثنائي على أنه البيانات وحدها ما زالت تترك 15 مقترح غير آمن من 40، وتحققات المصلحة مع تصريح الأدوات أزالتهم. دراسة ثالثة شاهدت وكيل يقود Ghidra من خلال MCP (arXiv 2606.06838في المجموعات الثنائية التي لديها مئات الوظائف، فقط 10 إلى 15 في المئة حصلوا على التحليل الحقيقي قبل أن ينتج العامل القطع.

يرد دفتر التسجيل على كل هذه السجلات، ويقول الوكيل فقط ما يحتوي عليه دفتر التسجيل.unsupported. دعوة مع بعض الركضات هوunknownرسالة الموردة هيobservedعن المزود ولا شيء آخر أعط العميل ملف المهاراتoutputs/و جعل هذا الكتاب المكان الوحيد الذي يكتب فيه الاستنتاجات هذا ينطبق على كلود، كورسور، كودكس، أوبين كلوا، هرمز، أو أي وكيل يقرأ SKILL.md

بناءها

أطلق عرض المكتبة القياسية:

bashcd phases/13-tools-and-protocols/35-evidence-confidence-and-unknowns
python3 code/main.py

يقرأ الديمو الكائن، ويستورد سجلين حقيقيين، ويتحقق من اللقطة الفورية الحقيقية، ويستمد النماذج. ثم يسجل 18 تنبؤًا، وفتح 18 مجهولاً، ويجمع ويمارس الحزمة، ويتحقق من كل ادعاء، ويحل 17 مجهولاً. شكل متوقع:

json{
  "records": 81,
  "by_confidence": { "observed": 25, "derived": 38, "inferred": 18 },
  "rea_snapshot": { "entries": 2, "replay_hit": true, "stale_profile_refused": true },
  "grade_table": [1, 2, 3, 4, 4],
  "runs": "live: Apple clang version 17.0.0 (clang-1700.6.3.2)",
  "claims": [ { "claim_id": "grade(95)", "status": "pass", "covered": "1/1" }, { "claim_id": "grade(90..100)", "status": "unknown", "covered": "2/11" } ],
  "completion_ledger_id": "ecl_da64933ea13befed9483f8b00447bb3f4ceb74324c01e2515eff03f3af3ca750",
  "complete": false,
  "unknowns": { "resolved": 17, "investigating": 1 }
}

بدون مُجمّع "سي"،runsيقرأimported 17 recorded run records from run-evidence.jsonوالباقي هو نفسه.

اقرأcode/main.pyفي هذا الترتيب:

  1. canonical_json()وcompute_evidence_id()إحتفظ بإصدار الـ "هاش" والتنبيهات التفاصلية
  2. create_evidence()وvalidate_evidence()بناء وتحقق من سجل.
  3. EvidenceLedger.record()وimport_bundle()تخزين السجلات ورفض النزاعات.
  4. open_unknown()،update_unknown()وresolve_unknown()إبق سلسلة الإصلاح
  5. observe_object()يقرأ ELF، و derive_grade_model()يقرأ الطاولة
  6. claim_suite()،predict()وrecord_prediction()اكتب المستوى المستنير
  7. observe_runs()يُحوّل كلّ إطارٍ من السلاح إلى سجلٍ مراقب.
  8. check_claim()،promote_claim()وcompletion_ledger()تطبيق قواعد الترويج.
  9. AnswerCacheالمفاتيح تجيب مثل صور ريا و ترفض تلك القديمة.

استخدمها

ضع سجل واحد لكل هدف و لكل تحقيق ضع SHA-256 للهدف في كل موضوع و إضافة نطاق السؤال في كل مجهول عندما تغير الأدواتproviderعندما تقوم بإعادة بناء الملف، يتغير الموضوع وكل سجل قديم يصبح دليل على ملف آخر

اكتب القيود في اللحظة التي تعرفها فيها القارئ الذي لا يطبق أي نقل يقول ذلك. تشغيل بناء مضيف يقول ذلك. النموذج الذي يستدل على مقسم يقول ذلك. سجل مكتوب دون قيودها يبدو أقوى من الحقائق تسمح، والقارئ لاحقا لا يمكن إصلاح ذلك.

تعامل كل نص مزود كبيانات. السلاسل والرموز السودية من الهدف هي نص يسيطر عليه الهدف._meta.provenance.untrusted_content: trueتُخبر تعليمات الخادم النموذج بمعالجة المحتوى المستهدف على أنه بيانات وإبلاغ أي طلب فيه لتشغيل أو تثبيت أو تنزيل أو إرسال شيء كحاولة حقن سريع. يساعد العلامة، ولكن يجب على دفترك الكبرى إبقاء النص المستهدف خارج التعليمات.

المختبر التفاعلي

المختبر (أ): إعادة حساب الهوية الحقيقية

منcodeالإرشادات، مفتوحة Python:

bashcd phases/13-tools-and-protocols/35-evidence-confidence-and-unknowns/code
python3 -q

أركض

pythonfrom main import *
record = load_evidence_file(FIXTURES / "rea-evidence-grade.json")
record["evidence_id"] == compute_evidence_id(record)
record["subject"]["local_path"] = "/home/you/re/ledger-x86_64-O1.o"
record["evidence_id"] == compute_evidence_id(record)
record["limitations"].pop()
record["evidence_id"] == compute_evidence_id(record)

المقارنات الأولى صحيحة. المسار ليس في الهاش. الثالث غير صحيح، لأن الحد يحتوي.

المختبر ب: رفض الترقية

pythonledger, report = build_ledger(live_runs=False)
claim = [c for c in claim_suite(ledger.find(operation="derive_switch_model")[0], ledger.find(operation="derive_arithmetic_model")[0], ledger.find(operation="read_source")[0]) if c.claim_id == "grade(55)"][0]
promote_claim(ledger, claim, [ledger.find(operation="derive_switch_model")[0]["evidence_id"]])

الطلب يطلعClaimErrorو اسم الهوية المستمدة. الآن مرر الهوية التشغيل:

pythonrun = run_records_for(ledger, "grade", [55])[0]
promote_claim(ledger, claim, [run["evidence_id"]])["status"]

الوضع هوpassو العائدينlimitationsتحمل عقوبة بناء المضيف.

المختبر "ج" رفض صورة سريعة

pythonimport json
snapshot = json.loads(REA_SNAPSHOT_PATH.read_text())
target, binding = rea_snapshot_binding(snapshot)
AnswerCache(target, binding).import_snapshot(snapshot)
stale = dict(binding["analysis_profile"]["parameters"], jump_table_evidence="typed-case-default-blocks-v2")
AnswerCache(target, {"provider": binding["provider"], "analysis_profile": make_profile(binding["provider"], stale)}).import_snapshot(snapshot)

الإقرارات الأولى للدخل الثانيةCacheErrorمعprofile_mismatch. تغيرت سلسلة نسخة واحدة، و يتم رفض الصورة الفورية بأكملها.

المختبر (د): كسر السلسلة

pythonunknown_id = [u for u, r in ledger.unknowns.items() if r[-1]["status"] == "investigating"][0]
ledger.verify_unknown_chain(unknown_id)
ledger.unknowns[unknown_id][0]["severity"] = "critical"
ledger.verify_unknown_chain(unknown_id)

المكالمة الأولى تعود، والثانية ترتفعEvidenceIntegrityError، لأن المراجعة 1 لم تعد تتطابق مع المراجعة الخاصة بها والمتراجعة 2 نقطة في المراجعة التي لم تعد موجودة.

مختبر التدريب

أغلق المفتوح غير معروف وأضف مزودًا آخر.

المتطلبات:

  • التمديدrun_grid()إذاً، فإنّ الدخولات المفقودة التسعة التي تظهر في الدعم، ثمّ تأكيد التحركات المجهولة إلىresolvedفي المراجعة 3.
  • إضافةllvm-objdump -dكمقدم ثان مع خاصتهproviderالاعتراض و تسجيل إدراجها في قائمة gradeكـobserved. . .
  • اكتبderivedسجل يذكر القائمة، غيدرا و llvm-objdump، فك تشفير نفس 14 تعليمات، وربط كل منهما.
  • افتح شخص مجهولgrade_label(105)بشدةhigh، حيث أن المؤشر الرابع يقرأ labels[4]و أنتهى الأمر بالركض
  • إصدار دفتر التسجيل مع export_bundle()، و إدخاله إلى دفتر جديد و إثبات أن كل سلسلة ما زالت تثبت

النجاح يعني تقرير يذكر فيه كل جملة هوية من الحزمة والتيunknownلقد اختفت المطالبة

درساً أساسياً

هذا الدرس يُنتجoutputs/skill-evidence-ledger.mdيخبر الوكيل كيفية كتابة كل اكتشاف كسجل مع الثقة والسلطة والقيود والروابط.pass،fail،unknownأوunsupported. . .

تحقق من ذلك

إشغال التجربة والسلسلة التحديدية:

bashcd phases/13-tools-and-protocols/35-evidence-confidence-and-unknowns
python3 code/main.py
python3 -m unittest discover -s code/tests -v

الاختبارات الـ 28 تثبت:

  • كلاهما حقيقيevidence_idالقيم، و الملفات الموضعية، وكلاهما الصورةquery_idالقيم تعود إلى الحساب من المحتوى
  • مسار تغيير يحافظ على الهوية وتغيير الحد تغيرها
  • يتم رفض سجل مُتَعَدَّد، ومُقدِّم ملف مُختلف، ومُعَدَّد، وقيمة enum غير معروفة
  • إرجاع سجل مزدوج duplicate، وارتفاعات السجل المتناقضة، و استيراد مجموعة هو الذرية
  • المجموعة المُسجلة من الواردات التي تم تسجيلها مع 18 سجلًا وبدون روابط متعلقة
  • لا يعرف يفتح عند مراجعة 1 ، يرفض إيقافexpected_revisionو يُحلّ فقط مع الملاحظةcontrolled-replayالأدلة
  • إصدار تحرير يكسّر السلسلة
  • يرفض الترويج أدلة استنتاجية ومستمدة فارغة وغير مرتبطة، ويجري مع إجراء متفق
  • التغطية الجزئية هي unknownو (الجهاز) غير متفق عليهfail
  • الاحتفاظ بالمساحة الزمنية يضرب المفتاح الدقيق ويغيب عن المعلمات الأخرى
  • الاحتياطي الاحتياطي يرفض نسخة ملف تعريفية متضايقة، هدف خاطئ، نسخة في شكل خاطئ، ومفتاح تعديل
  • يوافق قارئ ELFllvm-objdumpعلى التداولات والحجم والبايتات والتحويلات، والجدول يقرأ 1, 2, 3, 4, 4
  • التنبؤات تستخدم قسم C، والمسارات المسجلة تتفق مع جميع 17 دعوى المدخل الواحد
  • مع وجود مُحامٍ، السباقات المباشرة تتفق أيضاً

أساليب فشل الإنتاج

FailureWhat the weak report saysWhat the ledger requires
Pseudocode read as behaviour"grade returns 0 for failing scores"an execute_function record for that input, or unsupported
Decompiler signature trusted"percent_change returns 16 bytes"the signature marked as the provider's inference with its low confidence
Empty list read as absence"the function has no callers"an unknown status, or a coverage field when the tool provides one
Path hashed into the id"the record changed" after a copythe semantic projection without name and local_path
Limitation dropped from a copya record that looks stronger than the sourceid mismatch and rejection on import
Partial grid rounded up"all scores from 90 pass"unknown with covered 2 of 11
Host run presented as the object's run"the x86-64 object returned 25"the host-build limitation carried on the claim
Unknown closed by a sentence"resolved, see above"a verified resolution with observed ids of the required authority
Stale revision overwrittentwo analysts' edits colliderevision-conflict and a reread
Old snapshot replayed after a releaseanswers from a changed contractprofile_mismatch on import
Cache kept after a renamea replay that hides a metadata writeinvalidation before dispatch and a failed export

قاعدة العمليات

سجل ما قرأت، ما حاسبته، وما تتوقعه كثلاث أنواع من السجلات مع ثلاث كلمات. أغلق المجهول مع هويت، أبدا مع جملة. إعادة عرض الإجابة فقط تحت المفتاح الدقيق الذي تم تخزينها به، ورفضها عندما تختلف سلسلة نسخة واحدة.

المزيد من القراءة

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.