Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions BadBuilder.Tests/GitHubAndDownloadTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,26 @@ public void ReleaseSelection_UsesLatestStableAndCanIncludePrerelease()
Assert.Equal("preview", selectedPreview.TagName);
}


[Fact]
public void Catalog_ABadAvatar13Beta_IsPinnedToExpectedReleaseAndDigest()
{
ArtifactDefinition artifact = ArtifactCatalog.Exploits[ExploitOption.ABadAvatar13Beta];
GitHubReleaseSource source = Assert.IsType<GitHubReleaseSource>(artifact.Source);

Assert.Equal("ABadAvatar 1.3 Beta", artifact.DisplayName);
Assert.Equal("bibarub", source.Owner);
Assert.Equal("Xbox360BadUpdate", source.Repo);
Assert.Equal("ABadAvatar_v1.3-beta.zip", source.AssetPattern);
Assert.Equal(ReleaseSelectionPolicy.ExactTag, source.ReleasePolicy);
Assert.Equal("avatar-v1.3-beta", source.ReleaseTag);
Assert.Equal(
"A94E0948A5F10AA288BA3A5909B55F90AE56C3CFA628B9D429E178737A0F1E35",
source.PinnedSHA256);
Assert.Contains("BadUpdatePayload", artifact.Layout?.RequiredPaths ?? []);
Assert.Contains("Content", artifact.Layout?.RequiredPaths ?? []);
}

[Fact]
public void AssetSelection_RequiresExactlyOneGlobMatch()
{
Expand Down
2 changes: 1 addition & 1 deletion BadBuilder/BadBuilder.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<NuGetAuditMode>all</NuGetAuditMode>
<NuGetAuditLevel>low</NuGetAuditLevel>
<AnalysisLevel>latest-recommended</AnalysisLevel>
<VersionPrefix>2.1.1</VersionPrefix>
<VersionPrefix>2.2.0</VersionPrefix>
<RuntimeIdentifiers>win-x64;linux-x64</RuntimeIdentifiers>
<PublishSingleFile Condition="'$(RuntimeIdentifier)' != ''">true</PublishSingleFile>
<SelfContained Condition="'$(RuntimeIdentifier)' != ''">true</SelfContained>
Expand Down
17 changes: 17 additions & 0 deletions BadBuilder/Configuration/ArtifactCatalog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,23 @@ internal static class ArtifactCatalog
ArtifactPriority.Exploit,
Layout: new ArchiveLayout(["BadUpdatePayload"])
),
[ExploitOption.ABadAvatar13Beta] = new
(
"exploit-abadavatar-1-3-beta",
"ABadAvatar 1.3 Beta",
"ABadAvatar rebased on BadUpdate 1.3 for much faster and more reliable execution; still beta",
"exploit",
new GitHubReleaseSource(
"bibarub",
"Xbox360BadUpdate",
"ABadAvatar_v1.3-beta.zip",
ReleaseSelectionPolicy.ExactTag,
"avatar-v1.3-beta",
"A94E0948A5F10AA288BA3A5909B55F90AE56C3CFA628B9D429E178737A0F1E35"),
[ new InstallOperation(InstallOperationKind.CopyDirectory, ".", ".") ],
ArtifactPriority.Exploit,
Layout: new ArchiveLayout(["BadUpdatePayload", "Content"])
),
[ExploitOption.BadUpdate] = new
(
"exploit-badupdate",
Expand Down
1 change: 1 addition & 0 deletions BadBuilder/Configuration/Models.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
internal enum ExploitOption
{
ABadAvatar,
ABadAvatar13Beta,
BadUpdate,
}

Expand Down
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,16 @@ Do not run `sudo ./BadBuilder`. Interactive root launches are refused.
## Using BadBuilder

1. Open **Target drive** and choose the USB device. Fixed and protected disks are not shown.
2. Select BadUpdate or ABadAvatar, a post-exploit bootstrap, and any desired homebrew. Dashboard Update is a separate install mode for official `2.0.17559.0` update files.
2. Select BadUpdate, ABadAvatar Public Beta, or the pinned ABadAvatar 1.3 Beta build, then choose a post-exploit bootstrap and any desired homebrew. Dashboard Update is a separate install mode for official `2.0.17559.0` update files.
3. Choose **Install**. BadBuilder resolves releases, verifies or explicitly approves hashes, extracts into a unique temporary run directory, validates layouts, and builds the complete copy plan.
4. Review the displayed path, model, byte size, and serial/WWN. Type the exact device path to authorize formatting.
5. Wait for the success message. Linux automatically flushes and unmounts the USB. Windows leaves its assigned drive letter in place for normal eject.

Expected disk, network, cache, and archive errors are shown as actionable messages and return to the menu. Detailed stack traces are written only to the per-user diagnostic log.

> [!WARNING]
> ABadAvatar 1.3 Beta is still a prerelease. Disconnect the Xbox 360 from both Ethernet and Wi-Fi before triggering it. Its release notes also warn that a connected Kinect can significantly reduce the exploit success rate.

## Storage locations

Persistent downloads and their manifests live in the user cache:
Expand All @@ -52,7 +55,7 @@ Transient extraction uses a unique directory below the operating-system temporar

## Download integrity

GitHub release sources use an exact asset glob and an explicit release policy. Drafts are never selected; ABadAvatar may use its newest prerelease, while other moving sources use the newest stable release. Zero or multiple matching assets are errors. GitHub's per-asset `digest` metadata and catalog-pinned SHA-256 values are treated as trusted and enforced strictly.
GitHub release sources use an exact asset glob and an explicit release policy. Drafts are never selected; the original ABadAvatar entry may use its newest prerelease, while ABadAvatar 1.3 Beta is pinned to the exact `avatar-v1.3-beta` release and SHA-256. Other moving sources use the newest stable release. Zero or multiple matching assets are errors. GitHub's per-asset `digest` metadata and catalog-pinned SHA-256 values are treated as trusted and enforced strictly.

When a trusted checksum is unavailable, BadBuilder displays the source, release, asset, and computed SHA-256 and asks for explicit approval. The approved bytes are recorded in the cache manifest; changed bytes trigger a new warning. Downloads stream into a partial file, verify their length and hash, and replace a cache entry only after success. A failed download cannot overwrite a valid cached archive.

Expand Down Expand Up @@ -86,6 +89,7 @@ If release metadata is unavailable and no valid cache exists, BadBuilder asks fo
- Pdawg11239 / [Pdawg-bytes](https://github.com/Pdawg-bytes/BadBuilder) — original BadBuilder project
- Grimdoomer — [BadUpdate](https://github.com/grimdoomer/Xbox360BadUpdate)
- Shutterbug2000 — [ABadAvatar](https://github.com/shutterbug2000/ABadAvatar)
- Bibarub — [ABadAvatar 1.3 Beta](https://github.com/bibarub/Xbox360BadUpdate/releases/tag/avatar-v1.3-beta)
- FreeMyXe Team / InvoxiPlayGames — [FreeMyXe](https://github.com/FreeMyXe/FreeMyXe)
- Byrom90 — [XeUnshackle](https://github.com/Byrom90/XeUnshackle)
- Swizzy — Simple 360 NAND Flasher
Expand Down
Loading