Neues Plugin iris-rea-recherche: belegte Recherche an Firmware/Programmen mit Nachbau einzelner Aspekte #357
Labels
No labels
herkunft/alpha-feedback
status
blockiert
status
zu-testen
typ
bug
typ
docs
typ
enhancement
typ
feature
typ
idea
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
iris/iris-plugins#357
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Idee
Ein Plugin für Software-Entwicklung und Prototyping durch Recherche: Du gibst ein Ziel (zuerst Firmware oder ein natives Programm), das Plugin erfasst belegt, was es tut (Funktionen, Abläufe, offene Fragen) und baut einzelne Aspekte in Python nach, um das Verständnis zu prüfen. Craft Anything (3rdparty) dient nur als Vorlage für die Arbeitsweise, nicht als Motor.
Warum
Reverse-Engineering-Recherche hat heute keinen Ablauf mit Beleg-Speicher: Ghidra liefert Funde, aber Befunde, Hypothesen und offene Fragen verschwinden im Chat. Ein Ablauf mit deterministischen Skripten (Zustand, Prüfsummen, Verifikation) und LLM nur für Urteil und Text löst das.
Entschieden (grill-me)
iris-rea-recherche,iris-ghidraals Abhängigkeitunblobiris-ghidrawird umxrefs,callers,callees,find-stringund einen Export ausgewählter Funktionen erweitert (heute: nur Aufrufer-Anzahl, kein Querverweis)Etappen (je ein
ship)iris-ghidraerweiternunblob)--dry-run)Offen
iris-ghidraundunbloblaufen dort nicht; Parität folgt.iris-plugin-devauf das neue Plugin.unblobauf echten Abbildern des Nutzers läuft; wie schnell Ghidra auf großer Firmware ist.PR #358 gemergt: feat(iris-ghidra): Querverweise und Suche, mehrere Ziele beim Dekompilieren, Anleitung und Tests (#357)
http://docker:3000/iris/iris-plugins/pulls/358
Commits:
Etappe 1 von 6:
iris-ghidra0.2.0 (gebaut, nicht veröffentlicht).Befund:
iris-ghidrawar in der Registry nicht vorhanden (bewusst privat: keine.include, ohnecategory, ohne Store-Material, ohne Tests). Das Planwerkzeug voniris-plugin-devlehntrequires: ["iris-ghidra"]deshalb ab. Der Export lieferte nur die Anzahl der Aufrufer, keine Querverweise, undanalyzedekompilierte jede Funktion.Geändert:
xrefs,callers,callees,find-string(--regex),find-const, seitenweise (--limit,--offset); neues Ghidra-SkriptQuery.java.decompilenimmt mehrere Ziele; ein unbekanntes steht als Kommentarzeile, nur unbekannte Ziele sind ein Fehler.analyze --ohne-pseudocodedekompiliert nicht alles.plugin.json: Version 0.2.0,category: development,platforms: ["macos"],changelog,user_docs; Anleitungdocs/erste-schritte.md,store/(Icon, Langtext, Changelog); Build-Skript kopiertdocs/.iris-ghidra/tests),PLAN.mdund neuesession-kontext.md.Geprüft: Alle neuen Befehle an einem selbstgebauten Testprogramm (arm64, 6 Funktionen) gegen bekannte Erwartungen: Strings und ihre Nutzer, Regex, Aufrufer und Aufgerufene, Querverweise, Seitenblättern, mehrere Ziele beim Dekompilieren. 24 Tests grün, davon 13 mit echtem Ghidra 12.1.4.
publish-plugins.sh --dry-run iris-ghidra: „1 würden veröffentlicht, 0 fehlgeschlagen" (mit temporärer.include, danach entfernt). Paketinhalt kontrolliert (Query.java,docs/).Gefundene Fehler beim Testen:
DecompileOne.javahatte eine Methodefind, die mitGhidraScriptkollidiert (behoben).find-constfindet auf ARM nur Teilwerte (movz/movk).Nicht geprüft: Installation über die Mac-GUI und
post_installauf einem frischen Mac; Abfragen an großer Firmware (Dauer vonfind-const); Verhalten auf einem anderen Ghidra als 12.1.4.Offen: Veröffentlichung wartet auf die Freigabe (
.include). Danachplan setzenfüriris-rea-recherche.PR #359 gemergt: chore(iris-ghidra): Freigabe für die Registry (.include), 0.2.0 veröffentlicht (#357)
http://docker:3000/iris/iris-plugins/pulls/359
Commits:
iris-ghidra0.2.0 ist veröffentlicht.Draußen (nach
git pullim Registry-Repo geprüft): Paketiris-ghidra-0.2.0.irispluginmit Kategoriedevelopment, nur Mac, Store-Material (Icon, Langtext, Changelog) und Anleitung „Erste Schritte". Der Datenschutz-Scan des Veröffentlichungsskripts lief ohne Fund.Was Nutzer bekommen:
xrefs,callers,callees,find-string,find-const(seitenweise), mehrere Ziele beidecompile,analyze --ohne-pseudocode. Beim Installieren holt der Hook per Homebrew Ghidra, JDK 21 und bei Bedarf den LE/LX-Loader.Nicht geprüft: Installation aus der Registry über die Mac-GUI und
post_installauf einem frischen Mac; Abfragen an großer Firmware.Offen: Etappen 2 bis 6 von
iris-rea-recherche. Als Nächstesplan setzenim Vorhaben (requires: iris-ghidraist jetzt in der Registry).PR #360 gemergt: docs(iris-rea-recherche): Plan als Entwurf, Session-Kontext aktualisiert (#357)
http://docker:3000/iris/iris-plugins/pulls/360
Commits:
Plan für
iris-rea-rechercheliegt im Checkout (Entwurf).Geändert:
iris-rea-recherche/PLAN.mdmit allen Entscheidungen samt Begründung, Phasen, Aufbau, Etappen, Tests und „Nicht Teil“;session-kontext.mdaktualisiert. Kein Code.Hinweis: Das Planwerkzeug von
iris-plugin-devist für Iris gebaut (Arbeitsordner = Chat-Workspace, Klon von Forgejo). Hier wird direkt im Checkout gearbeitet; der Plan ist deshalb von Hand alsPLAN.mdgeschrieben, mit einer Rubrik für Entscheidungen, die das Werkzeugformat nicht hat.Nicht geprüft: Alles an dem Plugin selbst; der Plan wartet auf „Plan passt“ vom Nutzer.
Offen: Etappen 2 bis 6.
PR #361 gemergt: feat(iris-rea-recherche): Gerüst, Projekt und Beweis-Speicher (Etappe 2) (#357)
http://docker:3000/iris/iris-plugins/pulls/361
Commits:
Etappe 2 von 6: Gerüst, Projekt und Beweis-Speicher (Version 0.1.0, nicht veröffentlicht).
Geändert: Neues Plugin-Verzeichnis
iris-rea-recherchemitplugin.json(requires: iris-ghidra, nur Mac),build-irisplugin.sh,SKILL.md,rea_projekt.pyundrea_speicher.py, 67 Tests;PLAN.mdauf „aktiv“ und um die Etappen-Ergebnisse ergänzt.rea_projekt.py: Ziel aufnehmen (schreibgeschützte Kopie, SHA-256, ab 512 MB Rückfrage mit Exit-Code 3), Modus Clean room (Standard) oder Deep mit vermerktem Verlauf, Phasenregeln,status,weiter,zurueck. Ändert sich die Kopie, führt kein schreibender Befehl Belege fort.rea_speicher.py: Befunde, Hypothesen, offene Fragen als JSON; Befund nur mit gültiger Fundstelle (adresse,offset,funktion,datei), trägt die SHA-256 des Ziels; „verifiziert“ nur über einen bestandenen Nachbau, der den Befund abdeckt; eine Hypothese wird nur mit verifiziertem Befund bestätigt; seitenweise Listen; Markdown-Fassung.Entscheidung beim Bauen (bitte prüfen): Das Kontextpaket ist ab dem ersten Befund jederzeit erlaubt, nicht erst in der Phase „kontext“, weil der Zweck das Sammeln von Kontext ist, auch ohne Nachbau. Im Plan nachgetragen.
Geprüft: 67 Tests grün; drei Regeln (Fundstelle, Verifikation, Prüfsumme) absichtlich ausgebaut: die Tests wurden rot. Paket gebaut und Inhalt kontrolliert. Durchlauf an einer echten Datei über die Kommandozeile (Aufnahme, Befund, Hypothese, Frage, Phase, Markdown, abgelehnte Bestätigung).
Nicht geprüft: Installation über die Mac-GUI und Aufruf aus Hermes; Verhalten bei Dateien über 512 MB an echten Abbildern (nur mit kleiner Schwelle getestet).
Offen: Etappen 3 bis 6 (Firmware entpacken mit
unblob, Nachbau und Verifikation, Vault-Notiz und Systemprompt, Anleitung und Veröffentlichung).PR #362 gemergt: feat(iris-rea-recherche): Firmware entpacken mit unblob, Hook und sasquatch-Ersatz (Etappe 3) (#357)
http://docker:3000/iris/iris-plugins/pulls/362
Commits:
Etappe 3 von 6: Firmware entpacken (Version 0.1.0, nicht veröffentlicht).
Befund vorab:
unblobhat keine Homebrew-Formel, aber macOS-Wheels (pip install unblob, 26.6.4). Von 11 externen Entpackern gab es 7 in Homebrew, zwei bringt pip mit;partclone(selten) fehlt.sasquatchbaut auf macOS nicht (Linux-Header,sigtimedwait),unblobruft SquashFS aber nur unter diesem Namen auf. Entscheidung (Variante A): ein Ersatz um das normaleunsquashfs; ein Port (Variante C) bleibt eine mögliche spätere Etappe.Geändert:
hooks/post_install.sh(Mac): installiert per Homebrew, was fehlt (p7zip e2fsprogs erofs-utils lziprecover lzop unar simg2img squashfs zstd lz4), undunblob26.6.4 per pip in~/.hermes/iris-rea-recherche/venv; zeigt jeden Schritt, idempotent, Exit-Code 1 mit Meldung bei Fehlern.rea_firmware.py:doctor,entpacken(unblob statisch, Zeitlimit, Teile mit Art, Offset, Größe, SHA-256, Entpack-Fehlern, Entropie bei Unbekanntem in den Speicher),dateien(seitenweise, Symlinks werden nicht gefolgt).bin/sasquatchundbin/sasquatch-v4be: Little-Endian-SquashFS anunsquashfs; Big-Endian und herstellereigene Varianten werden mit klarer Meldung abgelehnt.rea_speicher.py/rea_projekt.py: Teile im Speicher (liste --art teile),entpackenist eine Phasen-Aktion, Fundstelledatei:nur für Dateien im entpackten Ziel (ohne Symlink-Ausbruch),offset:nur innerhalb der Datei; ältere Speicher ohne Teile werden gelesen.SKILL.md,plugin.json(Hook), Build-Skript (bin/),PLAN.md,session-kontext.md.Geprüft: 107 Tests grün (einer übersprungen: der Fall ohne Homebrew). Der Hook lief für echt auf diesem Mac (Formeln installiert, venv angelegt) und beim zweiten Lauf idempotent;
unblob --show-external-dependenciesfindet danach alles außerpartclone. Ein echterunblob-Lauf an einem selbstgebauten Abbild (Rauschen, ZIP, tar.gz mit verschachteltem tar, SquashFS über den Ersatz) liefert die erwarteten Teile, Hashes stimmen mit den Bytebereichen überein, die Dateien aus dem SquashFS sind da. Drei Regeln (Prüfsumme beim Entpacken, Symlink-Ausbruch, Big-Endian-Ablehnung) absichtlich ausgebaut: Tests wurden rot. Paket gebaut, Inhalt kontrolliert.Nicht geprüft: Hook auf einem frischen Mac ohne die Formeln; Installation über die Mac-GUI und Aufruf aus Hermes;
unbloban echter Firmware und großen Abbildern (Dauer, Speicher); Big-Endian-SquashFS, herstellereigene Varianten undpartclonewerden nicht entpackt.Grenzen:
entpackenläuft synchron (Zeitlimit 3600 s); ob Hermes es als Hintergrundjob startet, hängt an Skill-Text und Job-System.Offen: Etappen 4 bis 6 (Nachbau und Verifikation, Vault-Notiz und Systemprompt, Anleitung und Veröffentlichung).
PR #363 gemergt: feat(iris-rea-recherche): Nachbau und Verifikation mit Testvektoren (Etappe 4) (#357)
http://docker:3000/iris/iris-plugins/pulls/363
Commits:
Etappe 4 von 6: Nachbau und Verifikation (Version 0.1.0, nicht veröffentlicht).
Geändert:
rea_nachbau.py(neu):neu(Ordnernachbauten/N1-…mitbeschreibung.mdaus den Befunden, Gerüstnachbau.py,testvektoren.json,struktur.json),beschreibung,testvektor,struktur,pruefen,status. Der Nachbau läuft in einem eigenen Prozess (python3 -I, Zeitlimit), nie das Original.bestandengilt ab mindestens 2 Testvektoren, die alle stimmen; ein falscher Vektor oder Code, der nicht läuft, istdurchgefallen; mit weniger Vektoren bleibt der Struktur-Abgleich (Funktionen, Konstanten, Aufrufreihenfolge aus dem Syntaxbaum) mit dem Ergebnisstruktur= „Struktur plausibel, nicht verifiziert“.nachbau.py,testvektoren.jsonundstruktur.json; ändert sich eine Datei, lässt sich der Befund nicht mehr verifizieren (befund verifizierenprüft das),statuszeigt „veraendert“.pruefenlehnt Code mit Ghidra-typischen Namen ab (FUN_…,param_1,local_c,iVar1,undefined8…); im Modus Deep ist das erlaubt.rea_projekt.py/rea_speicher.py:pruef_hash, Umlaute in Ordnernamen werden ausgeschrieben (Prüfsumme → pruefsumme);SKILL.md,PLAN.md,session-kontext.md.Entscheidungen beim Bauen (bitte prüfen): Mindestens 2 Testvektoren für
bestanden(ein einzelner Vektor ist zu schwache Evidenz); ein einziger falscher Vektor macht das Ergebnis zudurchgefallen, auch wenn der Struktur-Abgleich passt; stimmt der Struktur-Abgleich nicht, aber alle Vektoren, bleibt esbestandenmit Hinweis.Geprüft: 158 Tests grün (einer übersprungen: der Fall ohne Homebrew). Fünf Regeln einzeln ausgebaut (Mindestzahl, Clean-room-Prüfung, Prüfsumme, Herkunft der Testvektoren, falscher Vektor): die Tests wurden jeweils rot. Der Ablauf Aufnahme → Befund → Nachbau → Testvektoren → Prüfung → Verifikation wurde von Hand über die Kommandozeile durchgespielt; Paket gebaut, Inhalt kontrolliert.
Nicht geprüft: Ob das Modell Testvektoren wirklich aus dem Ziel zieht (der Skill-Text verlangt es, das Skript prüft nur die Herkunftsangabe); ob die Clean-room-Stichprobe genügt (sie erkennt nur Ghidra-typische Namen, kein Abschreiben mit umbenannten Variablen); Installation über die Mac-GUI und Aufruf aus Hermes.
Offen: Etappen 5 und 6 (Kontextpaket, Vault-Notiz, Systemprompt; Anleitung, Store-Material, Veröffentlichung).
PR #364 gemergt: feat(iris-rea-recherche): Kontextpaket, Vault-Notiz, Systemprompt und Skill-Text (Etappe 5) (#357)
http://docker:3000/iris/iris-plugins/pulls/364
Commits:
Etappe 5 von 6: Kontextpaket, Systemprompt und endgültiger Skill-Text (Version 0.1.0, nicht veröffentlicht).
Geändert:
rea_kontext.py(neu):kontextschreibt<Projekt>/kontext.mdaus dem Beweis-Speicher, deterministisch und mit fester Obergrenze von 12000 Zeichen (etwa 3 bis 4 Seiten). Inhalt nach Wichtigkeit: Ziel mit SHA-256, Modus mit seiner Regel (Pseudocode übernehmen oder nicht), Stand, verifizierte Befunde, nicht verifizierte Befunde (gekennzeichnet), Hypothesen, offene Fragen, Nachbauten (auch „seit der Prüfung geändert“), entpackte Teile mit Entpack-Fehlern, „So geht es weiter“ mit fertigen Aufrufen. Überlänge wird stufenweise gekürzt (zuerst die Texte der nicht verifizierten Befunde, zuletzt die der verifizierten), gekürzte Einträge stehen mit ihren IDs im Text. Ist die Kopie des Ziels verändert, steht das ganz oben.--vault ORDNERlegt die NotizRecherche <Name>.mdmit Frontmatter nach Vault-Regel ab (descriptionhöchstens 120 Zeichen). Der Ort wird gemerkt, spätere Aufrufe aktualisieren dieselbe Notiz; eine fremde Notiz gleichen Namens wird nie überschrieben; der Ordner muss es geben, kein.., kein Symlink hinaus; schlägt die Ablage fehl, ist das lokale Paket trotzdem geschrieben. Das Skript rät den Ort nicht: Der Agent bestimmt ihn nach der Ablageregel des Vaults und klärt ihn mit dem Nutzer.system_prompt.md„Recherche“ mit dem Verwendungssatz aus dem Plan,plugin.json(system_prompt*),SKILL.mdganz neu und kompakt (Regeln, Ablauf in sechs Schritten, Grenzen),PLAN.md,session-kontext.md.Entscheidung beim Bauen (bitte prüfen): Das Kontextpaket ist ab dem ersten Befund erlaubt (so schon im Plan), und die Obergrenze von 12000 Zeichen ist jetzt festgelegt.
Geprüft: 192 Tests grün (einer übersprungen: der Fall ohne Homebrew). Fünf Regeln einzeln ausgebaut (Obergrenze, fremde Notiz, Warnung bei veränderter Kopie, Symlink-Ausbruch aus dem Vault, Verifizierte zuerst): die Tests wurden jeweils rot. Von Hand: ein Projekt mit Befunden, Hypothese und Frage bis zum Kontextpaket und in einen Vault-Ordner. Paket gebaut, Inhalt kontrolliert;
publish-plugins.sh --dry-runbesteht (mit temporärer.include, danach entfernt).Nicht geprüft: Aufruf aus Hermes (ob der Auto-Modus „Recherche“ gegen „Ghidra“ richtig wählt, ob der Skill-Text im echten Gespräch trägt); ob eine neue Session aus dem Kontextpaket tatsächlich nicht bei Null anfängt (das zeigt erst ein echter Durchlauf); Installation über die Mac-GUI.
Offen: Etappe 6 (Anleitung, Store-Material, Veröffentlichung nach deinem Wort).
PR #365 gemergt: feat(iris-rea-recherche): Anleitung, Store-Material und Doku-Tests (Etappe 6) (#357)
http://docker:3000/iris/iris-plugins/pulls/365
Commits:
Etappe 6 von 6: Anleitung, Store-Material und Prüfung des Pakets (Version 0.1.0, nicht veröffentlicht).
Geändert:
docs/erste-schritte.md(eingetragen unteruser_docs): Einrichten, Benutzung im Chat, Ablauf in sechs Phasen, Clean room oder Deep, was „verifiziert“ heißt, das Kontextpaket, Grenzen. Nur Aussagen, die der Code belegt.store/:icon.svg,description.md(173 Wörter),changelog.md;plugin.jsonmit Änderungstext. Alles mit erfundenen Beispielen, ohne Pfade, Namen oder Dateien aus dem privaten Bestand.tests/test_rea_doku.py: Anleitung, Manifest und Store gegen den Code (Zahlen und Konstanten, jeder Unterbefehl kommt in der Anleitung vor, Homebrew-Liste wie im Hook, Änderungstext gleich Changelog-Abschnitt, Datenschutz-Scan des Registry-Werkzeugs, Grenzen und Form des Store-Materials).PLAN.md,session-kontext.md.Geprüft: 211 Tests grün (einer übersprungen: der Fall ohne Homebrew). Der neue Doku-Test fand beim ersten Lauf zwei Befehle (
beschreibung,testvektor), die in der Anleitung fehlten (ergänzt). Drei Regeln ausgebaut (Konstante, privater Pfad in der Anleitung, abweichender Änderungstext): die Tests wurden rot.publish-plugins.sh --dry-runmit Store und Anleitung: „1 würden veröffentlicht, 0 fehlgeschlagen“ (mit temporärer.include, danach entfernt; der Datenschutz-Scan läuft darin). Das gebaute Paket in einen Temp-Ordner entpackt und damit einen Durchlauf gemacht: Aufnahme,doctor, Entpacken mit echtemunblob(ZIP, tar.gz mit tar darin, SquashFS über den Ersatz aus dem Paket, 85,5 % als bekanntes Format erkannt), Befund mitdatei:-Fundstelle, Kontextpaket in einen Vault-Ordner.Nicht geprüft: Installation über die Mac-GUI und Aufruf aus Hermes (Auto-Auswahl „Recherche“ gegen „Ghidra“, Skill-Text im echten Gespräch); Hook auf einem frischen Mac ohne die Formeln;
unbloban echter, großer Firmware; ob das Modell Testvektoren wirklich aus dem Ziel zieht; ob eine neue Session aus dem Kontextpaket tatsächlich nicht bei Null anfängt.Offen: Veröffentlichung (nur auf das Wort „Veröffentliche“). Folgeaufgaben: Linux-Parität, Port von
sasquatch(Big-Endian-SquashFS), optional ein Hinweis iniris-plugin-dev.PR #366 gemergt: chore(iris-rea-recherche): Freigabe für die Registry (.include), 0.1.0 veröffentlicht (#357)
http://docker:3000/iris/iris-plugins/pulls/366
Commits:
iris-rea-recherche0.1.0 ist veröffentlicht.Draußen (nach
git pullim Registry-Repo geprüft): Paketiris-rea-recherche-0.1.0.irisplugin(39,6 KB) mit Kategoriedevelopment, nur Mac,requires: iris-ghidra(steht ebenfalls in der Registry, die Abhängigkeit ist auflösbar), Store-Material (Icon, Langtext, Changelog) und Anleitung „Erste Schritte“. Der Datenschutz-Scan des Veröffentlichungsskripts hat nichts gefunden (sonst wäre das Veröffentlichen abgelehnt worden).Was Nutzer bekommen: Recherche an Firmware und Programmen in sechs Phasen: Aufnahme mit schreibgeschützter Kopie und SHA-256, Entpacken mit
unblob, Befunde nur mit Fundstelle, Nachbau einzelner Aspekte in Python mit Prüfung gegen Testvektoren (verifiziert erst nach bestandenem Nachbau), Kontextpaket für eine neue Session (höchstens 12000 Zeichen, auf Wunsch als Vault-Notiz). Beim Installieren holt der Hook per Homebrew die Entpacker und richtetunblobin einem eigenen venv ein.Nicht geprüft: Installation über die Mac-GUI und Aufruf aus Hermes (Auto-Auswahl „Recherche“ gegen „Ghidra“, Skill-Text im echten Gespräch); der Hook auf einem frischen Mac ohne die Homebrew-Formeln;
unbloban echter, großer Firmware; ob das Modell Testvektoren wirklich aus dem Ziel zieht; ob eine neue Session aus dem Kontextpaket tatsächlich nicht bei Null anfängt.Grenzen: Nur Mac. Big-Endian-SquashFS, herstellereigene SquashFS-Varianten und Clonezilla-Abbilder (
partclone) werden nicht entpackt.Offen: Ein echter Durchlauf an echter Firmware nach der Installation. Folgeaufgaben: Linux-Parität (
iris-ghidraundunbloblaufen dort noch nicht), Port vonsasquatchfür Big-Endian-SquashFS, optional ein Hinweis iniris-plugin-devauf dieses Plugin.