mirror of
https://github.com/lordfriky/web-cfw-loader.git
synced 2024-12-28 16:11:55 +00:00
New localization system. Not very elegant but works.
This commit is contained in:
parent
bdeaa5d7f0
commit
fe5486bf73
@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018 atlas44
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@ -1,14 +0,0 @@
|
||||
# web-cfw-loader
|
||||
Fusee Launcher, in a browser!
|
||||
|
||||
# Description
|
||||
This is a port of [fusee-launcher](https://github.com/reswitched/fusee-launcher) to JavaScript using WebUSB. This has been mildly tested and appears to work on Linux, Android (unrooted), OSX and ChromeOS. Today, this only works on Chrome because only Chrome implements WebUSB. It also does NOT work on Windows because the WebUSB Windows implementation does not allow sending the required USB packet.
|
||||
|
||||
# Forked
|
||||
This is also a fork of [web-fusee-launcher](https://github.com/atlas44/web-fusee-launcher), which I fixed up a bit, added hekate 5 and 4, and did some CSS stuff.
|
||||
|
||||
# Instant CFW Payload
|
||||
This site uses a payload made by me that instantly boots CFW with hekate. you can find it [here](https://github.com/ElijahZAwesome/hekate-ipl-instant-boot-edition).
|
||||
|
||||
# Try it out
|
||||
Either use a web server to host the files (must be on https!) or you can try the [demo](https://elijahzawesome.github.io/web-cfw-loader/).
|
Binary file not shown.
Before Width: | Height: | Size: 18 KiB |
158
de_DE/index.html
158
de_DE/index.html
@ -1,158 +0,0 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||
<link href="favicon.png" rel="icon" type="image/x-icon" />
|
||||
<title>Switch Payload Loader v1.3</title>
|
||||
|
||||
<!-- JQuery: needed for some Bootstrap Components -->
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
|
||||
|
||||
<!-- Bootstrap 3 framework -->
|
||||
<!-- Latest compiled and minified CSS -->
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
|
||||
<!-- Optional theme -->
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
|
||||
<!-- Latest compiled and minified JavaScript -->
|
||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
|
||||
|
||||
</head>
|
||||
|
||||
<body class="container-fluid">
|
||||
<div class="row" id="title">
|
||||
<h1>Nintendo Switch Payload Lader</h1>
|
||||
<h4>Fusee Launcher portiert zu JavaScript mit der Hilfe von WebUSB.</h4>
|
||||
</div>
|
||||
|
||||
<div class="row margin-top-md">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
<div class="btn-group" role="group" aria-label="...">
|
||||
<a class="btn btn-info" href="../index.html">English</a>
|
||||
<a class="btn btn-info" href="../it_IT/index.html">Italiano</a>
|
||||
<a class="btn btn-info" href="../pt_BR/index.html">Português</a>
|
||||
<a class="btn btn-info disabled" href="#">Deutsch</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="row margin-top-md" id="infodiv">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
|
||||
<div class="alert alert-danger" role="alert">
|
||||
<p>Aus irgendeinem Grund funktionieren hochgeladene Payloads nicht. Ich versuche zurzeit dies zu reparieren.</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-danger" role="alert">
|
||||
<p>Es wurde einigermaßen getestet. Auch wenn bisher keine Fehler gefunden wurden, bin ich nicht schuldig, falls es zu Problemen kommt!</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<p>Dies funktioniert nicht auf Windows durch Probleme mit Chrome und WebUSB (und wahrscheinlich anderen Gründen!)</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<p>Dies funktioniert bisher mit keinem Browser AUßER Chrome! Das liegt daran, dass die anderen Browser WebUSB nicht supporten!</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<p>In Linux können Sie einen "Zugriff abgelehnt" Fehler bekommen! Falls Sie dieses Problem haben, können Sie eine Datei unter: <code>/etc/udev/rules.d/50-switch.rules</code>mit dem folgenden Inhalt:<br><code>SUBSYSTEM==\"usb\", ATTR{idVendor}==\"0955\", MODE=\"0664\", GROUP=\"plugdev\"</code>erstellen.</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<p>Tests ergeben, dass es zurzeit auf Linux, OSX, Android (unrooted) und Chromebooks funktioniert. Ihr Ergebnis kann variieren.</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info" role="alert">
|
||||
<h4>Anleitung:</h4>
|
||||
<ul>
|
||||
<li>Setzen Sie die Switch in den RCM und verbinden Sie es mit ihrem Gerät.</li>
|
||||
<li>Wählen Sie entweder einer der vorliegenden Payloads oder laden Sie Ihr eigenes Payload hoch.</li>
|
||||
<li>Drücken Sie: "Payload senden"</li>
|
||||
<li>Auf dem Erlaubnisbildschirm müssen Sie "APX" auswählen und zustimmen.</li>
|
||||
<li>Falls alles richtig läuft, sollte das Payload gesendet sein!</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="class=col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
<h1>Konfiguration des Payloadversandes</h1>
|
||||
|
||||
<form id="mainForm">
|
||||
<div class="row">
|
||||
<div class="col-xs-6">
|
||||
<h4>Wähle Payload:</h4>
|
||||
</div>
|
||||
|
||||
<div class="col-xs-6">
|
||||
<select class="pull-right" id="payloadSelect" onchange="onSelectChange()">
|
||||
<option value="instaboot">Boote die CFW direkt (5.0.x)</option>
|
||||
<option value="hekate v5">Hekate für 5.0.x Switches</option>
|
||||
<option value="hekate v4">Hekate für 4.0.x Switches</option>
|
||||
<option value="fusee">(Re)Switched Test Payload (fusee)</option>
|
||||
<option value="uploaded">Eigenes Payload hochladen</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" id="uploadContainer" style="display: none">
|
||||
<div class="row-xs-12">
|
||||
<input style="float: right" type="file" id="payloadUpload" accept=".bin"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row divider-line"></div>
|
||||
|
||||
<div class="row margin-top-md">
|
||||
<div class="col-xs-10">
|
||||
<h4>Erhalte Payload Byte-Array (nicht senden)</h4>
|
||||
</div>
|
||||
<div class="col-xs-2">
|
||||
<input class="pull-right" type="checkbox" name="shouldDebug" id="shouldDebug">
|
||||
</div>
|
||||
</div>
|
||||
<div class="row divider-line"></div>
|
||||
</form>
|
||||
|
||||
<div class="row margin-top-md">
|
||||
<div class="col-xs-12">
|
||||
<button class="btn btn-primary btn-lg pull-right" id="goButton">Sende Payload!</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="class=col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
<h3>Protokoll:</h3>
|
||||
<div id="output"></div>
|
||||
<button class="btn btn-primary pull-right margin-top-md" id="clearlogsbutton" onclick="clearLog();">Clear Logs</button><br><br>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script src="./payloads.js"></script>
|
||||
<script src="./main.js"></script>
|
||||
</body>
|
||||
|
||||
<div class="row margin-top-md" id="page-footer">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
<div id="disclaimer">
|
||||
<p>Der Quellcode kann hier gefunden werden: <a href="https://github.com/ElijahZAwesome/web-cfw-loader/">GitHub</a> (oder indem man sich den Quellcode direkt ankuckt, da kein Backend existiert!).</p>
|
||||
<p>Portiert von <a href="https://github.com/reswitched/fusee-launcher">fusee-launcher</a>.</p>
|
||||
<p>Danke an ktemkin und ReSwitched, aber auch <br><a href="https://atlas44.s3-us-west-2.amazonaws.com/web-fusee-launcher/index.html">Atlas44 und seine Webseite</a>, als einen Startpunkt für dieses Projekt. </p>
|
||||
<p>Zuletzt danke an <a href="https://github.com/falquinho">falquinho</a> für sein Bootstraplayout und Übersetzung in Portugiesisch, <a href="https://github.com/Filo97">Filo97</a> für die italienische Übersetzung und <a href="https://github.com/tumGER"> tumGER </a>für seine deutsche Übersetzung!.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</html>
|
204
de_DE/main.js
204
de_DE/main.js
@ -1,204 +0,0 @@
|
||||
const intermezzo = new Uint8Array([
|
||||
0x44, 0x00, 0x9F, 0xE5, 0x01, 0x11, 0xA0, 0xE3, 0x40, 0x20, 0x9F, 0xE5, 0x00, 0x20, 0x42, 0xE0,
|
||||
0x08, 0x00, 0x00, 0xEB, 0x01, 0x01, 0xA0, 0xE3, 0x10, 0xFF, 0x2F, 0xE1, 0x00, 0x00, 0xA0, 0xE1,
|
||||
0x2C, 0x00, 0x9F, 0xE5, 0x2C, 0x10, 0x9F, 0xE5, 0x02, 0x28, 0xA0, 0xE3, 0x01, 0x00, 0x00, 0xEB,
|
||||
0x20, 0x00, 0x9F, 0xE5, 0x10, 0xFF, 0x2F, 0xE1, 0x04, 0x30, 0x90, 0xE4, 0x04, 0x30, 0x81, 0xE4,
|
||||
0x04, 0x20, 0x52, 0xE2, 0xFB, 0xFF, 0xFF, 0x1A, 0x1E, 0xFF, 0x2F, 0xE1, 0x20, 0xF0, 0x01, 0x40,
|
||||
0x5C, 0xF0, 0x01, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x01, 0x40
|
||||
]);
|
||||
|
||||
|
||||
|
||||
const RCM_PAYLOAD_ADDRESS = 0x40010000;
|
||||
const INTERMEZZO_LOCATION = 0x4001F000;
|
||||
const PAYLOAD_LOAD_BLOCK = 0x40020000;
|
||||
|
||||
|
||||
|
||||
function createRCMPayload(intermezzo, payload) {
|
||||
const rcmLength = 0x30298;
|
||||
|
||||
const intermezzoAddressRepeatCount = (INTERMEZZO_LOCATION - RCM_PAYLOAD_ADDRESS) / 4;
|
||||
|
||||
const rcmPayloadSize = Math.ceil((0x2A8 + (0x4 * intermezzoAddressRepeatCount) + 0x1000 + payload.byteLength) / 0x1000) * 0x1000;
|
||||
|
||||
const rcmPayload = new Uint8Array(new ArrayBuffer(rcmPayloadSize))
|
||||
const rcmPayloadView = new DataView(rcmPayload.buffer);
|
||||
|
||||
rcmPayloadView.setUint32(0x0, rcmLength, true);
|
||||
|
||||
for (let i = 0; i < intermezzoAddressRepeatCount; i++) {
|
||||
rcmPayloadView.setUint32(0x2A8 + i * 4, INTERMEZZO_LOCATION, true);
|
||||
}
|
||||
|
||||
rcmPayload.set(intermezzo, 0x2A8 + (0x4 * intermezzoAddressRepeatCount));
|
||||
rcmPayload.set(payload, 0x2A8 + (0x4 * intermezzoAddressRepeatCount) + 0x1000);
|
||||
|
||||
return rcmPayload;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function bufferToHex(data) {
|
||||
let result = "";
|
||||
for (let i = 0; i < data.byteLength; i++)
|
||||
result += data.getUint8(i).toString(16).padStart(2, "0");
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
async function write(device, data) {
|
||||
let length = data.length;
|
||||
let writeCount = 0;
|
||||
const packetSize = 0x1000;
|
||||
|
||||
while (length) {
|
||||
const dataToTransmit = Math.min(length, packetSize);
|
||||
length -= dataToTransmit;
|
||||
|
||||
const chunk = data.slice(0, dataToTransmit);
|
||||
data = data.slice(dataToTransmit);
|
||||
await device.transferOut(1, chunk);
|
||||
writeCount++;
|
||||
}
|
||||
|
||||
return writeCount;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function readFileAsArrayBuffer(file) {
|
||||
return new Promise((res, rej) => {
|
||||
const reader = new FileReader();
|
||||
reader.onload = e => {
|
||||
res(e.target.result);
|
||||
}
|
||||
reader.readAsArrayBuffer(file);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
function logOutput(...message) {
|
||||
document.getElementById("output").innerHTML = document.getElementById("output").innerHTML + message.join(" ") + "<br>";
|
||||
}
|
||||
|
||||
|
||||
|
||||
function clearLog() {
|
||||
document.getElementById("output").innerHTML = "";
|
||||
}
|
||||
|
||||
|
||||
|
||||
let device;
|
||||
|
||||
|
||||
|
||||
async function launchPayload(payload) {
|
||||
await device.open();
|
||||
logOutput(`Verbunden mit ${device.manufacturerName} ${device.productName}`);
|
||||
|
||||
await device.claimInterface(0);
|
||||
|
||||
const deviceID = await device.transferIn(1, 16);
|
||||
logOutput(`Geräte ID: ${bufferToHex(deviceID.data)}`);
|
||||
|
||||
const rcmPayload = createRCMPayload(intermezzo, payload);
|
||||
logOutput("Sende das Payload...");
|
||||
const writeCount = await write(device, rcmPayload);
|
||||
logOutput("Payload wurde gesendet!");
|
||||
|
||||
if (writeCount % 2 !== 1) {
|
||||
logOutput("Wechsele zu einem größeren Puffer...");
|
||||
await device.transferOut(1, new ArrayBuffer(0x1000));
|
||||
}
|
||||
|
||||
logOutput("Schwachstelle wird ausgelöst...");
|
||||
const vulnerabilityLength = 0x7000;
|
||||
const smash = await device.controlTransferIn({
|
||||
requestType: 'standard',
|
||||
recipient: 'interface',
|
||||
request: 0x00,
|
||||
value: 0x00,
|
||||
index: 0x00
|
||||
}, vulnerabilityLength);
|
||||
}
|
||||
|
||||
|
||||
|
||||
document.getElementById("goButton").addEventListener("click", async () => {
|
||||
clearLog();
|
||||
var debugCheckbox = document.getElementById("shouldDebug");
|
||||
const payloadType = document.getElementById("payloadSelect").value;
|
||||
|
||||
let payload;
|
||||
if (payloadType === "hekate v5") {
|
||||
payload = hekate5;
|
||||
|
||||
} else if (payloadType === "hekate v4") {
|
||||
payload = hekate4;
|
||||
|
||||
} else if (payloadType === "fusee") {
|
||||
payload = fusee;
|
||||
|
||||
} else if (payloadType === "instaboot") {
|
||||
payload = instaboot;
|
||||
|
||||
} else if (payloadType === "uploaded") {
|
||||
const file = document.getElementById("payloadUpload").files[0];
|
||||
if (!file) {
|
||||
alert("Du musst eine Datei hochladen, um einen eigenen Payload zu nutzen");
|
||||
return;
|
||||
}
|
||||
logOutput("Nutze das hochgeladene Payload: \"" + file.name + "\"");
|
||||
payload = new Uint8Array(await readFileAsArrayBuffer(file));
|
||||
} else {
|
||||
logOutput("<span style='color:red'>Du versuchst eine Payload-Art zu nutzen, die nicht existiert!</span>");
|
||||
return;
|
||||
}
|
||||
|
||||
if(debugCheckbox.checked) {
|
||||
logOutput("Protokolliere Payload-Bytes...");
|
||||
|
||||
var payloadToLog = "";
|
||||
for (var i = 0; i < payload.length; i++) {
|
||||
payloadToLog += "0x" + payload[i].toString(16) + ", ".toUpperCase();
|
||||
}
|
||||
payloadToLog = payloadToLog;
|
||||
logOutput(payloadToLog);
|
||||
return;
|
||||
}
|
||||
|
||||
logOutput("Fordere Zugriff auf das Gerät...");
|
||||
device = await navigator.usb.requestDevice({ filters: [{ vendorId: 0x0955 }] });
|
||||
|
||||
logOutput(`<span style='color:blue'>Bereit den Start von ${payloadType} vor...</span>`);
|
||||
launchPayload(payload);
|
||||
});
|
||||
|
||||
|
||||
|
||||
function onSelectChange() {
|
||||
if (document.getElementById("payloadSelect").value === "uploaded")
|
||||
document.getElementById("uploadContainer").style.display = "block"
|
||||
else
|
||||
document.getElementById("uploadContainer").style.display = "none"
|
||||
}
|
||||
|
||||
|
||||
|
||||
function openInfo() {
|
||||
if(document.getElementById("infodiv").innerHTML != "") {
|
||||
document.getElementById("infodiv").innerHTML = "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
function openInstructions() {
|
||||
if(document.getElementById("infodiv").innerHTML != "") {
|
||||
document.getElementById("infodiv").innerHTML = "";
|
||||
}
|
||||
}
|
2397
de_DE/payloads.js
2397
de_DE/payloads.js
File diff suppressed because one or more lines are too long
@ -1,45 +0,0 @@
|
||||
@import url('https://fonts.googleapis.com/css?family=Open+Sans');
|
||||
|
||||
body {
|
||||
margin-top: 0px;
|
||||
margin-left: 0px;
|
||||
margin-right: auto;
|
||||
font-family: 'Open Sans', sans-serif;
|
||||
}
|
||||
|
||||
#title {
|
||||
text-align: center;
|
||||
font-size: 1.5vw;
|
||||
padding-top: 10vw;
|
||||
padding-bottom: 10vw;
|
||||
background-size: cover;
|
||||
background-color: black;
|
||||
background-image: url("https://icdn1.digitaltrends.com/image/nintendo-switch-review-photos-pdx-580.jpg");
|
||||
color: white;
|
||||
margin-top: 0px;
|
||||
top: 0px;
|
||||
}
|
||||
|
||||
#output {
|
||||
height: 200px;
|
||||
border: 1px solid black;
|
||||
overflow: scroll;
|
||||
}
|
||||
|
||||
#page-footer {
|
||||
padding: 32px;
|
||||
background: #222528;
|
||||
color: whitesmoke;
|
||||
}
|
||||
|
||||
#disclaimer {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.divider-line {
|
||||
border-bottom: 1px solid gainsboro;
|
||||
}
|
||||
|
||||
.margin-top-md {
|
||||
margin-top: 24px;
|
||||
}
|
50
i18n.js
Normal file
50
i18n.js
Normal file
@ -0,0 +1,50 @@
|
||||
|
||||
function setPageLanguage(lang) {
|
||||
var langObj = null;
|
||||
|
||||
if (lang === "en-US")
|
||||
langObj = enUS;
|
||||
|
||||
else if (lang === "it-IT")
|
||||
langObj = itIT;
|
||||
|
||||
else if (lang === "pt-BR")
|
||||
langObj = ptBR;
|
||||
|
||||
else if (lang === "de-DE")
|
||||
langObj = deDE;
|
||||
|
||||
else
|
||||
langObj = enUS;
|
||||
|
||||
|
||||
document.getElementById("pageTitle").innerHTML = langObj.pageTitle;
|
||||
document.getElementById("pageSubtitle").innerHTML = langObj.pageSubtitle;
|
||||
document.getElementById("dangerUpload").innerHTML = langObj.dangerUpload;
|
||||
document.getElementById("dangerDanger").innerHTML = langObj.dangerDanger;
|
||||
document.getElementById("warningWindows").innerHTML = langObj.warningWindows;
|
||||
document.getElementById("warningBrowser").innerHTML = langObj.warningBrowser;
|
||||
document.getElementById("warningLinux").innerHTML = langObj.warningLinux;
|
||||
document.getElementById("warningTested").innerHTML = langObj.warningTested;
|
||||
document.getElementById("labelInstructions").innerHTML = langObj.labelInstructions;
|
||||
document.getElementById("liRCM").innerHTML = langObj.liRCM;
|
||||
document.getElementById("liSelect").innerHTML = langObj.liSelect;
|
||||
document.getElementById("liPress").innerHTML = langObj.liPress;
|
||||
document.getElementById("liAPX").innerHTML = langObj.liAPX;
|
||||
document.getElementById("liLaunch").innerHTML = langObj.liLaunch;
|
||||
document.getElementById("h1SetupDelivery").innerHTML = langObj.h1SetupDelivery;
|
||||
document.getElementById("h4SelectPayload").innerHTML = langObj.h4SelectPayload;
|
||||
document.getElementById("optionInstantV5").innerHTML = langObj.optionInstantV5;
|
||||
document.getElementById("optionInstantV4").innerHTML = langObj.optionInstantV4;
|
||||
document.getElementById("optionHekateV5").innerHTML = langObj.optionHekateV5;
|
||||
document.getElementById("optionHekateV4").innerHTML = langObj.optionHekateV4;
|
||||
document.getElementById("optionFusee").innerHTML = langObj.optionFusee;
|
||||
document.getElementById("optionUpload").innerHTML = langObj.optionUpload;
|
||||
document.getElementById("h4GetByteArray").innerHTML = langObj.h4GetByteArray;
|
||||
document.getElementById("goButton").innerHTML = langObj.goButton;
|
||||
document.getElementById("clearlogsbutton").innerHTML = langObj.clearlogsbutton;
|
||||
document.getElementById("disclaimer1").innerHTML = langObj.disclaimer1;
|
||||
document.getElementById("disclaimer2").innerHTML = langObj.disclaimer2;
|
||||
document.getElementById("disclaimer3").innerHTML = langObj.disclaimer3;
|
||||
document.getElementById("disclaimer4").innerHTML = langObj.disclaimer4;
|
||||
}
|
31
i18n/de-DE.js
Normal file
31
i18n/de-DE.js
Normal file
@ -0,0 +1,31 @@
|
||||
let deDE = {
|
||||
"pageTitle" : "Nintendo Switch Payload Lader",
|
||||
"pageSubtitle" : "Fusee Launcher portiert zu JavaScript mit der Hilfe von WebUSB.",
|
||||
"dangerUpload" :"Aus irgendeinem Grund funktionieren hochgeladene Payloads nicht. Ich versuche zurzeit dies zu reparieren.",
|
||||
"dangerDanger" :"Es wurde einigermaßen getestet. Auch wenn bisher keine Fehler gefunden wurden, bin ich nicht schuldig, falls es zu Problemen kommt!",
|
||||
"warningWindows" :"Dies funktioniert nicht auf Windows durch Probleme mit Chrome und WebUSB (und wahrscheinlich anderen Gründen!)",
|
||||
"warningBrowser" :"Dies funktioniert bisher mit keinem Browser AUßER Chrome! Das liegt daran, dass die anderen Browser WebUSB nicht supporten!",
|
||||
"warningLinux" :"In Linux können Sie einen 'Zugriff abgelehnt' Fehler bekommen! Falls Sie dieses Problem haben, können Sie eine Datei unter: <code>/etc/udev/rules.d/50-switch.rules</code>mit dem folgenden Inhalt:<br><code>SUBSYSTEM==\"usb\", ATTR{idVendor}==\"0955\", MODE=\"0664\", GROUP=\"plugdev\"</code>erstellen.",
|
||||
"warningTested" :"Tests ergeben, dass es zurzeit auf Linux, OSX, Android (unrooted) und Chromebooks funktioniert. Ihr Ergebnis kann variieren.",
|
||||
"labelInstructions" :"Anleitung:",
|
||||
"liRCM" :"Setzen Sie die Switch in den RCM und verbinden Sie es mit ihrem Gerät.",
|
||||
"liSelect" :"Wählen Sie entweder einer der vorliegenden Payloads oder laden Sie Ihr eigenes Payload hoch.",
|
||||
"liPress" :'Drücken Sie: "Payload senden"',
|
||||
"liAPX" :'Auf dem Erlaubnisbildschirm müssen Sie "APX" auswählen und zustimmen.',
|
||||
"liLaunch" :"Falls alles richtig läuft, sollte das Payload gesendet sein!",
|
||||
"h1SetupDelivery" :"Konfiguration des Payloadversandes",
|
||||
"h4SelectPayload" :"Wähle Payload:",
|
||||
"optionInstantV5" :"Boote die CFW direkt (5.0.x)",
|
||||
"optionInstantV4" :"Boote die CFW direkt (4.0.x)",
|
||||
"optionHekateV5" :"Hekate für 5.0.x Switches",
|
||||
"optionHekateV4" :"Hekate für 4.0.x Switches",
|
||||
"optionFusee" :"(Re)Switched Test Payload (fusee)",
|
||||
"optionUpload" :"Eigenes Payload hochladen",
|
||||
"h4GetByteArray" :"Erhalte Payload Byte-Array (nicht senden)",
|
||||
"goButton" :"Sende Payload!",
|
||||
"clearlogsbutton" :"Clear Logs",
|
||||
"disclaimer1" :'Der Quellcode kann hier gefunden werden: <a href="https://github.com/ElijahZAwesome/web-cfw-loader/">GitHub</a> (oder indem man sich den Quellcode direkt ankuckt, da kein Backend existiert!).',
|
||||
"disclaimer2" :'Portiert von <a href="https://github.com/reswitched/fusee-launcher">fusee-launcher</a>.',
|
||||
"disclaimer3" :'Danke an ktemkin und ReSwitched, aber auch <br><a href="https://atlas44.s3-us-west-2.amazonaws.com/web-fusee-launcher/index.html">Atlas44 und seine Webseite</a>, als einen Startpunkt für dieses Projekt.',
|
||||
"disclaimer4" :'Zuletzt danke an <a href="https://github.com/falquinho">falquinho</a> für sein Bootstraplayout und Übersetzung in Portugiesisch, <a href="https://github.com/Filo97">Filo97</a> für die italienische Übersetzung und <a href="https://github.com/tumGER"> tumGER </a>für seine deutsche Übersetzung!.'
|
||||
}
|
31
i18n/en-US.js
Normal file
31
i18n/en-US.js
Normal file
@ -0,0 +1,31 @@
|
||||
let enUS = {
|
||||
"pageTitle" : "Nintendo Switch Payload Loader",
|
||||
"pageSubtitle" : "Fusee Launcher ported to JavaScript using WebUSB.",
|
||||
"dangerUpload" :"For some reason, uploaded payloads are not working. I'm currently trying to fix this.",
|
||||
"dangerDanger" :"This is moderately tested. Although no issues have been discovered, I'm not responsible if anything goes wrong!",
|
||||
"warningWindows" :"This does NOT work on Windows due to a limitation in the Chrome implementation of WebUSB (and probably other reasons!)",
|
||||
"warningBrowser" :"This does NOT currently work on any browser but Chrome, because they don't implement WebUSB.",
|
||||
"warningLinux" :"On Linux, you might get an 'Access Denied' or 'No Compatible Device' error on the Connect dialog! If you do, you can try creating a file at <code>/etc/udev/rules.d/50-switch.rules</code>With the following contents:<br><code>SUBSYSTEM==\"usb\", ATTR{idVendor}==\"0955\", MODE=\"0664\", GROUP=\"plugdev\"</code>",
|
||||
"warningTested" :"This has been tested and appears to work on Linux, OSX, Android (unrooted) and Chromebooks. Your mileage may vary.",
|
||||
"labelInstructions" :"Instructions:",
|
||||
"liRCM" :"Put the Switch in RCM, and connect it to your device.",
|
||||
"liSelect" :"Select either the example payload, or upload one.",
|
||||
"liPress" :"Press 'Deliver Payload!'",
|
||||
"liAPX" :"On the consent screen that appears, select 'APX' and hit 'Connect'.",
|
||||
"liLaunch" :"If all goes well, the payload will launch!",
|
||||
"h1SetupDelivery" :"Setup Payload Delivery",
|
||||
"h4SelectPayload" :"Select Payload:",
|
||||
"optionInstantV5" :"Instantly boot CFW (5.0.x)",
|
||||
"optionInstantV4" :"Instantly boot CFW (4.0.x)",
|
||||
"optionHekateV5" :"Hekate for 5.0.x Switches",
|
||||
"optionHekateV4" :"Hekate for 4.0.x Switches",
|
||||
"optionFusee" :"(Re)Switched test payload (fusee)",
|
||||
"optionUpload" :"Upload Payload",
|
||||
"h4GetByteArray" :"Get payload byte array (don't sploit)",
|
||||
"goButton" :"Deliver Payload!",
|
||||
"clearlogsbutton" :"Clear Logs",
|
||||
"disclaimer1" :'Source can be found on <a href="https://github.com/ElijahZAwesome/web-cfw-loader/">GitHub</a> (or by hitting view source, there is no backend!).',
|
||||
"disclaimer2" :'Ported from <a href="https://github.com/reswitched/fusee-launcher">fusee-launcher</a>.',
|
||||
"disclaimer3" :'Thanks to ktemkin and ReSwitched, as well as <br><a href="https://atlas44.s3-us-west-2.amazonaws.com/web-fusee-launcher/index.html">Atlas44 and his website</a> as a beginning point for this one.',
|
||||
"disclaimer4" :'Lastly, thanks to <a href="https://github.com/falquinho">falquinho</a> for the new bootstrap layout and portuguese translation, <a href="https://github.com/Filo97">Filo97</a> for the italian translation, and <a href="https://github.com/tumGER">tumGER</a> for his german translation.'
|
||||
}
|
31
i18n/it-IT.js
Normal file
31
i18n/it-IT.js
Normal file
@ -0,0 +1,31 @@
|
||||
let itIT = {
|
||||
"pageTitle" : "Nintendo Switch Payload Loader",
|
||||
"pageSubtitle" : "Fusee Launcher portato a JavaScript usando WebUSB.",
|
||||
"dangerUpload" :"For some reason, uploaded payloads are not working. I'm currently trying to fix this.",
|
||||
"dangerDanger" :"Questo è stato moderatamente testato. Anche se nessun problema è stato riportato, non sono responsabile in caso di brick!",
|
||||
"warningWindows" :"Questo non funziona in Windows per la implementazione scorretta di WinUSB di Chrome(E probabilmente altre ragioni)!",
|
||||
"warningBrowser" :"Questo non funziona attualmente su nessun browser ma Chrome perchè è l'unico con WinUSB.",
|
||||
"warningLinux" :"Su Linux, potresti ottenere un errore Access Denied! Se succede, potresti provare a creare un file a <code>/etc/udev/rules.d/50-switch.rules</code>Con i seguenti contenuti:<br><code>SUBSYSTEM==\"usb\", ATTR{idVendor}==\"0955\", MODE=\"0664\", GROUP=\"plugdev\"</code>",
|
||||
"warningTested" :"Questo è stato testato e funziona su Linux, OSX, Android (no root) and Chromebooks. Risultati potrebbero variare.",
|
||||
"labelInstructions" :"Istruzioni:",
|
||||
"liRCM" :"Metti lo Switch in RCM e collega il dispositivo.",
|
||||
"liSelect" :"Scegli il payload di esempio o caricane uno.",
|
||||
"liPress" :"Pemi 'Avvia payload!'",
|
||||
"liAPX" :"Nello schermo di conferma, scegli 'APX' ae premi conferma.",
|
||||
"liLaunch" :"Se tutto funziona il payload si avvierà!",
|
||||
"h1SetupDelivery" :"Setup Payload Delivery",
|
||||
"h4SelectPayload" :"Select Payload:",
|
||||
"optionInstantV5" :"Avvia istantaneamente CFW (5.0.x)",
|
||||
"optionInstantV4" :"Avvia istantaneamente CFW (4.0.x)",
|
||||
"optionHekateV5" :"Hekate per Switch su 5.0.X",
|
||||
"optionHekateV4" :"Hekate per Switch su 4.0.X",
|
||||
"optionFusee" :"(Re)Switched payload di test (fusee)",
|
||||
"optionUpload" :"Carica payload",
|
||||
"h4GetByteArray" :"Ottieni byte array del payload (no exploit)",
|
||||
"goButton" :"Avvia Payload!",
|
||||
"clearlogsbutton" :"Pulisci Logs",
|
||||
"disclaimer1" :'Il source puo essere trovato a <a href="https://github.com/ElijahZAwesome/web-cfw-loader/">GitHub</a> (o premendo guarda source, ma non c\'è backend!).',
|
||||
"disclaimer2" :'Portato da <a href="https://github.com/reswitched/fusee-launcher">fusee-launcher</a>.',
|
||||
"disclaimer3" :'Grazie tante a ktemkin e ReSwitched, e non dimentichiamoci <br><a href="https://atlas44.s3-us-west-2.amazonaws.com/web-fusee-launcher/index.html">Atlas44 e il suo sito</a> come punto di inizio per questo.',
|
||||
"disclaimer4" :'Lastly, thanks to <a href="https://github.com/falquinho">falquinho</a> for the new bootstrap layout and portuguese translation, <a href="https://github.com/Filo97">Filo97</a> for the italian translation, and <a href="https://github.com/tumGER">tumGER</a> for his german translation.'
|
||||
}
|
31
i18n/pt-BR.js
Normal file
31
i18n/pt-BR.js
Normal file
@ -0,0 +1,31 @@
|
||||
let ptBR = {
|
||||
"pageTitle" : "Nintendo Switch Payload Loader",
|
||||
"pageSubtitle" : "Fusee Launcher portado para JavaScript usando WebUSB.",
|
||||
"dangerUpload" :"Por algum motivo payloads carregados não funcionam. Estou tentando corrigir esse erro.",
|
||||
"dangerDanger" :"Esta ferramenta não foi completamente testada. Apesar de não ter encontrado nenhuma falha, não me responsabilizo se algo der errado!",
|
||||
"warningWindows" :"Isto NÃO funciona no Windows devido uma limitação do Chrome na implementação do WebUSB (e, possivelmente, outros motivos).",
|
||||
"warningBrowser" :"Isto NÃO funciona, atualmente, em nenhum browser além do Chrome, que é o único a implementar WebUSB.",
|
||||
"warningLinux" :"No Linux você pode receber um erro de 'Acesso Negado' ou de 'Dispositivo Compatível não Encontrado'! Caso receba, tente criar o arquivo <code>/etc/udev/rules.d/50-switch.rules</code> com o seguinte conteúdo: <br><code>SUBSYSTEM==\"usb\", ATTR{idVendor}==\"0955\", MODE=\"0664\", GROUP=\"plugdev\"</code>",
|
||||
"warningTested" :"Isto foi testado -e aparentemente funciona- no Linux, OSX, Android (sem precisar de root) e Chromebooks. Resultados podem variar.",
|
||||
"labelInstructions" :"Instruções:",
|
||||
"liRCM" :"Coloque o Switch no modo RCM e conecte-o ao dispositivo.",
|
||||
"liSelect" :"Escolha um dos payloads disponíveis ou faça upload de um.",
|
||||
"liPress" :"Clique em 'Enviar Payload'!",
|
||||
"liAPX" :"No diálogo de confirmação escolha 'APX' e clique em 'Conectar-se'",
|
||||
"liLaunch" :"Se tudo der certo, o payload executará!",
|
||||
"h1SetupDelivery" :"Configurar Entrega de Payload",
|
||||
"h4SelectPayload" :"Payload:",
|
||||
"optionInstantV5" :"Inicialização Instantânea CFW (5.0.x)",
|
||||
"optionInstantV4" :"Inicialização Instantânea CFW (4.0.x)",
|
||||
"optionHekateV5" :"Hekate para Switch ver. 5.0.X",
|
||||
"optionHekateV4" :"Hekate para Switch ver. 4.0.X",
|
||||
"optionFusee" :"Payload de teste (Re)Switched (fusee)",
|
||||
"optionUpload" :"Carregar Payload",
|
||||
"h4GetByteArray" :"Recuperar array de bytes do payload (favor não exploitar)",
|
||||
"goButton" :"Enviar Payload!",
|
||||
"clearlogsbutton" :"Limpar Logs",
|
||||
"disclaimer1" :'Código fonte disponível em <a href="https://github.com/ElijahZAwesome/web-cfw-loader/">GitHub</a> (ou simplesmente clicando "ver código", não há backend).',
|
||||
"disclaimer2" :'Um port do <a href="https://github.com/reswitched/fusee-launcher">fusee-launcher</a>.',
|
||||
"disclaimer3" :'Muito obrigado a Ktemkin e time (Re)Switched, bem como <br><a href="https://atlas44.s3-us-west-2.amazonaws.com/web-fusee-launcher/index.html">Atlas44 e seu website</a> que é a base deste.',
|
||||
"disclaimer4" :'Por último, obrigado <a href="https://github.com/falquinho">falquinho</a> pelo novo layout Bootstrap e tradução para português, <a href="https://github.com/Filo97">Filo97</a> pela tradução para italiano, e <a href="https://github.com/tumGER">tumGER</a> pela tradução para alemão.'
|
||||
}
|
72
index.html
72
index.html
@ -7,6 +7,12 @@
|
||||
<link href="favicon.png" rel="icon" type="image/x-icon" />
|
||||
<title>Switch Payload Loader v1.3</title>
|
||||
|
||||
<script src="./i18n/en-US.js"></script>
|
||||
<script src="./i18n/it-IT.js"></script>
|
||||
<script src="./i18n/pt-BR.js"></script>
|
||||
<script src="./i18n/de-DE.js"></script>
|
||||
<script src="./i18n.js"></script>
|
||||
|
||||
<!-- JQuery: needed for some Bootstrap Components -->
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
|
||||
|
||||
@ -22,17 +28,17 @@
|
||||
|
||||
<body class="container-fluid" id="pageBody">
|
||||
<div class="row" id="title">
|
||||
<h1>Nintendo Switch Payload Loader</h1>
|
||||
<h4>Fusee Launcher ported to JavaScript using WebUSB.</h4>
|
||||
<h1 id="pageTitle">Nintendo Switch Payload Loader</h1>
|
||||
<h4 id="pageSubtitle">Fusee Launcher ported to JavaScript using WebUSB.</h4>
|
||||
</div>
|
||||
|
||||
<div class="row margin-top-md">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
<div class="btn-group" role="group" aria-label="...">
|
||||
<a class="btn btn-info disabled" href="#">English</a>
|
||||
<a class="btn btn-info" href="./it_IT/index.html">Italiano</a>
|
||||
<a class="btn btn-info" href="./pt_BR/index.html">Português</a>
|
||||
<a class="btn btn-info" href="./de_DE/index.html">Deutsch</a>
|
||||
<a class="btn btn-info" href="#" onclick="setPageLanguage('en-US')">English</a>
|
||||
<a class="btn btn-info" href="#" onclick="setPageLanguage('it-IT')">Italiano</a>
|
||||
<a class="btn btn-info" href="#" onclick="setPageLanguage('pt-BR')">Português</a>
|
||||
<a class="btn btn-info" href="#" onclick="setPageLanguage('de-DE')">Deutsch</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -42,41 +48,41 @@
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
|
||||
<div class="alert alert-danger" role="alert">
|
||||
<p>For some reason, uploaded payloads are not working. I'm currently trying to fix this.</p>
|
||||
<p id="dangerUpload" >For some reason, uploaded payloads are not working. I'm currently trying to fix this.</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-danger" role="alert">
|
||||
<p>This is moderately tested. Although no issues have been discovered, I'm not responsible if anything goes wrong!</p>
|
||||
<p id="dangerDanger">This is moderately tested. Although no issues have been discovered, I'm not responsible if anything goes wrong!</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<p>This does NOT work on Windows due to a limitation in the Chrome implementation of WebUSB (and probably other reasons!)</p>
|
||||
<p id="warningWindows">This does NOT work on Windows due to a limitation in the Chrome implementation of WebUSB (and probably other reasons!)</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<p>This does NOT currently work on any browser but Chrome, because they don't implement WebUSB.</p>
|
||||
<p id="warningBrowser">This does NOT currently work on any browser but Chrome, because they don't implement WebUSB.</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<p>On Linux, you might get an 'Access Denied' or 'No Compatible Device' error on the Connect dialog! If you do, you can try creating a file at <code>/etc/udev/rules.d/50-switch.rules</code>With the following contents:<br><code>SUBSYSTEM==\"usb\", ATTR{idVendor}==\"0955\", MODE=\"0664\", GROUP=\"plugdev\"</code></p>
|
||||
<p id="warningLinux">On Linux, you might get an 'Access Denied' or 'No Compatible Device' error on the Connect dialog! If you do, you can try creating a file at <code>/etc/udev/rules.d/50-switch.rules</code>With the following contents:<br><code>SUBSYSTEM==\"usb\", ATTR{idVendor}==\"0955\", MODE=\"0664\", GROUP=\"plugdev\"</code></p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<p>This has been tested and appears to work on Linux, OSX, Android (unrooted) and Chromebooks. Your mileage may vary.</p>
|
||||
<p id="warningTested">This has been tested and appears to work on Linux, OSX, Android (unrooted) and Chromebooks. Your mileage may vary.</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info" role="alert">
|
||||
<p><strong>Instructions:</strong></p>
|
||||
<p><strong id="labelInstructions">Instructions:</strong></p>
|
||||
<ul>
|
||||
<li>Put the Switch in RCM, and connect it to your device.</li>
|
||||
<li>Select either the example payload, or upload one.</li>
|
||||
<li>Press 'Deliver Payload!'</li>
|
||||
<li>On the consent screen that appears, select 'APX' and hit 'Connect'.</li>
|
||||
<li>If all goes well, the payload will launch!</li>
|
||||
<li id="liRCM">Put the Switch in RCM, and connect it to your device.</li>
|
||||
<li id="liSelect">Select either the example payload, or upload one.</li>
|
||||
<li id="liPress">Press 'Deliver Payload!'</li>
|
||||
<li id="liAPX">On the consent screen that appears, select 'APX' and hit 'Connect'.</li>
|
||||
<li id="liLaunch">If all goes well, the payload will launch!</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -85,22 +91,22 @@
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
<h1>Setup Payload Delivery</h1>
|
||||
<h1 id="h1SetupDelivery">Setup Payload Delivery</h1>
|
||||
|
||||
<form id="mainForm">
|
||||
<div class="row">
|
||||
<div class="col-xs-6">
|
||||
<h4>Select Payload:</h4>
|
||||
<h4 id="h4SelectPayload">Select Payload:</h4>
|
||||
</div>
|
||||
|
||||
<div class="col-xs-6">
|
||||
<select class="pull-right" id="payloadSelect" onchange="onSelectChange()">
|
||||
<option value="instaboot">Instantly boot CFW (5.0.x)</option>
|
||||
<option value="instabootv4">Instantly boot CFW (4.x)</option>
|
||||
<option value="hekate v5">Hekate for 5.0.x Switches</option>
|
||||
<option value="hekate v4">Hekate for 4.0.x Switches</option>
|
||||
<option value="fusee">(Re)Switched test payload (fusee)</option>
|
||||
<option value="uploaded">Upload payload</option>
|
||||
<select class="pull-right" id="payloadSelect" onchange="onSelectChange()">
|
||||
<option value="instaboot" id="optionInstantV5">Instantly boot CFW (5.0.x)</option>
|
||||
<option value="instabootv4" id="optionInstantV4">Instantly boot CFW (4.x)</option>
|
||||
<option value="hekate v5" id="optionHekateV5" >Hekate for 5.0.x Switches</option>
|
||||
<option value="hekate v4" id="optionHekateV4" >Hekate for 4.0.x Switches</option>
|
||||
<option value="fusee" id="optionFusee" >(Re)Switched test payload (fusee)</option>
|
||||
<option value="uploaded" id="optionUpload" >Upload payload</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
@ -114,7 +120,7 @@
|
||||
|
||||
<div class="row margin-top-md">
|
||||
<div class="col-xs-10">
|
||||
<h4>Get payload byte array (don't sploit)</h4>
|
||||
<h4 id="h4GetByteArray">Get payload byte array (don't sploit)</h4>
|
||||
</div>
|
||||
<div class="col-xs-2">
|
||||
<input class="pull-right" type="checkbox" name="shouldDebug" id="shouldDebug">
|
||||
@ -135,7 +141,7 @@
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
<h3>Log:</h3>
|
||||
<h3 id="h3Log">Log:</h3>
|
||||
<div id="output"></div>
|
||||
<button class="btn btn-primary pull-right margin-top-md" id="clearlogsbutton" onclick="clearLog();">Clear Logs</button><br><br>
|
||||
</div>
|
||||
@ -149,10 +155,10 @@
|
||||
<div class="row margin-top-md" id="page-footer">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
<div id="disclaimer">
|
||||
<p>Source can be found on <a href="https://github.com/ElijahZAwesome/web-cfw-loader/">GitHub</a> (or by hitting view source, there is no backend!).</p>
|
||||
<p>Ported from <a href="https://github.com/reswitched/fusee-launcher">fusee-launcher</a>.</p>
|
||||
<p>Thanks to ktemkin and ReSwitched, as well as <br><a href="https://atlas44.s3-us-west-2.amazonaws.com/web-fusee-launcher/index.html">Atlas44 and his website</a> as a beginning point for this one. </p>
|
||||
<p>Lastly, thanks to <a href="https://github.com/falquinho">falquinho</a> for the new bootstrap layout and portuguese translation, <a href="https://github.com/Filo97">Filo97</a> for the italian translation, and <a href="https://github.com/tumGER">tumGER</a> for his german translation.</p>
|
||||
<p id="disclaimer1">Source can be found on <a href="https://github.com/ElijahZAwesome/web-cfw-loader/">GitHub</a> (or by hitting view source, there is no backend!).</p>
|
||||
<p id="disclaimer2">Ported from <a href="https://github.com/reswitched/fusee-launcher">fusee-launcher</a>.</p>
|
||||
<p id="disclaimer3">Thanks to ktemkin and ReSwitched, as well as <br><a href="https://atlas44.s3-us-west-2.amazonaws.com/web-fusee-launcher/index.html">Atlas44 and his website</a> as a beginning point for this one. </p>
|
||||
<p id="disclaimer4">Lastly, thanks to <a href="https://github.com/falquinho">falquinho</a> for the new bootstrap layout and portuguese translation, <a href="https://github.com/Filo97">Filo97</a> for the italian translation, and <a href="https://github.com/tumGER">tumGER</a> for his german translation.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018 atlas44
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@ -1,11 +0,0 @@
|
||||
# web-cfw-loader
|
||||
Fusee Launcher, in a browser!
|
||||
|
||||
# Description
|
||||
This is a port of [fusee-launcher](https://github.com/reswitched/fusee-launcher) to JavaScript using WebUSB. This has been mildly tested and appears to work on Linux, Android (unrooted), OSX and ChromeOS. Today, this only works on Chrome because only Chrome implements WebUSB. It also does NOT work on Windows because the WebUSB Windows implementation does not allow sending the required USB packet.
|
||||
|
||||
# Forked
|
||||
This is also a fork of [web-fusee-launcher](https://github.com/atlas44/web-fusee-launcher), which I fixed up a bit, added hekate 5 and 4, and did some CSS stuff.
|
||||
|
||||
# Try it out
|
||||
Either use a web server to host the files (must be on https!) or you can try the [demo](https://elijahzawesome.github.io/web-cfw-loader/).
|
Binary file not shown.
Before Width: | Height: | Size: 18 KiB |
152
it_IT/index.html
152
it_IT/index.html
@ -1,152 +0,0 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||
<link href="favicon.png" rel="icon" type="image/x-icon" />
|
||||
<title>Switch Payload Loader v1.2</title>
|
||||
|
||||
<!-- JQuery: needed for some Bootstrap Components -->
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
|
||||
|
||||
<!-- Bootstrap 3 framework -->
|
||||
<!-- Latest compiled and minified CSS -->
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
|
||||
<!-- Optional theme -->
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
|
||||
<!-- Latest compiled and minified JavaScript -->
|
||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
|
||||
|
||||
</head>
|
||||
|
||||
<body class="container-fluid" id="pageBody">
|
||||
<div class="row" id="title">
|
||||
<h1>Nintendo Switch Payload Loader</h1>
|
||||
<h4>Fusee Launcher portato a JavaScript usando WebUSB.</h4>
|
||||
</div>
|
||||
|
||||
<div class="row margin-top-md">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
<div class="btn-group" role="group" aria-label="...">
|
||||
<a class="btn btn-info" href="../index.html">English</a>
|
||||
<a class="btn btn-info disabled" href="#">Italiano</a>
|
||||
<a class="btn btn-info" href="../pt_BR/index.html">Português</a>
|
||||
<a class="btn btn-info" href="../de_DE/index.html">Deutsch</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row margin-top-md" id="infodiv">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
|
||||
<div class="alert alert-danger" role="alert">
|
||||
<p>Questo è stato moderatamente testato. Anche se nessun problema è stato riportato, non sono responsabile in caso di brick!</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<p>Questo non funziona in Windows per la implementazione scorretta di WinUSB di Chrome(E probabilmente altre ragioni)!</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<p>Questo non funziona attualmente su nessun browser ma Chrome perchè è l'unico con WinUSB.</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<p>Su Linux, potresti ottenere un errore Access Denied! Se succede, potresti provare a creare un file a <code>/etc/udev/rules.d/50-switch.rules</code>Con i seguenti contenuti:<br><code>SUBSYSTEM==\"usb\", ATTR{idVendor}==\"0955\", MODE=\"0664\", GROUP=\"plugdev\"</code></p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<p>Questo è stato testato e funziona su Linux, OSX, Android (no root) and Chromebooks. Risultati potrebbero variare.</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info" role="alert">
|
||||
<p><strong>Istruzioni:</strong></p>
|
||||
<ul>
|
||||
<li>Metti lo Switch in RCM e collega il dispositivo.</li>
|
||||
<li>Scegli il payload di esempio o caricane uno.</li>
|
||||
<li>Pemi 'Avvia payload!'</li>
|
||||
<li>Nello schermo di conferma, scegli 'APX' ae premi conferma.</li>
|
||||
<li>Se tutto funziona il payload si avvierà!</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
<h1>Setup Payload Delivery</h1>
|
||||
|
||||
<form id="mainForm">
|
||||
<div class="row">
|
||||
<div class="col-xs-6">
|
||||
<h4>Payload:</h4>
|
||||
</div>
|
||||
|
||||
<div class="col-xs-6">
|
||||
<select class="pull-right" id="payloadSelect" onchange="onSelectChange()">
|
||||
<option value="instaboot">Avvia istantaneamente CFW (5.0.x)</option>
|
||||
<option value="hekate v5">Hekate per Switch su 5.0.X</option>
|
||||
<option value="hekate v4">Hekate per Switch su 4.0.X</option>
|
||||
<option value="fusee">(Re)Switched payload di test (fusee)</option>
|
||||
<option value="uploaded">Carica payload</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" id="uploadContainer" style="display: none">
|
||||
<div class="col-xs-12">
|
||||
<input style="float: right" type="file" id="payloadUpload" accept=".bin"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row divider-line"></div>
|
||||
|
||||
<div class="row margin-top-md">
|
||||
<div class="col-xs-10">
|
||||
<h4>Ottieni byte array del payload (no exploit)</h4>
|
||||
</div>
|
||||
<div class="col-xs-2">
|
||||
<input class="pull-right" type="checkbox" name="shouldDebug" id="shouldDebug">
|
||||
</div>
|
||||
</div>
|
||||
<div class="row divider-line"></div>
|
||||
</form>
|
||||
|
||||
<div class="row margin-top-md">
|
||||
<div class="col-xs-12">
|
||||
<button class="btn btn-primary btn-lg pull-right" id="goButton">Avvia Payload!</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
<h3>Log:</h3>
|
||||
<div id="output"></div>
|
||||
<button class="btn btn-primary pull-right margin-top-md" id="clearlogsbutton" onclick="clearLog();">Pulisci Logs</button><br><br>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script src="./payloads.js"></script>
|
||||
<script src="./main.js"></script>
|
||||
</body>
|
||||
|
||||
<div class="row margin-top-md" id="page-footer">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
<div id="disclaimer">
|
||||
<p>Il source puo essere trovato a <a href="https://github.com/ElijahZAwesome/web-cfw-loader/">GitHub</a> (o premendo guarda source, ma non c'è backend!).</p>
|
||||
<p>Portato da <a href="https://github.com/reswitched/fusee-launcher">fusee-launcher</a>.</p>
|
||||
<p>Grazie tante a ktemkin e ReSwitched, e non dimentichiamoci <br><a href="https://atlas44.s3-us-west-2.amazonaws.com/web-fusee-launcher/index.html">Atlas44 e il suo sito</a> come punto di inizio per questo.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</html>
|
206
it_IT/main.js
206
it_IT/main.js
@ -1,206 +0,0 @@
|
||||
const intermezzo = new Uint8Array([
|
||||
0x44, 0x00, 0x9F, 0xE5, 0x01, 0x11, 0xA0, 0xE3, 0x40, 0x20, 0x9F, 0xE5, 0x00, 0x20, 0x42, 0xE0,
|
||||
0x08, 0x00, 0x00, 0xEB, 0x01, 0x01, 0xA0, 0xE3, 0x10, 0xFF, 0x2F, 0xE1, 0x00, 0x00, 0xA0, 0xE1,
|
||||
0x2C, 0x00, 0x9F, 0xE5, 0x2C, 0x10, 0x9F, 0xE5, 0x02, 0x28, 0xA0, 0xE3, 0x01, 0x00, 0x00, 0xEB,
|
||||
0x20, 0x00, 0x9F, 0xE5, 0x10, 0xFF, 0x2F, 0xE1, 0x04, 0x30, 0x90, 0xE4, 0x04, 0x30, 0x81, 0xE4,
|
||||
0x04, 0x20, 0x52, 0xE2, 0xFB, 0xFF, 0xFF, 0x1A, 0x1E, 0xFF, 0x2F, 0xE1, 0x20, 0xF0, 0x01, 0x40,
|
||||
0x5C, 0xF0, 0x01, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x01, 0x40
|
||||
]);
|
||||
|
||||
|
||||
|
||||
const RCM_PAYLOAD_ADDRESS = 0x40010000;
|
||||
const INTERMEZZO_LOCATION = 0x4001F000;
|
||||
const PAYLOAD_LOAD_BLOCK = 0x40020000;
|
||||
|
||||
|
||||
|
||||
function createRCMPayload(intermezzo, payload) {
|
||||
const rcmLength = 0x30298;
|
||||
|
||||
const intermezzoAddressRepeatCount = (INTERMEZZO_LOCATION - RCM_PAYLOAD_ADDRESS) / 4;
|
||||
|
||||
const rcmPayloadSize = Math.ceil((0x2A8 + (0x4 * intermezzoAddressRepeatCount) + 0x1000 + payload.byteLength) / 0x1000) * 0x1000;
|
||||
|
||||
const rcmPayload = new Uint8Array(new ArrayBuffer(rcmPayloadSize))
|
||||
const rcmPayloadView = new DataView(rcmPayload.buffer);
|
||||
|
||||
rcmPayloadView.setUint32(0x0, rcmLength, true);
|
||||
|
||||
for (let i = 0; i < intermezzoAddressRepeatCount; i++) {
|
||||
rcmPayloadView.setUint32(0x2A8 + i * 4, INTERMEZZO_LOCATION, true);
|
||||
}
|
||||
|
||||
rcmPayload.set(intermezzo, 0x2A8 + (0x4 * intermezzoAddressRepeatCount));
|
||||
rcmPayload.set(payload, 0x2A8 + (0x4 * intermezzoAddressRepeatCount) + 0x1000);
|
||||
|
||||
return rcmPayload;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function bufferToHex(data) {
|
||||
let result = "";
|
||||
for (let i = 0; i < data.byteLength; i++)
|
||||
result += data.getUint8(i).toString(16).padStart(2, "0");
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
async function write(device, data) {
|
||||
let length = data.length;
|
||||
let writeCount = 0;
|
||||
const packetSize = 0x1000;
|
||||
|
||||
while (length) {
|
||||
const dataToTransmit = Math.min(length, packetSize);
|
||||
length -= dataToTransmit;
|
||||
|
||||
const chunk = data.slice(0, dataToTransmit);
|
||||
data = data.slice(dataToTransmit);
|
||||
await device.transferOut(1, chunk);
|
||||
writeCount++;
|
||||
}
|
||||
|
||||
return writeCount;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function readFileAsArrayBuffer(file) {
|
||||
return new Promise((res, rej) => {
|
||||
const reader = new FileReader();
|
||||
reader.onload = e => {
|
||||
res(e.target.result);
|
||||
}
|
||||
reader.readAsArrayBuffer(file);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
function logOutput(...message) {
|
||||
document.getElementById("output").innerHTML = document.getElementById("output").innerHTML + message.join(" ") + "<br>";
|
||||
}
|
||||
|
||||
|
||||
|
||||
function clearLog() {
|
||||
document.getElementById("output").innerHTML = "";
|
||||
}
|
||||
|
||||
|
||||
|
||||
let device;
|
||||
|
||||
|
||||
|
||||
async function launchPayload(payload) {
|
||||
await device.open();
|
||||
logOutput(`Connected to ${device.manufacturerName} ${device.productName}`);
|
||||
|
||||
await device.claimInterface(0);
|
||||
|
||||
const deviceID = await device.transferIn(1, 16);
|
||||
logOutput(`Device ID: ${bufferToHex(deviceID.data)}`);
|
||||
|
||||
const rcmPayload = createRCMPayload(intermezzo, payload);
|
||||
logOutput("Sending payload...");
|
||||
const writeCount = await write(device, rcmPayload);
|
||||
logOutput("Payload sent!");
|
||||
|
||||
if (writeCount % 2 !== 1) {
|
||||
logOutput("Switching to higher buffer...");
|
||||
await device.transferOut(1, new ArrayBuffer(0x1000));
|
||||
}
|
||||
|
||||
logOutput("Trigging vulnerability...");
|
||||
const vulnerabilityLength = 0x7000;
|
||||
const smash = await device.controlTransferIn({
|
||||
requestType: 'standard',
|
||||
recipient: 'interface',
|
||||
request: 0x00,
|
||||
value: 0x00,
|
||||
index: 0x00
|
||||
}, vulnerabilityLength);
|
||||
}
|
||||
|
||||
|
||||
|
||||
document.getElementById("goButton").addEventListener("click", async () => {
|
||||
clearLog();
|
||||
var debugCheckbox = document.getElementById("shouldDebug");
|
||||
const payloadType = document.getElementById("payloadSelect").value;
|
||||
|
||||
let payload;
|
||||
if (payloadType === "hekate v5") {
|
||||
payload = hekate5;
|
||||
|
||||
} else if (payloadType === "hekate v4") {
|
||||
payload = hekate4;
|
||||
|
||||
} else if (payloadType === "fusee") {
|
||||
payload = fusee;
|
||||
|
||||
} else if (payloadType === "instaboot") {
|
||||
payload = instaboot;
|
||||
|
||||
} else if (payloadType === "uploaded") {
|
||||
const file = document.getElementById("payloadUpload").files[0];
|
||||
if (!file) {
|
||||
alert("You need to upload a file, to use an uploaded file.");
|
||||
return;
|
||||
}
|
||||
payload = new Uint8Array(await readFileAsArrayBuffer(file));
|
||||
} else {
|
||||
logOutput("<span style='color:red'>You're trying to load a payload type that doesn't exist.</span>");
|
||||
return;
|
||||
}
|
||||
|
||||
if(debugCheckbox.checked) {
|
||||
logOutput("Logging payload bytes...");
|
||||
|
||||
var payloadToLog = "";
|
||||
for (var i = 0; i < payload.length; i++) {
|
||||
payloadToLog += "0x" + payload[i].toString(16) + ", ".toUpperCase();
|
||||
}
|
||||
payloadToLog = payloadToLog.toUpperCase();
|
||||
logOutput(payloadToLog);
|
||||
return;
|
||||
}
|
||||
|
||||
logOutput("Requesting access to device...");
|
||||
device = await navigator.usb.requestDevice({ filters: [{ vendorId: 0x0955 }] });
|
||||
|
||||
logOutput(`<span style='color:blue'>Preparing to launch ${payloadType}...</span>`);
|
||||
launchPayload(payload);
|
||||
});
|
||||
|
||||
|
||||
|
||||
function onSelectChange() {
|
||||
if (document.getElementById("payloadSelect").value === "uploaded")
|
||||
document.getElementById("uploadContainer").style.display = "block"
|
||||
else
|
||||
document.getElementById("uploadContainer").style.display = "none"
|
||||
}
|
||||
|
||||
|
||||
|
||||
function openInfo() {
|
||||
if(document.getElementById("infodiv").innerHTML != "") {
|
||||
document.getElementById("infodiv").innerHTML = "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
function openInstructions() {
|
||||
if(document.getElementById("infodiv").innerHTML != "") {
|
||||
document.getElementById("infodiv").innerHTML = "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.getElementById("payloadUpload").addEventListener("change", () => document.forms.mainForm.payload.value = "uploaded");
|
2397
it_IT/payloads.js
2397
it_IT/payloads.js
File diff suppressed because one or more lines are too long
@ -1,64 +0,0 @@
|
||||
@import url('https://fonts.googleapis.com/css?family=Open+Sans');
|
||||
|
||||
@media only screen and (max-device-width: 768px) {
|
||||
#title h1 {
|
||||
font-size: 5vw;
|
||||
}
|
||||
|
||||
#pageBody, #mainForm h4, #goButton, #clearlogsbutton, .btn-group a, #title h4 {
|
||||
font-size: 3vw;
|
||||
}
|
||||
|
||||
#shouldDebug {
|
||||
width: 4vw;
|
||||
height: 4vw;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
margin-top: 0px;
|
||||
margin-left: 0px;
|
||||
margin-right: auto;
|
||||
font-family: 'Open Sans', sans-serif;
|
||||
}
|
||||
|
||||
#title {
|
||||
text-align: center;
|
||||
font-size: 1.5vw;
|
||||
padding-top: 10vw;
|
||||
padding-bottom: 10vw;
|
||||
background-size: cover;
|
||||
background-color: black;
|
||||
background-image: url("https://icdn1.digitaltrends.com/image/nintendo-switch-review-photos-pdx-580.jpg");
|
||||
color: white;
|
||||
margin-top: 0px;
|
||||
top: 0px;
|
||||
}
|
||||
|
||||
#uploadContainer {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
#output {
|
||||
height: 200px;
|
||||
border: 1px solid black;
|
||||
overflow: scroll;
|
||||
}
|
||||
|
||||
#page-footer {
|
||||
padding: 32px;
|
||||
background: #222528;
|
||||
color: whitesmoke;
|
||||
}
|
||||
|
||||
#disclaimer {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.divider-line {
|
||||
border-bottom: 1px solid gainsboro;
|
||||
}
|
||||
|
||||
.margin-top-md {
|
||||
margin-top: 24px;
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018 atlas44
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@ -1,11 +0,0 @@
|
||||
# web-cfw-loader
|
||||
Fusee Launcher, in a browser!
|
||||
|
||||
# Description
|
||||
This is a port of [fusee-launcher](https://github.com/reswitched/fusee-launcher) to JavaScript using WebUSB. This has been mildly tested and appears to work on Linux, Android (unrooted), OSX and ChromeOS. Today, this only works on Chrome because only Chrome implements WebUSB. It also does NOT work on Windows because the WebUSB Windows implementation does not allow sending the required USB packet.
|
||||
|
||||
# Forked
|
||||
This is also a fork of [web-fusee-launcher](https://github.com/atlas44/web-fusee-launcher), which I fixed up a bit, added hekate 5 and 4, and did some CSS stuff.
|
||||
|
||||
# Try it out
|
||||
Either use a web server to host the files (must be on https!) or you can try the [demo](https://elijahzawesome.github.io/web-cfw-loader/).
|
Binary file not shown.
Before Width: | Height: | Size: 18 KiB |
152
pt_BR/index.html
152
pt_BR/index.html
@ -1,152 +0,0 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
||||
<link href="favicon.png" rel="icon" type="image/x-icon" />
|
||||
<title>Switch Payload Loader v1.2</title>
|
||||
|
||||
<!-- JQuery: needed for some Bootstrap Components -->
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
|
||||
|
||||
<!-- Bootstrap 3 framework -->
|
||||
<!-- Latest compiled and minified CSS -->
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
|
||||
<!-- Optional theme -->
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
|
||||
<!-- Latest compiled and minified JavaScript -->
|
||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
|
||||
|
||||
</head>
|
||||
|
||||
<body class="container-fluid" id="pageBody">
|
||||
<div class="row" id="title">
|
||||
<h1>Nintendo Switch Payload Loader</h1>
|
||||
<h4>Fusee Launcher portado para JavaScript usando WebUSB.</h4>
|
||||
</div>
|
||||
|
||||
<div class="row margin-top-md">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
<div class="btn-group" role="group" aria-label="...">
|
||||
<a class="btn btn-info" href="../index.html">English</a>
|
||||
<a class="btn btn-info" href="../it_IT/index.html">Italiano</a>
|
||||
<a class="btn btn-info disabled" href="#">Português</a>
|
||||
<a class="btn btn-info" href="../de_DE/index.html">Deutsch</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row margin-top-md" id="infodiv">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
|
||||
<div class="alert alert-danger" role="alert">
|
||||
<p>Esta ferramenta não foi completamente testada. Apesar de não ter encontrado nenhuma falha, não me responsabilizo se algo der errado!</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<p>Isto NÃO funciona no Windows devido uma limitação do Chrome na implementação do WebUSB (e, possivelmente, outros motivos).</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<p>Isto NÃO funciona, atualmente, em nenhum browser além do Chrome, que é o único a implementar WebUSB.</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<p>No Linux você pode receber um erro de 'Acesso Negado' ou de 'Dispositivo Compatível não Encontrado'! Caso receba, tente criar o arquivo <code>/etc/udev/rules.d/50-switch.rules</code> com o seguinte conteúdo: <br><code>SUBSYSTEM==\"usb\", ATTR{idVendor}==\"0955\", MODE=\"0664\", GROUP=\"plugdev\"</code></p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<p>Isto foi testado -e aparentemente funciona- no Linux, OSX, Android (sem precisar de root) e Chromebooks. Resultados podem variar.</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info" role="alert">
|
||||
<p><strong>Instruções:</strong></p>
|
||||
<ul>
|
||||
<li>Coloque o Switch no modo RCM e conecte-o ao dispositivo.</li>
|
||||
<li>Escolha um dos payloads disponíveis ou faça upload de um.</li>
|
||||
<li>Clique em "Enviar Payload"!</li>
|
||||
<li>No diálogo de confirmação escolha "APX" e clique em 'Conectar-se'</li>
|
||||
<li>Se tudo der certo, o payload executará!</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
<h1>Configurar Entrega de Payload</h1>
|
||||
|
||||
<form id="mainForm">
|
||||
<div class="row">
|
||||
<div class="col-xs-6">
|
||||
<h4>Payload:</h4>
|
||||
</div>
|
||||
|
||||
<div class="col-xs-6">
|
||||
<select class="pull-right" id="payloadSelect" onchange="onSelectChange()">
|
||||
<option value="instaboot">Execução Instantânea CFW (5.0.x)</option>
|
||||
<option value="hekate v5">Hekate para Switch ver. 5.0.X</option>
|
||||
<option value="hekate v4">Hekate para Switch ver. 4.0.X</option>
|
||||
<option value="fusee">Payload de teste do time (Re)Switched (fusee)</option>
|
||||
<option value="uploaded">Upload de Payload</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" id="uploadContainer" style="display: none">
|
||||
<div class="col-xs-12">
|
||||
<input style="float: right" type="file" id="payloadUpload" accept=".bin"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row divider-line"></div>
|
||||
|
||||
<div class="row margin-top-md">
|
||||
<div class="col-xs-10">
|
||||
<h4>Recuperar array de bytes do payload (favor não exploitar)</h4>
|
||||
</div>
|
||||
<div class="col-xs-2">
|
||||
<input class="pull-right" type="checkbox" name="shouldDebug" id="shouldDebug">
|
||||
</div>
|
||||
</div>
|
||||
<div class="row divider-line"></div>
|
||||
</form>
|
||||
|
||||
<div class="row margin-top-md">
|
||||
<div class="col-xs-12">
|
||||
<button class="btn btn-primary btn-lg pull-right" id="goButton">Enviar Payload!</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
<h3>Log:</h3>
|
||||
<div id="output"></div>
|
||||
<button class="btn btn-primary pull-right margin-top-md" id="clearlogsbutton" onclick="clearLog();">Limpar Logs</button><br><br>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script src="./payloads.js"></script>
|
||||
<script src="./main.js"></script>
|
||||
</body>
|
||||
|
||||
<div class="row margin-top-md" id="page-footer">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3">
|
||||
<div id="disclaimer">
|
||||
<p>Código fonte disponível em <a href="https://github.com/ElijahZAwesome/web-cfw-loader/">GitHub</a> (ou simplesmente clicando 'ver código', não há backend).</p>
|
||||
<p>Um port do <a href="https://github.com/reswitched/fusee-launcher">fusee-launcher</a>.</p>
|
||||
<p>Muito obrigado a Ktemkin e time (Re)Switched, bem como <br><a href="https://atlas44.s3-us-west-2.amazonaws.com/web-fusee-launcher/index.html">Atlas44 e seu website</a> que é a base deste.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</html>
|
206
pt_BR/main.js
206
pt_BR/main.js
@ -1,206 +0,0 @@
|
||||
const intermezzo = new Uint8Array([
|
||||
0x44, 0x00, 0x9F, 0xE5, 0x01, 0x11, 0xA0, 0xE3, 0x40, 0x20, 0x9F, 0xE5, 0x00, 0x20, 0x42, 0xE0,
|
||||
0x08, 0x00, 0x00, 0xEB, 0x01, 0x01, 0xA0, 0xE3, 0x10, 0xFF, 0x2F, 0xE1, 0x00, 0x00, 0xA0, 0xE1,
|
||||
0x2C, 0x00, 0x9F, 0xE5, 0x2C, 0x10, 0x9F, 0xE5, 0x02, 0x28, 0xA0, 0xE3, 0x01, 0x00, 0x00, 0xEB,
|
||||
0x20, 0x00, 0x9F, 0xE5, 0x10, 0xFF, 0x2F, 0xE1, 0x04, 0x30, 0x90, 0xE4, 0x04, 0x30, 0x81, 0xE4,
|
||||
0x04, 0x20, 0x52, 0xE2, 0xFB, 0xFF, 0xFF, 0x1A, 0x1E, 0xFF, 0x2F, 0xE1, 0x20, 0xF0, 0x01, 0x40,
|
||||
0x5C, 0xF0, 0x01, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x01, 0x40
|
||||
]);
|
||||
|
||||
|
||||
|
||||
const RCM_PAYLOAD_ADDRESS = 0x40010000;
|
||||
const INTERMEZZO_LOCATION = 0x4001F000;
|
||||
const PAYLOAD_LOAD_BLOCK = 0x40020000;
|
||||
|
||||
|
||||
|
||||
function createRCMPayload(intermezzo, payload) {
|
||||
const rcmLength = 0x30298;
|
||||
|
||||
const intermezzoAddressRepeatCount = (INTERMEZZO_LOCATION - RCM_PAYLOAD_ADDRESS) / 4;
|
||||
|
||||
const rcmPayloadSize = Math.ceil((0x2A8 + (0x4 * intermezzoAddressRepeatCount) + 0x1000 + payload.byteLength) / 0x1000) * 0x1000;
|
||||
|
||||
const rcmPayload = new Uint8Array(new ArrayBuffer(rcmPayloadSize))
|
||||
const rcmPayloadView = new DataView(rcmPayload.buffer);
|
||||
|
||||
rcmPayloadView.setUint32(0x0, rcmLength, true);
|
||||
|
||||
for (let i = 0; i < intermezzoAddressRepeatCount; i++) {
|
||||
rcmPayloadView.setUint32(0x2A8 + i * 4, INTERMEZZO_LOCATION, true);
|
||||
}
|
||||
|
||||
rcmPayload.set(intermezzo, 0x2A8 + (0x4 * intermezzoAddressRepeatCount));
|
||||
rcmPayload.set(payload, 0x2A8 + (0x4 * intermezzoAddressRepeatCount) + 0x1000);
|
||||
|
||||
return rcmPayload;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function bufferToHex(data) {
|
||||
let result = "";
|
||||
for (let i = 0; i < data.byteLength; i++)
|
||||
result += data.getUint8(i).toString(16).padStart(2, "0");
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
async function write(device, data) {
|
||||
let length = data.length;
|
||||
let writeCount = 0;
|
||||
const packetSize = 0x1000;
|
||||
|
||||
while (length) {
|
||||
const dataToTransmit = Math.min(length, packetSize);
|
||||
length -= dataToTransmit;
|
||||
|
||||
const chunk = data.slice(0, dataToTransmit);
|
||||
data = data.slice(dataToTransmit);
|
||||
await device.transferOut(1, chunk);
|
||||
writeCount++;
|
||||
}
|
||||
|
||||
return writeCount;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function readFileAsArrayBuffer(file) {
|
||||
return new Promise((res, rej) => {
|
||||
const reader = new FileReader();
|
||||
reader.onload = e => {
|
||||
res(e.target.result);
|
||||
}
|
||||
reader.readAsArrayBuffer(file);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
function logOutput(...message) {
|
||||
document.getElementById("output").innerHTML = document.getElementById("output").innerHTML + message.join(" ") + "<br>";
|
||||
}
|
||||
|
||||
|
||||
|
||||
function clearLog() {
|
||||
document.getElementById("output").innerHTML = "";
|
||||
}
|
||||
|
||||
|
||||
|
||||
let device;
|
||||
|
||||
|
||||
|
||||
async function launchPayload(payload) {
|
||||
await device.open();
|
||||
logOutput(`Connected to ${device.manufacturerName} ${device.productName}`);
|
||||
|
||||
await device.claimInterface(0);
|
||||
|
||||
const deviceID = await device.transferIn(1, 16);
|
||||
logOutput(`Device ID: ${bufferToHex(deviceID.data)}`);
|
||||
|
||||
const rcmPayload = createRCMPayload(intermezzo, payload);
|
||||
logOutput("Sending payload...");
|
||||
const writeCount = await write(device, rcmPayload);
|
||||
logOutput("Payload sent!");
|
||||
|
||||
if (writeCount % 2 !== 1) {
|
||||
logOutput("Switching to higher buffer...");
|
||||
await device.transferOut(1, new ArrayBuffer(0x1000));
|
||||
}
|
||||
|
||||
logOutput("Trigging vulnerability...");
|
||||
const vulnerabilityLength = 0x7000;
|
||||
const smash = await device.controlTransferIn({
|
||||
requestType: 'standard',
|
||||
recipient: 'interface',
|
||||
request: 0x00,
|
||||
value: 0x00,
|
||||
index: 0x00
|
||||
}, vulnerabilityLength);
|
||||
}
|
||||
|
||||
|
||||
|
||||
document.getElementById("goButton").addEventListener("click", async () => {
|
||||
clearLog();
|
||||
var debugCheckbox = document.getElementById("shouldDebug");
|
||||
const payloadType = document.getElementById("payloadSelect").value;
|
||||
|
||||
let payload;
|
||||
if (payloadType === "hekate v5") {
|
||||
payload = hekate5;
|
||||
|
||||
} else if (payloadType === "hekate v4") {
|
||||
payload = hekate4;
|
||||
|
||||
} else if (payloadType === "fusee") {
|
||||
payload = fusee;
|
||||
|
||||
} else if (payloadType === "instaboot") {
|
||||
payload = instaboot;
|
||||
|
||||
} else if (payloadType === "uploaded") {
|
||||
const file = document.getElementById("payloadUpload").files[0];
|
||||
if (!file) {
|
||||
alert("You need to upload a file, to use an uploaded file.");
|
||||
return;
|
||||
}
|
||||
payload = new Uint8Array(await readFileAsArrayBuffer(file));
|
||||
} else {
|
||||
logOutput("<span style='color:red'>You're trying to load a payload type that doesn't exist.</span>");
|
||||
return;
|
||||
}
|
||||
|
||||
if(debugCheckbox.checked) {
|
||||
logOutput("Logging payload bytes...");
|
||||
|
||||
var payloadToLog = "";
|
||||
for (var i = 0; i < payload.length; i++) {
|
||||
payloadToLog += "0x" + payload[i].toString(16) + ", ".toUpperCase();
|
||||
}
|
||||
payloadToLog = payloadToLog.toUpperCase();
|
||||
logOutput(payloadToLog);
|
||||
return;
|
||||
}
|
||||
|
||||
logOutput("Requesting access to device...");
|
||||
device = await navigator.usb.requestDevice({ filters: [{ vendorId: 0x0955 }] });
|
||||
|
||||
logOutput(`<span style='color:blue'>Preparing to launch ${payloadType}...</span>`);
|
||||
launchPayload(payload);
|
||||
});
|
||||
|
||||
|
||||
|
||||
function onSelectChange() {
|
||||
if (document.getElementById("payloadSelect").value === "uploaded")
|
||||
document.getElementById("uploadContainer").style.display = "block"
|
||||
else
|
||||
document.getElementById("uploadContainer").style.display = "none"
|
||||
}
|
||||
|
||||
|
||||
|
||||
function openInfo() {
|
||||
if(document.getElementById("infodiv").innerHTML != "") {
|
||||
document.getElementById("infodiv").innerHTML = "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
function openInstructions() {
|
||||
if(document.getElementById("infodiv").innerHTML != "") {
|
||||
document.getElementById("infodiv").innerHTML = "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.getElementById("payloadUpload").addEventListener("change", () => document.forms.mainForm.payload.value = "uploaded");
|
2397
pt_BR/payloads.js
2397
pt_BR/payloads.js
File diff suppressed because one or more lines are too long
@ -1,64 +0,0 @@
|
||||
@import url('https://fonts.googleapis.com/css?family=Open+Sans');
|
||||
|
||||
@media only screen and (max-device-width: 768px) {
|
||||
#title h1 {
|
||||
font-size: 5vw;
|
||||
}
|
||||
|
||||
#pageBody, #mainForm h4, #goButton, #clearlogsbutton, .btn-group a, #title h4 {
|
||||
font-size: 3vw;
|
||||
}
|
||||
|
||||
#shouldDebug {
|
||||
width: 4vw;
|
||||
height: 4vw;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
margin-top: 0px;
|
||||
margin-left: 0px;
|
||||
margin-right: auto;
|
||||
font-family: 'Open Sans', sans-serif;
|
||||
}
|
||||
|
||||
#title {
|
||||
text-align: center;
|
||||
font-size: 1.5vw;
|
||||
padding-top: 10vw;
|
||||
padding-bottom: 10vw;
|
||||
background-size: cover;
|
||||
background-color: black;
|
||||
background-image: url("https://icdn1.digitaltrends.com/image/nintendo-switch-review-photos-pdx-580.jpg");
|
||||
color: white;
|
||||
margin-top: 0px;
|
||||
top: 0px;
|
||||
}
|
||||
|
||||
#uploadContainer {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
#output {
|
||||
height: 200px;
|
||||
border: 1px solid black;
|
||||
overflow: scroll;
|
||||
}
|
||||
|
||||
#page-footer {
|
||||
padding: 32px;
|
||||
background: #222528;
|
||||
color: whitesmoke;
|
||||
}
|
||||
|
||||
#disclaimer {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.divider-line {
|
||||
border-bottom: 1px solid gainsboro;
|
||||
}
|
||||
|
||||
.margin-top-md {
|
||||
margin-top: 24px;
|
||||
}
|
Loading…
Reference in New Issue
Block a user