[GH-ISSUE #6659] [Bug] Desktop inspection skips GameMaker game.unx and game.ios data files #4038

Closed
opened 2026-10-31 00:46:15 +00:00 by bsakaguchi · 0 comments
Owner

Originally created by @coygeek on GitHub (Oct 23, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/6659

[Bug] Desktop inspection skips GameMaker game.unx and game.ios data files

Labels: bug, triage

Before submitting

  • I searched the open and closed issues for a related report.
  • I removed credentials, tokens, private paths, and sensitive target data.

Area

Evidence, artifacts, or reconstruction

Observed behavior

Desktop inspection recognizes a bounded FORM/GEN8 header in data.win, but does not inspect identical bytes in non-executable assets/game.unx or Example.app/Contents/Resources/game.ios. Both return candidates: [], read_status: "not-selected", no byte ranges, and coverage.status: "complete-within-scan" with generous default limits.

This was observed through createDesktopApplicationService().inspect({path}), the shared application service used by the desktop operation. CLI/MCP transport was not exercised.

Reproduction

  1. Create three separate fixture directories containing, respectively, data.win, assets/game.unx, and Example.app/Contents/Resources/game.ios. Give every file mode 0644 and the same 16 bytes, hex 464f524d0800000047454e3800000000 (FORM, little-endian size 8, GEN8, little-endian chunk size 0).
  2. From this source checkout, invoke createDesktopApplicationService().inspect({path: fixtureRoot}) once per directory, closing each service afterwards. This is the same reduced header fixture the repository accepts in its desktop boundary tests.
  3. Compare the retained file facts and runtime candidates. The probe ran using the repository’s tsx source runner.

Each case ran once. These are reduced header fixtures, not complete runnable games; the test isolates file selection before decoding.

Expected behavior

Inspect the conventional Linux and macOS GameMaker data filenames and apply the existing bounded header check. The documentation identifies GameMaker from a bounded FORM container beginning with GEN8, without restricting that check to Windows data filenames.

game.unx is an actual Linux export filename in GameMaker's own issue tracker. The UndertaleModTool quick start also names data.win, game.ios, and game.unx as GameMaker data files.

Impact and scope

Runtime-family triage omits the GameMaker candidate for these ordinary non-executable Linux/macOS data-file names. A caller inspecting an unknown installation loses the engine signal even though the existing header parser could recognize it. Scope is file selection, not GML decoding. The macOS layout was tested on Linux; native macOS execution and a complete exported game were not tested.

A practical workaround for identifying the family is to inspect a copy of the data file named data.win in a scratch directory. The byte-identical data.win control produced the expected GameMaker fact and candidate. This does not repair inventory of the original installation.

REA version

Source commit 23def04096869b85c4d3c14a73ed09168483c9f6 (main). The desktop reader files are absent from the fetched rea-agents-6.7.0 tag; this is a main-source finding, not an observed failure in published 6.7.0.

Runtime and platform

Node.js v26.12.1; Linux 7.2.8-9-omarchy; x86_64. No native analysis provider or GameMaker runtime was used.

Target and artifact context

Three benign mode-0644 local files with identical bounded GameMaker header fixtures, under Windows, Linux, and macOS-style export paths.

Interface

Other — shared desktop application service, called from TypeScript through tsx.

Earliest failure stage

Capture or observation

Relevant output or evidence

The source-service probe returned:

path                                           families       read_status   files_probed bytes_read coverage
data.win                                       ["gamemaker"]  examined      1            16         complete-within-scan
assets/game.unx                                []             not-selected  0            0          complete-within-scan
Example.app/Contents/Resources/game.ios         []             not-selected  0            0          complete-within-scan

All files had SHA-256 1b3fc3a16261f98b387cb22623faf45716b5a4bd80f9f84b70b7850a31b574ad. The control retained gamemaker-form-header with container: "FORM" and first_chunk: "GEN8". The other two retained no facts or issues. Defaults were max_entries: 20000, max_probe_bytes: 8388608.

Typed outcome or recovery expected

Retain the header fact and a gamemaker candidate for each supported export filename when its bytes pass the existing check.

Analysis or suspected cause

Source-derived cause: probeSelected selects executables and a fixed filename/suffix set containing data.win, but neither game.unx nor game.ios. That prevents these files from reaching the existing FORM/GEN8 byte check.

Additional context

Related but different: #3632 requests deep GameMaker reverse engineering; #4399 implemented desktop runtime triage and is closed. Searches across open and closed issues for GameMaker, game.unx, and game.ios found those proposals, but no report of this selection omission.

Triage assessment

  • Impact level: P2
  • Assessment status: supported
  • Impact basis: The shared desktop operation skips a recognizable engine header solely because of the normal non-executable Linux/macOS data filename, omitting its runtime candidate. The defect is bounded to file selection, with no source modification or data loss observed.
  • Workaround status: available
  • Workaround basis: A byte-identical copy named data.win was inspected successfully and produced the expected GameMaker fact/candidate. This safely recovers family identification in a scratch directory, although the original installation inventory remains incomplete for this signal.
Originally created by @coygeek on GitHub (Oct 23, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/6659 # [Bug] Desktop inspection skips GameMaker game.unx and game.ios data files Labels: `bug`, `triage` ## Before submitting - [x] I searched the open and closed issues for a related report. - [x] I removed credentials, tokens, private paths, and sensitive target data. ## Area Evidence, artifacts, or reconstruction ## Observed behavior Desktop inspection recognizes a bounded `FORM`/`GEN8` header in `data.win`, but does not inspect identical bytes in non-executable `assets/game.unx` or `Example.app/Contents/Resources/game.ios`. Both return `candidates: []`, `read_status: "not-selected"`, no byte ranges, and `coverage.status: "complete-within-scan"` with generous default limits. This was observed through `createDesktopApplicationService().inspect({path})`, the shared application service used by the desktop operation. CLI/MCP transport was not exercised. ## Reproduction 1. Create three separate fixture directories containing, respectively, `data.win`, `assets/game.unx`, and `Example.app/Contents/Resources/game.ios`. Give every file mode `0644` and the same 16 bytes, hex `464f524d0800000047454e3800000000` (`FORM`, little-endian size 8, `GEN8`, little-endian chunk size 0). 2. From this source checkout, invoke `createDesktopApplicationService().inspect({path: fixtureRoot})` once per directory, closing each service afterwards. This is the same reduced header fixture the repository accepts in its [desktop boundary tests](https://github.com/morluto/rea/blob/23def04096869b85c4d3c14a73ed09168483c9f6/tests/boundary/filesystem/desktopApplication.test.ts#L752-L787). 3. Compare the retained file facts and runtime candidates. The probe ran using the repository’s `tsx` source runner. Each case ran once. These are reduced header fixtures, not complete runnable games; the test isolates file selection before decoding. ## Expected behavior Inspect the conventional Linux and macOS GameMaker data filenames and apply the existing bounded header check. The documentation identifies GameMaker from a [bounded FORM container beginning with GEN8](https://github.com/morluto/rea/blob/23def04096869b85c4d3c14a73ed09168483c9f6/docs/desktop-applications.md#L93-L102), without restricting that check to Windows data filenames. `game.unx` is an actual Linux export filename in [GameMaker's own issue tracker](https://github.com/YoYoGames/GameMaker-Bugs/issues/8824). The [UndertaleModTool quick start](https://github.com/UnderminersTeam/UndertaleModTool/blob/master/README.md#quick-start) also names `data.win`, `game.ios`, and `game.unx` as GameMaker data files. ## Impact and scope Runtime-family triage omits the GameMaker candidate for these ordinary non-executable Linux/macOS data-file names. A caller inspecting an unknown installation loses the engine signal even though the existing header parser could recognize it. Scope is file selection, not GML decoding. The macOS layout was tested on Linux; native macOS execution and a complete exported game were not tested. A practical workaround for identifying the family is to inspect a copy of the data file named `data.win` in a scratch directory. The byte-identical `data.win` control produced the expected GameMaker fact and candidate. This does not repair inventory of the original installation. ## REA version Source commit `23def04096869b85c4d3c14a73ed09168483c9f6` (main). The desktop reader files are absent from the fetched `rea-agents-6.7.0` tag; this is a main-source finding, not an observed failure in published 6.7.0. ## Runtime and platform Node.js `v26.12.1`; Linux `7.2.8-9-omarchy`; x86_64. No native analysis provider or GameMaker runtime was used. ## Target and artifact context Three benign mode-0644 local files with identical bounded GameMaker header fixtures, under Windows, Linux, and macOS-style export paths. ## Interface Other — shared desktop application service, called from TypeScript through `tsx`. ## Earliest failure stage Capture or observation ## Relevant output or evidence The source-service probe returned: ```text path families read_status files_probed bytes_read coverage data.win ["gamemaker"] examined 1 16 complete-within-scan assets/game.unx [] not-selected 0 0 complete-within-scan Example.app/Contents/Resources/game.ios [] not-selected 0 0 complete-within-scan ``` All files had SHA-256 `1b3fc3a16261f98b387cb22623faf45716b5a4bd80f9f84b70b7850a31b574ad`. The control retained `gamemaker-form-header` with `container: "FORM"` and `first_chunk: "GEN8"`. The other two retained no facts or issues. Defaults were `max_entries: 20000`, `max_probe_bytes: 8388608`. ## Typed outcome or recovery expected Retain the header fact and a `gamemaker` candidate for each supported export filename when its bytes pass the existing check. ## Analysis or suspected cause Source-derived cause: [`probeSelected`](https://github.com/morluto/rea/blob/23def04096869b85c4d3c14a73ed09168483c9f6/src/artifacts/DesktopApplicationReader.ts#L477-L481) selects executables and a fixed filename/suffix set containing `data.win`, but neither `game.unx` nor `game.ios`. That prevents these files from reaching the [existing FORM/GEN8 byte check](https://github.com/morluto/rea/blob/23def04096869b85c4d3c14a73ed09168483c9f6/src/artifacts/DesktopFileInspection.ts#L125-L144). ## Additional context Related but different: #3632 requests deep GameMaker reverse engineering; #4399 implemented desktop runtime triage and is closed. Searches across open and closed issues for `GameMaker`, `game.unx`, and `game.ios` found those proposals, but no report of this selection omission. ## Triage assessment - Impact level: P2 - Assessment status: supported - Impact basis: The shared desktop operation skips a recognizable engine header solely because of the normal non-executable Linux/macOS data filename, omitting its runtime candidate. The defect is bounded to file selection, with no source modification or data loss observed. - Workaround status: available - Workaround basis: A byte-identical copy named data.win was inspected successfully and produced the expected GameMaker fact/candidate. This safely recovers family identification in a scratch directory, although the original installation inventory remains incomplete for this signal.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
morluto/rea#4038
No description provided.