Add source
This commit is contained in:
22
BadBuilder.sln
Normal file
22
BadBuilder.sln
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.12.35707.178 d17.12
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BadBuilder", "BadBuilder\BadBuilder.csproj", "{654D211A-668A-4BA4-8BD4-174A11666A3B}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{654D211A-668A-4BA4-8BD4-174A11666A3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{654D211A-668A-4BA4-8BD4-174A11666A3B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{654D211A-668A-4BA4-8BD4-174A11666A3B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{654D211A-668A-4BA4-8BD4-174A11666A3B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
25
BadBuilder/BadBuilder.csproj
Normal file
25
BadBuilder/BadBuilder.csproj
Normal file
@@ -0,0 +1,25 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<PublishSingleFile>true</PublishSingleFile>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="fat32format.exe" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Tools\fat32format.exe" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Spectre.Console" Version="0.49.1" />
|
||||
<PackageReference Include="System.Management" Version="9.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
52
BadBuilder/ConsoleExperiences/DiskMenu.cs
Normal file
52
BadBuilder/ConsoleExperiences/DiskMenu.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
using Spectre.Console;
|
||||
using BadBuilder.Models;
|
||||
using BadBuilder.Helpers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BadBuilder
|
||||
{
|
||||
internal partial class Program
|
||||
{
|
||||
static string PromptForDiskSelection(List<DiskInfo> disks)
|
||||
{
|
||||
var choices = new List<string>();
|
||||
foreach (var disk in disks)
|
||||
choices.Add($"{disk.DriveLetter} ({disk.SizeFormatted}) - {disk.Type}");
|
||||
|
||||
return AnsiConsole.Prompt(
|
||||
new SelectionPrompt<string>()
|
||||
.Title("Select a disk to format:")
|
||||
.HighlightStyle(GreenStyle)
|
||||
.AddChoices(choices)
|
||||
);
|
||||
}
|
||||
|
||||
static bool PromptFormatConfirmation(string selectedDisk)
|
||||
{
|
||||
return AnsiConsole.Prompt(
|
||||
new TextPrompt<bool>($"[#FF7200 bold]WARNING: [/]Are you sure you would like to format [bold]{selectedDisk.Substring(0, 3)}[/]? All data on this drive will be lost.")
|
||||
.AddChoice(true)
|
||||
.AddChoice(false)
|
||||
.DefaultValue(false)
|
||||
.ChoicesStyle(GreenStyle)
|
||||
.DefaultValueStyle(OrangeStyle)
|
||||
.WithConverter(choice => choice ? "y" : "n")
|
||||
);
|
||||
}
|
||||
|
||||
static async Task FormatDisk(List<DiskInfo> disks, string selectedDisk)
|
||||
{
|
||||
int diskIndex = disks.FindIndex(disk => $"{disk.DriveLetter} ({disk.SizeFormatted}) - {disk.Type}" == selectedDisk);
|
||||
|
||||
await AnsiConsole.Status().StartAsync($"[#76B900]Formatting disk[/] {selectedDisk}", async ctx =>
|
||||
{
|
||||
if (diskIndex == -1) return;
|
||||
await DiskHelper.FormatDisk(disks[diskIndex]);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
52
BadBuilder/Helpers/DiskHelper.cs
Normal file
52
BadBuilder/Helpers/DiskHelper.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
using BadBuilder.Models;
|
||||
using System.Diagnostics;
|
||||
using System.Management;
|
||||
|
||||
namespace BadBuilder.Helpers
|
||||
{
|
||||
internal static class DiskHelper
|
||||
{
|
||||
public static List<DiskInfo> GetDisks()
|
||||
{
|
||||
var disks = new List<DiskInfo>();
|
||||
|
||||
foreach (DriveInfo drive in DriveInfo.GetDrives())
|
||||
{
|
||||
if (drive.IsReady)
|
||||
{
|
||||
string driveLetter = drive.Name;
|
||||
string volumeLabel = drive.VolumeLabel;
|
||||
string type = drive.DriveType.ToString();
|
||||
long totalSize = drive.TotalSize;
|
||||
long availableFreeSpace = drive.AvailableFreeSpace;
|
||||
int diskNumber = 2;
|
||||
|
||||
disks.Add(new DiskInfo(driveLetter, type, totalSize, volumeLabel, availableFreeSpace, diskNumber));
|
||||
}
|
||||
}
|
||||
|
||||
return disks;
|
||||
}
|
||||
|
||||
internal static async Task FormatDisk(DiskInfo disk)
|
||||
{
|
||||
ResourceHelper.ExtractEmbeddedBinary("fat32format.exe");
|
||||
|
||||
Process process = new Process
|
||||
{
|
||||
StartInfo = new ProcessStartInfo
|
||||
{
|
||||
FileName = @"fat32format.exe",
|
||||
Arguments = $"-c64 {disk.DriveLetter}",
|
||||
RedirectStandardOutput = false,
|
||||
RedirectStandardError = false,
|
||||
UseShellExecute = false,
|
||||
CreateNoWindow = true
|
||||
}
|
||||
};
|
||||
|
||||
process.Start();
|
||||
await process.WaitForExitAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
47
BadBuilder/Helpers/DownloadHelper.cs
Normal file
47
BadBuilder/Helpers/DownloadHelper.cs
Normal file
@@ -0,0 +1,47 @@
|
||||
using Spectre.Console;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BadBuilder.Helpers
|
||||
{
|
||||
internal static class DownloadHelper
|
||||
{
|
||||
internal static async Task DownloadFile(HttpClient client, ProgressTask task, string url)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (HttpResponseMessage response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead))
|
||||
{
|
||||
response.EnsureSuccessStatusCode();
|
||||
|
||||
task.MaxValue(response.Content.Headers.ContentLength ?? 0);
|
||||
task.StartTask();
|
||||
|
||||
string filename = url.Substring(url.LastIndexOf('/') + 1);
|
||||
|
||||
using (var contentStream = await response.Content.ReadAsStreamAsync())
|
||||
using (var fileStream = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None, 8192, true))
|
||||
{
|
||||
var buffer = new byte[8192];
|
||||
while (true)
|
||||
{
|
||||
var read = await contentStream.ReadAsync(buffer, 0, buffer.Length);
|
||||
if (read == 0)
|
||||
break;
|
||||
|
||||
task.Increment(read);
|
||||
await fileStream.WriteAsync(buffer, 0, read);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AnsiConsole.MarkupLine($"[red]Error downloading:[/] {ex}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
26
BadBuilder/Helpers/ResourceHelper.cs
Normal file
26
BadBuilder/Helpers/ResourceHelper.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BadBuilder.Helpers
|
||||
{
|
||||
internal static class ResourceHelper
|
||||
{
|
||||
internal static void ExtractEmbeddedBinary(string resourceName)
|
||||
{
|
||||
var assembly = Assembly.GetExecutingAssembly();
|
||||
string fullResourceName = $"BadBuilder.Tools.{resourceName}";
|
||||
|
||||
using (Stream resourceStream = assembly.GetManifestResourceStream(fullResourceName))
|
||||
{
|
||||
if (resourceStream == null) return;
|
||||
|
||||
using (FileStream fileStream = new FileStream($@"{resourceName}", FileMode.Create, FileAccess.Write))
|
||||
resourceStream.CopyTo(fileStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
40
BadBuilder/Models/DiskInfo.cs
Normal file
40
BadBuilder/Models/DiskInfo.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
namespace BadBuilder.Models
|
||||
{
|
||||
internal class DiskInfo
|
||||
{
|
||||
internal string DriveLetter { get; init; }
|
||||
internal string VolumeLabel { get; init; }
|
||||
internal int DiskNumber { get; init; }
|
||||
|
||||
internal string Type { get; init; }
|
||||
internal string SizeFormatted { get; init; }
|
||||
internal long TotalSize { get; init; }
|
||||
internal long AvailableFreeSpace { get; init; }
|
||||
|
||||
internal DiskInfo(string driveLetter, string type, long totalSize, string volumeLabel, long availableFreeSpace, int diskNumber)
|
||||
{
|
||||
DriveLetter = driveLetter;
|
||||
VolumeLabel = volumeLabel;
|
||||
DiskNumber = diskNumber;
|
||||
|
||||
Type = type;
|
||||
SizeFormatted = FormatSize(totalSize);
|
||||
TotalSize = totalSize;
|
||||
AvailableFreeSpace = availableFreeSpace;
|
||||
}
|
||||
|
||||
private static string FormatSize(long bytes)
|
||||
{
|
||||
const double KB = 1024.0;
|
||||
const double MB = KB * 1024;
|
||||
const double GB = MB * 1024;
|
||||
const double TB = GB * 1024;
|
||||
|
||||
if (bytes >= TB) return $"{bytes / TB:F2} TB";
|
||||
if (bytes >= GB) return $"{bytes / GB:F2} GB";
|
||||
if (bytes >= MB) return $"{bytes / MB:F2} MB";
|
||||
if (bytes >= KB) return $"{bytes / KB:F2} KB";
|
||||
return $"{bytes} bytes";
|
||||
}
|
||||
}
|
||||
}
|
||||
93
BadBuilder/Program.cs
Normal file
93
BadBuilder/Program.cs
Normal file
@@ -0,0 +1,93 @@
|
||||
using Spectre.Console;
|
||||
using BadBuilder.Models;
|
||||
using BadBuilder.Helpers;
|
||||
|
||||
namespace BadBuilder
|
||||
{
|
||||
internal partial class Program
|
||||
{
|
||||
static readonly Style OrangeStyle = new Style(new Color(255, 114, 0));
|
||||
static readonly Style GreenStyle = new Style(new Color(118, 185, 0));
|
||||
static readonly Style GrayStyle = new Style(new Color(132, 133, 137));
|
||||
|
||||
static void Main(string[] args)
|
||||
{
|
||||
ShowWelcomeMessage();
|
||||
|
||||
while (true)
|
||||
{
|
||||
Console.WriteLine();
|
||||
string action = PromptForAction();
|
||||
|
||||
if (action == "Exit") Environment.Exit(0);
|
||||
|
||||
List<DiskInfo> disks = DiskHelper.GetDisks();
|
||||
string selectedDisk = PromptForDiskSelection(disks);
|
||||
|
||||
bool confirmation = PromptFormatConfirmation(selectedDisk);
|
||||
if (confirmation)
|
||||
{
|
||||
FormatDisk(disks, selectedDisk).Wait();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Console.WriteLine();
|
||||
|
||||
var items = new (string name, string url)[]
|
||||
{
|
||||
("rbblitz", "https://download.digiex.net/Consoles/Xbox360/Arcade-games/RBBlitz.zip"),
|
||||
("BadUpdate", "https://github.com/grimdoomer/Xbox360BadUpdate/releases/download/v1.1/Xbox360BadUpdate-Retail-USB-v1.1.zip"),
|
||||
("BadUpdate Tools", "https://github.com/grimdoomer/Xbox360BadUpdate/releases/download/v1.1/Tools.zip"),
|
||||
("FreeMyXe", "https://github.com/FreeMyXe/FreeMyXe/releases/download/beta4/FreeMyXe-beta4.zip")
|
||||
};
|
||||
|
||||
HttpClient client = new();
|
||||
|
||||
AnsiConsole.Progress()
|
||||
.Columns(
|
||||
[
|
||||
new TaskDescriptionColumn(),
|
||||
new ProgressBarColumn().FinishedStyle(GreenStyle),
|
||||
new PercentageColumn().CompletedStyle(GreenStyle),
|
||||
new RemainingTimeColumn().Style(GrayStyle),
|
||||
new SpinnerColumn(Spinner.Known.Dots12).Style(OrangeStyle)
|
||||
])
|
||||
.StartAsync(async ctx =>
|
||||
{
|
||||
await Task.WhenAll(items.Select(async item =>
|
||||
{
|
||||
var task = ctx.AddTask(item.name, new ProgressTaskSettings { AutoStart = false});
|
||||
await DownloadHelper.DownloadFile(client, task, item.url);
|
||||
}));
|
||||
}).Wait();
|
||||
|
||||
Console.WriteLine("Download completed!");
|
||||
}
|
||||
|
||||
static void ShowWelcomeMessage() => AnsiConsole.Markup(
|
||||
"""
|
||||
[#107c10]██████╗ █████╗ ██████╗ ██████╗ ██╗ ██╗██╗██╗ ██████╗ ███████╗██████╗[/]
|
||||
[#2ca243]██╔══██╗██╔══██╗██╔══██╗██╔══██╗██║ ██║██║██║ ██╔══██╗██╔════╝██╔══██╗[/]
|
||||
[#76B900]██████╔╝███████║██║ ██║██████╔╝██║ ██║██║██║ ██║ ██║█████╗ ██████╔╝[/]
|
||||
[#92C83E]██╔══██╗██╔══██║██║ ██║██╔══██╗██║ ██║██║██║ ██║ ██║██╔══╝ ██╔══██╗[/]
|
||||
[#a1d156]██████╔╝██║ ██║██████╔╝██████╔╝╚██████╔╝██║███████╗██████╔╝███████╗██║ ██║[/]
|
||||
[#a1d156]╚═════╝ ╚═╝ ╚═╝╚═════╝ ╚═════╝ ╚═════╝ ╚═╝╚══════╝╚═════╝ ╚══════╝╚═╝ ╚═╝[/]
|
||||
|
||||
[#76B900]────────────────────────────────────────────────────────────────────────────[/]
|
||||
Xbox 360 [#FF7200]BadUpdate[/] USB Builder
|
||||
[#848589]Created by Pdawg[/]
|
||||
[#76B900]────────────────────────────────────────────────────────────────────────────[/]
|
||||
|
||||
""");
|
||||
|
||||
static string PromptForAction() => AnsiConsole.Prompt(
|
||||
new SelectionPrompt<string>()
|
||||
.HighlightStyle(GreenStyle)
|
||||
.AddChoices(
|
||||
"Build exploit USB",
|
||||
"Exit"
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
BIN
BadBuilder/Tools/fat32format.exe
Normal file
BIN
BadBuilder/Tools/fat32format.exe
Normal file
Binary file not shown.
7
LICENSE
7
LICENSE
@@ -1,6 +1,7 @@
|
||||
BSD 2-Clause License
|
||||
BSD 3-Clause License
|
||||
|
||||
Copyright (c) 2025, Pdawg11239
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
@@ -12,6 +13,10 @@ modification, are permitted provided that the following conditions are met:
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
|
||||
Reference in New Issue
Block a user