name: Real Ghidra Windows E2E on: repository_dispatch: types: [real-ghidra-windows] env: HUSKY: "0" # Writes only on the default branch for push, schedule, manual dispatch, # and workflow_call. Pull requests get an empty token and remote read-only mode. TURBO_TOKEN: "${{ (github.ref == format('refs/heads/{0}', github.event.repository.default_branch) && (github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call')) && secrets.TURBO_TOKEN || '' }}" TURBO_TEAM: ${{ vars.TURBO_TEAM }} TURBO_CACHE: "${{ (github.ref == format('refs/heads/{0}', github.event.repository.default_branch) && (github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call')) && 'local:rw,remote:rw' || 'local:rw,remote:r' }}" permissions: contents: read jobs: native-artifact: name: Build matching Windows native artifact if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version-file: .nvmrc - name: Prepare cross compiler run: | for source in /etc/apt/apt-mirrors.txt /etc/apt/sources.list /etc/apt/sources.list.d/ubuntu.sources; do if [ -f "$source" ]; then sudo sed -i 's|azure.archive.ubuntu.com|archive.ubuntu.com|g; s|http://archive.ubuntu.com|https://archive.ubuntu.com|g' "$source" fi done sudo apt-get update sudo apt-get install --no-install-recommends -y g++-mingw-w64-x86-64 - run: npm run build:windows-native - run: npm run verify:windows-native:artifact - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: real-ghidra-windows-native path: native/windows/build/ if-no-files-found: error # The boundary observations need a separate Windows executable, which the # native lane skips when it is absent. Cross-build it here, where MinGW is # already installed, so the proof run observes them too. - name: Build Windows process boundary fixture run: | mkdir -p .cache/windows-process-boundary x86_64-w64-mingw32-g++ -municode -std=c++17 -O2 -static -Wall -Wextra \ -o .cache/windows-process-boundary/process-boundary.exe \ tests/fixtures/windows/processBoundary.cc -ladvapi32 - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: real-ghidra-windows-process-boundary path: .cache/windows-process-boundary/ if-no-files-found: error verify: name: Real Ghidra 12.1.4 Windows x64 PE proof if: github.ref == 'refs/heads/main' needs: native-artifact environment: real-ghidra-windows runs-on: [self-hosted, Windows, x64, ghidra-12-1-2] timeout-minutes: 20 steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version-file: .nvmrc - run: npm ci - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: real-ghidra-windows-native path: native/windows/build/ - run: npm run verify:windows-native:artifact - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: real-ghidra-windows-process-boundary path: .cache/windows-process-boundary/ - run: >- npm run verify:windows-native -- . "${{ github.workspace }}\.cache\windows-process-boundary\process-boundary.exe" - name: Verify all admitted Windows Ghidra operations env: REA_ANALYSIS_PROVIDER: ghidra run: npm run verify:ghidra:windows | Tee-Object -FilePath windows-ghidra-proof.log - name: Verify native x86 Windows Ghidra operations env: REA_ANALYSIS_PROVIDER: ghidra run: npm run verify:ghidra:windows -- --x86 | Tee-Object -FilePath windows-ghidra-x86-proof.log - name: Verify native x64 DLL Windows Ghidra operations env: REA_ANALYSIS_PROVIDER: ghidra run: npm run verify:ghidra:windows -- --dll | Tee-Object -FilePath windows-ghidra-dll-proof.log - name: Verify native x86 DLL Windows Ghidra operations env: REA_ANALYSIS_PROVIDER: ghidra run: npm run verify:ghidra:windows -- --x86 --dll | Tee-Object -FilePath windows-ghidra-x86-dll-proof.log - name: Verify ordinary-user CLI and MCP operations env: REA_ANALYSIS_PROVIDER: ghidra run: npm run verify:ghidra:windows:package | Tee-Object -FilePath windows-ghidra-package-proof.log - name: Verify ordinary-user x86 CLI and MCP operations env: REA_ANALYSIS_PROVIDER: ghidra run: npm run verify:ghidra:windows:package -- --x86 | Tee-Object -FilePath windows-ghidra-x86-package-proof.log - name: Verify ordinary-user x64 DLL CLI and MCP operations env: REA_ANALYSIS_PROVIDER: ghidra run: npm run verify:ghidra:windows:package -- --dll | Tee-Object -FilePath windows-ghidra-dll-package-proof.log - name: Verify ordinary-user x86 DLL CLI and MCP operations env: REA_ANALYSIS_PROVIDER: ghidra run: npm run verify:ghidra:windows:package -- --x86 --dll | Tee-Object -FilePath windows-ghidra-x86-dll-package-proof.log - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: always() with: name: windows-ghidra-proof path: | windows-ghidra-proof.log windows-ghidra-package-proof.log windows-ghidra-x86-proof.log windows-ghidra-x86-package-proof.log windows-ghidra-dll-proof.log windows-ghidra-x86-dll-proof.log windows-ghidra-dll-package-proof.log windows-ghidra-x86-dll-package-proof.log retention-days: 30