rea-agents 6.0.0 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -17
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +173 -47
- package/bridge/hopper_bridge.py +310 -128
- package/bridge/mitmproxy/capture.py +0 -2
- package/bridge/native/rea_lldb_tracer.py +630 -94
- package/bridge/process/ProcessRunTokenReader.swift +39 -5
- package/bridge/pwntools/recorded_crash_impl.py +4 -0
- package/dist/android/JadxConfiguration.js +196 -33
- package/dist/android/JadxMcpTransport.js +4 -0
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +19 -2
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +6 -3
- package/dist/application/ClientConfigurationDocument.js +871 -6
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +27 -37
- package/dist/application/Doctor.js +4 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +13 -11
- package/dist/application/EvidenceBundleFiles.js +23 -11
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +3 -2
- package/dist/application/JsonFiles.js +50 -28
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/Setup.js +13 -1
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +5 -2
- package/dist/application/SetupPlan.js +5 -3
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +4 -3
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateRuntime.js +46 -25
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCaptureService.js +4 -2
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +2 -2
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WorkflowEvidence.js +82 -0
- package/dist/application/binary/AnalysisProviderEvaluation.js +21 -5
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -0
- package/dist/application/binary/AnalysisSnapshotCache.js +3 -6
- package/dist/application/binary/BinarySession.js +95 -68
- package/dist/application/binary/BinarySessionOpen.js +3 -3
- package/dist/application/binary/BinarySessionRecords.js +25 -3
- package/dist/application/binary/BinarySessionStatus.js +17 -1
- package/dist/application/binary/CompositeProvider.js +13 -0
- package/dist/application/binary/LazyAnalysisProvider.js +3 -0
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
- package/dist/application/evm/EvmInterfaceService.js +4 -2
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +24 -3
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +22 -15
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -4
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +39 -7
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +6 -3
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +11 -3
- package/dist/application/javascript/JavaScriptModuleRelationships.js +37 -8
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -1
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +23 -1
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +7 -4
- package/dist/application/managed/ManagedNativeVerificationService.js +4 -3
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/process/ProcessCli.js +14 -6
- package/dist/application/process/ProcessEvidence.js +4 -3
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +12 -2
- package/dist/artifacts/MachOSliceArtifactReader.js +98 -14
- package/dist/artifacts/NativeDmgArtifactReader.js +13 -6
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +22 -3
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +36 -22
- package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +13 -8
- package/dist/artifacts/inventory/scanCanonical.js +11 -14
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +76 -11
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +25 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/PlaywrightElectronActiveActions.js +32 -23
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +123 -124
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/history/CaptureFailures.js +37 -1
- package/dist/browser/history/CaptureRelease.js +5 -0
- package/dist/browser/history/HarCaptureAdapter.js +3 -3
- package/dist/browser/history/HarJson.js +3 -2
- package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/coreBinaryCommands.js +70 -12
- package/dist/cli/electronCommands.js +7 -6
- package/dist/cli/javascriptApplicationAnalysis.js +7 -3
- package/dist/cli/jsonOutput.js +4 -99
- package/dist/cli/nativeCallCommands.js +2 -3
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +2 -1
- package/dist/cliCommandNames.js +0 -1
- package/dist/cliJsonInput.js +9 -4
- package/dist/config/environment.js +4 -0
- package/dist/config/ghidraStartupTimeout.js +17 -0
- package/dist/config/mcpResponseBudget.js +22 -0
- package/dist/config/parseConfig.js +2 -1
- package/dist/contracts/enhancedInputs.js +5 -3
- package/dist/contracts/enhancedToolContracts.js +3 -3
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/javascript/electronToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +2 -4
- package/dist/contracts/native/nativeToolContracts.js +4 -2
- package/dist/contracts/officialToolContracts.js +14 -15
- package/dist/contracts/promptContracts.js +3 -3
- package/dist/contracts/sessionLifecycleInputs.js +3 -7
- package/dist/contracts/sessionStatusContract.js +2 -4
- package/dist/contracts/sessionToolContracts.js +4 -6
- package/dist/contracts/sessionToolSchemas.js +2 -5
- package/dist/contracts/toolContractExamples.js +0 -1
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolEffects.js +0 -1
- package/dist/contracts/toolOutputSchemaGroups.js +28 -27
- package/dist/contracts/toolOutputSchemaPrimitives.js +18 -0
- package/dist/contracts/toolSchemaMetadata.js +69 -10
- package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
- package/dist/domain/analysisErrorBase.js +8 -3
- package/dist/domain/analysisErrorCore.js +3 -1
- package/dist/domain/analysisErrorPresentation.js +72 -17
- package/dist/domain/analysisErrorProjection.js +106 -27
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +17 -9
- package/dist/domain/apple/appleApplication.js +41 -14
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dylibResolution.js +120 -9
- package/dist/domain/apple/dylibResolutionFindings.js +9 -7
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -13
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +9 -1
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +19 -24
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserScenarioValues.js +2 -6
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +6 -6
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/configurationErrors.js +1 -1
- package/dist/domain/evidence.js +64 -9
- package/dist/domain/evidenceBundle.js +42 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/explicitSensitiveFailure.js +17 -1
- package/dist/domain/firmware/firmwareAnalysis.js +6 -7
- package/dist/domain/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +30 -4
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationGraph.js +13 -0
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +97 -2
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +22 -5
- package/dist/domain/javascript/javascriptSemanticGraph.js +13 -0
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +25 -17
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +83 -11
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +14 -4
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -16
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +90 -6
- package/dist/domain/localPath.js +6 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -9
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeCallObservation.js +33 -11
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/process/processCapture.js +8 -4
- package/dist/domain/process/processComparison.js +38 -4
- package/dist/domain/process/processScenario.js +11 -10
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +1 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/reconstructionVerification.js +6 -43
- package/dist/domain/reconstructionVerificationSchemas.js +2 -2
- package/dist/domain/staticRuntimeCorrelation.js +6 -43
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- package/dist/domain/webRuntime.js +19 -5
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +5 -0
- package/dist/ghidra/GhidraClient.js +47 -14
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraFunctionValues.js +10 -7
- package/dist/ghidra/GhidraInstallation.js +18 -21
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +62 -0
- package/dist/ghidra/GhidraLauncher.js +33 -16
- package/dist/ghidra/GhidraProviderCapabilities.js +14 -2
- package/dist/ghidra/GhidraProviderClient.js +23 -12
- package/dist/ghidra/GhidraSessionError.js +11 -7
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/hopper/BridgeLauncher.js +31 -11
- package/dist/hopper/HopperAnalysisProfile.js +62 -4
- package/dist/hopper/HopperCleanup.js +15 -3
- package/dist/hopper/HopperClient.js +222 -14
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +196 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +63 -9
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +137 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +3 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +8 -3
- package/dist/inspector/V8InspectorProvider.js +47 -11
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- package/dist/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +32 -16
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +81 -84
- package/dist/native/LldbCallTracer.js +365 -102
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +62 -3
- package/dist/native/NativeMacOSProvider.js +98 -17
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
- package/dist/process/DarwinProcessRunTokenReader.js +8 -9
- package/dist/process/ExecFileOutput.js +20 -0
- package/dist/process/OwnedCommand.js +7 -2
- package/dist/process/ProcessOwnership.js +203 -53
- package/dist/process/ProcessOwnershipObservation.js +49 -4
- package/dist/process/ProviderProcess.js +38 -7
- package/dist/process/capture/ProcessCaptureError.js +2 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +100 -34
- package/dist/server/EvidenceMcpServer.js +146 -0
- package/dist/server/createServer.js +15 -8
- package/dist/server/registerAndroidTools.js +2 -4
- package/dist/server/registerApplicationTools/helpers.js +2 -4
- package/dist/server/registerArtifactComparisonTool.js +11 -7
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -4
- package/dist/server/registerBrowserScenarioTool.js +2 -4
- package/dist/server/registerBrowserTools.js +2 -4
- package/dist/server/registerBundleComparisonTool.js +2 -3
- package/dist/server/registerCloseLifecycleTool.js +8 -18
- package/dist/server/registerElectronTools.js +2 -4
- package/dist/server/registerEnhancedTools.js +18 -59
- package/dist/server/registerEvidenceTools.js +2 -4
- package/dist/server/registerEvmTools.js +2 -4
- package/dist/server/registerFirmwareTools.js +2 -4
- package/dist/server/registerFunctionComparisonTool.js +10 -6
- package/dist/server/registerInvestigationTools.js +7 -7
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -4
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -4
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +2 -4
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +2 -4
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -4
- package/dist/server/registerOfficialTools.js +2 -4
- package/dist/server/registerProcessComparisonTool.js +71 -45
- package/dist/server/registerRecordedCrashTools.js +2 -4
- package/dist/server/registerSessionRecordTools.js +5 -6
- package/dist/server/registerSessionStatusTool.js +17 -3
- package/dist/server/registerSessionTools.js +11 -3
- package/dist/server/registerWebModuleTool.js +2 -4
- package/dist/server/registerWebNetworkCaptureTool.js +2 -4
- package/dist/server/registerWebRuntimeTools.js +3 -7
- package/dist/server/registerWebScriptTool.js +2 -4
- package/dist/server/registerWebSourceLocationTool.js +2 -4
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +0 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +62 -10
- package/dist/server/toolResultEncoding.js +33 -0
- package/install.sh +1 -1
- package/native/windows/build/manifest.json +1 -1
- package/package.json +8 -3
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/skills/reverse-engineer-anything/SKILL.md +11 -3
- package/skills/reverse-engineer-anything/references/javascript-applications.md +8 -1
- package/dist/ghidra/GhidraDefaults.js +0 -2
|
@@ -6,6 +6,7 @@ import { z } from "zod";
|
|
|
6
6
|
import { BinaryTargetError } from "../domain/configurationErrors.js";
|
|
7
7
|
import { isPathWithinRoot } from "../domain/localPath.js";
|
|
8
8
|
import { parseXmlPropertyList } from "../domain/propertyListKeys.js";
|
|
9
|
+
import { decodeXmlPlistText } from "../domain/propertyListXmlText.js";
|
|
9
10
|
import { err, ok } from "../domain/result.js";
|
|
10
11
|
const execFileAsync = promisify(execFile);
|
|
11
12
|
const BUNDLE_LAYOUTS = [
|
|
@@ -18,23 +19,31 @@ const BUNDLE_LAYOUTS = [
|
|
|
18
19
|
// iOS-style bundles, as extracted from an IPA, keep both at the root.
|
|
19
20
|
{ plist: ["Info.plist"], programs: [], programsLabel: "the bundle root" },
|
|
20
21
|
];
|
|
22
|
+
const defaultFileSystem = { readFile, realpath };
|
|
21
23
|
/**
|
|
22
24
|
* Resolve an app bundle directory to its declared program file. macOS and
|
|
23
25
|
* flat iOS-style layouts are read directly. An iOS app installed on a Mac is
|
|
24
26
|
* a wrapper whose `Wrapper` directory holds the iOS bundle; that bundle is
|
|
25
27
|
* found by listing `Wrapper`, never by following the `WrappedBundle` link.
|
|
26
28
|
*/
|
|
27
|
-
export const resolveAppBundleExecutable = async (path) => {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
export const resolveAppBundleExecutable = async (path, fileSystem = defaultFileSystem) => {
|
|
30
|
+
try {
|
|
31
|
+
const layout = await presentLayout(path);
|
|
32
|
+
if (layout !== undefined)
|
|
33
|
+
return resolveLayoutExecutable(path, layout, fileSystem);
|
|
34
|
+
const wrapped = await wrappedBundle(path);
|
|
35
|
+
if (wrapped !== undefined) {
|
|
36
|
+
const wrappedLayout = await presentLayout(wrapped);
|
|
37
|
+
if (wrappedLayout !== undefined)
|
|
38
|
+
return resolveLayoutExecutable(wrapped, wrappedLayout, fileSystem);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (cause) {
|
|
42
|
+
if (cause instanceof BinaryTargetError)
|
|
43
|
+
return err(cause);
|
|
44
|
+
return err(new BinaryTargetError(path, errorReason(cause, path), { cause }));
|
|
36
45
|
}
|
|
37
|
-
return err(new BinaryTargetError(path,
|
|
46
|
+
return err(new BinaryTargetError(path, `app Info.plist is missing or no supported bundle layout was found: ${path}`, {
|
|
38
47
|
cause: new Error("No Contents/Info.plist, root Info.plist, or single Wrapper/*.app bundle was found"),
|
|
39
48
|
}));
|
|
40
49
|
};
|
|
@@ -56,13 +65,34 @@ const layoutPlistPresent = async (path) => {
|
|
|
56
65
|
catch (cause) {
|
|
57
66
|
if (isAbsence(cause))
|
|
58
67
|
return false;
|
|
68
|
+
if (isPermissionDenied(cause))
|
|
69
|
+
throw new BinaryTargetError(path, `permission denied inspecting app Info.plist ${path}`, { cause });
|
|
59
70
|
throw cause;
|
|
60
71
|
}
|
|
61
72
|
};
|
|
62
73
|
const isAbsence = (cause) => {
|
|
63
|
-
const code =
|
|
74
|
+
const code = errorCode(cause);
|
|
64
75
|
return code === "ENOENT" || code === "ENOTDIR";
|
|
65
76
|
};
|
|
77
|
+
const errorCode = (cause) => cause instanceof Error ? Reflect.get(cause, "code") : undefined;
|
|
78
|
+
const codeDescription = (cause) => {
|
|
79
|
+
const code = errorCode(cause);
|
|
80
|
+
return typeof code === "string" || typeof code === "number"
|
|
81
|
+
? ` (${String(code)})`
|
|
82
|
+
: "";
|
|
83
|
+
};
|
|
84
|
+
const isSystemErrorCode = (cause) => {
|
|
85
|
+
const code = errorCode(cause);
|
|
86
|
+
return (typeof code === "string" &&
|
|
87
|
+
/^[A-Z][A-Z0-9_]+$/u.test(code) &&
|
|
88
|
+
!code.startsWith("ERR_"));
|
|
89
|
+
};
|
|
90
|
+
const isPermissionDenied = (cause) => errorCode(cause) === "EACCES" || errorCode(cause) === "EPERM";
|
|
91
|
+
const errorReason = (cause, path) => isPermissionDenied(cause)
|
|
92
|
+
? `permission denied accessing app bundle path ${path}`
|
|
93
|
+
: isAbsence(cause)
|
|
94
|
+
? `app bundle path is missing: ${path}`
|
|
95
|
+
: `could not inspect app bundle path ${path}`;
|
|
66
96
|
/** The single real `.app` directory inside an iOS-on-Mac `Wrapper`. */
|
|
67
97
|
const wrappedBundle = async (bundle) => {
|
|
68
98
|
const wrapper = join(bundle, "Wrapper");
|
|
@@ -81,20 +111,32 @@ const wrappedBundle = async (bundle) => {
|
|
|
81
111
|
? join(wrapper, app.name)
|
|
82
112
|
: undefined;
|
|
83
113
|
};
|
|
84
|
-
const resolveLayoutExecutable = async (bundle, layout) => {
|
|
114
|
+
const resolveLayoutExecutable = async (bundle, layout, fileSystem) => {
|
|
85
115
|
const plistPath = join(bundle, ...layout.plist);
|
|
116
|
+
let plist;
|
|
117
|
+
try {
|
|
118
|
+
plist = await fileSystem.readFile(plistPath);
|
|
119
|
+
}
|
|
120
|
+
catch (cause) {
|
|
121
|
+
return err(new BinaryTargetError(plistPath, isPermissionDenied(cause)
|
|
122
|
+
? `permission denied reading app Info.plist ${plistPath}`
|
|
123
|
+
: isAbsence(cause)
|
|
124
|
+
? `app Info.plist is missing: ${plistPath}`
|
|
125
|
+
: `could not read app Info.plist ${plistPath}${codeDescription(cause)}`, { cause }));
|
|
126
|
+
}
|
|
86
127
|
let name;
|
|
87
128
|
try {
|
|
88
|
-
const plist = await readFile(plistPath);
|
|
89
129
|
name =
|
|
90
130
|
plist.subarray(0, 6).toString("ascii") === "bplist"
|
|
91
|
-
? await readBinaryPlistExecutable(plistPath)
|
|
92
|
-
: parseXmlPlistExecutable(plist
|
|
131
|
+
? await (fileSystem.decodeBinaryPlist ?? readBinaryPlistExecutable)(plistPath)
|
|
132
|
+
: parseXmlPlistExecutable(decodeXmlPlistText(plist));
|
|
93
133
|
}
|
|
94
134
|
catch (cause) {
|
|
95
|
-
return err(new BinaryTargetError(
|
|
96
|
-
cause
|
|
97
|
-
|
|
135
|
+
return err(new BinaryTargetError(plistPath, isPermissionDenied(cause)
|
|
136
|
+
? `permission denied decoding app Info.plist ${plistPath}${codeDescription(cause)}`
|
|
137
|
+
: isSystemErrorCode(cause)
|
|
138
|
+
? `could not decode app Info.plist ${plistPath}${codeDescription(cause)}`
|
|
139
|
+
: `app Info.plist is malformed, unsupported, or lacks CFBundleExecutable: ${plistPath}${cause instanceof Error ? ` (${cause.message})` : ""}`, { cause }));
|
|
98
140
|
}
|
|
99
141
|
if (!isSafeExecutableName(name))
|
|
100
142
|
return err(new BinaryTargetError(bundle, "app has an unsafe CFBundleExecutable"));
|
|
@@ -102,15 +144,19 @@ const resolveLayoutExecutable = async (bundle, layout) => {
|
|
|
102
144
|
const executable = join(programs, name);
|
|
103
145
|
try {
|
|
104
146
|
const [canonicalPrograms, canonicalExecutable] = await Promise.all([
|
|
105
|
-
realpath(programs),
|
|
106
|
-
realpath(executable),
|
|
147
|
+
fileSystem.realpath(programs),
|
|
148
|
+
fileSystem.realpath(executable),
|
|
107
149
|
]);
|
|
108
150
|
if (!isPathWithinRoot(canonicalPrograms, canonicalExecutable))
|
|
109
151
|
return err(new BinaryTargetError(bundle, `app program file leaves ${layout.programsLabel}`));
|
|
110
152
|
return ok({ executable: canonicalExecutable, infoPlist: plistPath });
|
|
111
153
|
}
|
|
112
154
|
catch (cause) {
|
|
113
|
-
return err(new BinaryTargetError(
|
|
155
|
+
return err(new BinaryTargetError(executable, isPermissionDenied(cause)
|
|
156
|
+
? `permission denied resolving app program file ${executable}`
|
|
157
|
+
: isAbsence(cause)
|
|
158
|
+
? `app program file is missing: ${executable}`
|
|
159
|
+
: `could not resolve app program file ${executable}`, { cause }));
|
|
114
160
|
}
|
|
115
161
|
};
|
|
116
162
|
/** Decode the top-level executable name with an XML parser, not a pattern. */
|
|
@@ -2,9 +2,25 @@ import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
|
|
|
2
2
|
import {} from "../domain/analysisErrorBase.js";
|
|
3
3
|
import { parseRelatedAddresses } from "../domain/hopperValues.js";
|
|
4
4
|
import { ok } from "../domain/result.js";
|
|
5
|
+
import { resolveProcedureAddress } from "./ProcedureAddressResolution.js";
|
|
5
6
|
/** Trace direct caller/callee relationships until the graph is exhausted or the goal is reached. */
|
|
6
7
|
export const traceCallPath = async (call, input, signal) => {
|
|
7
|
-
const
|
|
8
|
+
const start = await resolveProcedureAddress(call, input.start, signal);
|
|
9
|
+
if (!start.ok)
|
|
10
|
+
return start;
|
|
11
|
+
let goal;
|
|
12
|
+
if (input.goal !== undefined) {
|
|
13
|
+
const resolved = await resolveProcedureAddress(call, input.goal, signal);
|
|
14
|
+
if (!resolved.ok)
|
|
15
|
+
return resolved;
|
|
16
|
+
goal = resolved.value;
|
|
17
|
+
}
|
|
18
|
+
const resolvedInput = {
|
|
19
|
+
start: start.value,
|
|
20
|
+
...(goal === undefined ? {} : { goal }),
|
|
21
|
+
direction: input.direction,
|
|
22
|
+
};
|
|
23
|
+
const state = createTraceState(resolvedInput);
|
|
8
24
|
while (state.queueIndex < state.queue.length &&
|
|
9
25
|
state.traversalPath.length === 0) {
|
|
10
26
|
const address = state.queue[state.queueIndex++];
|
|
@@ -14,7 +30,7 @@ export const traceCallPath = async (call, input, signal) => {
|
|
|
14
30
|
if (current === undefined)
|
|
15
31
|
continue;
|
|
16
32
|
const found = await expandAddress(call, {
|
|
17
|
-
input,
|
|
33
|
+
input: resolvedInput,
|
|
18
34
|
state,
|
|
19
35
|
address,
|
|
20
36
|
current,
|
|
@@ -23,7 +39,7 @@ export const traceCallPath = async (call, input, signal) => {
|
|
|
23
39
|
if (found)
|
|
24
40
|
break;
|
|
25
41
|
}
|
|
26
|
-
return ok(projectTrace(
|
|
42
|
+
return ok(projectTrace(resolvedInput, state));
|
|
27
43
|
};
|
|
28
44
|
const createTraceState = (input) => ({
|
|
29
45
|
visited: new Map([[input.start, { depth: 0, path: [input.start] }]]),
|
|
@@ -219,11 +219,14 @@ const workflowAvailabilityFor = ({ name, kind, policy, }) => {
|
|
|
219
219
|
};
|
|
220
220
|
}
|
|
221
221
|
if (kind === "android-provider")
|
|
222
|
-
return policy.
|
|
222
|
+
return policy.androidAnalysisAvailability?.status === "available"
|
|
223
223
|
? { reason: "available", remediation: null }
|
|
224
224
|
: {
|
|
225
|
-
reason: "
|
|
226
|
-
|
|
225
|
+
reason: policy.androidAnalysisAvailability?.code === "unsupported_host"
|
|
226
|
+
? "unsupported_host"
|
|
227
|
+
: "provider_missing",
|
|
228
|
+
remediation: policy.androidAnalysisAvailability?.reason ??
|
|
229
|
+
"Set REA_JADX_MCP_JAR to a caller-supplied jadx-headless-mcp 0.7.1 JAR and provide a full JDK on Linux or macOS.",
|
|
227
230
|
};
|
|
228
231
|
const browser = browserProviderAvailability(name, kind, policy);
|
|
229
232
|
if (browser !== null)
|