/* Global */
var context = {
// Confirm whether the user actually wants to initiate the dump
safety: false,
// Socket for the WebSockets server
socket: undefined,
};
/* Logging */
function log(message, level) {
level = (typeof level !== 'undefined') ? level : 'log';
// Escape message
var message = message.toString()
.replace(/&/g, "&")
.replace(//g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
// Print message
var logs = document.getElementById('logs-internal');
switch (level) {
case 'log':
var color = '#fff'; break;
case 'warn':
var color = '#ff0'; break;
case 'error':
var color = '#f00'; break;
default:
var color = '#fff'; break;
}
logs.innerHTML += `${message}
`;
}
if (typeof console != 'undefined') {
var levels = ['log', 'warn', 'error'];
levels.forEach(function (level) {
var original = '_' + level;
if (typeof console[level] != 'undefined') {
console[original] = console[level];
} else {
console[original] = function () {};
}
});
}
console.log = ((msg) => { console._log(msg); log(msg, 'log'); });
console.warn = ((msg) => { console._warn(msg); log(msg, 'warn'); });
console.error = ((msg) => { console._error(msg); log(msg, 'error'); });
/* WebSockets */
function ws_init() {
// Handlers
var enable_ws = function () {
transfer_mode("ws");
var info_ws = document.getElementById(`info-ws`);
info_ws.innerHTML = `Detected: ${context.socket.url}`;
}
var disable_ws = function () {
transfer_mode("usb");
var button_ws = document.getElementById(`output-ws`);
button_ws.classList.add("disabled");
}
// Connect to server
try {
context.socket = new WebSocket(`ws://${window.location.host}/ws`);
} catch (e) {
disable_ws();
}
context.socket.onopen = enable_ws;
context.socket.onerror = disable_ws;
context.socket.binaryType = "arraybuffer";
}
/* Tranfer */
function transfer_mode(mode) {
context.transfer_mode = mode;
var button_usb = document.getElementById(`output-usb`);
var button_ws = document.getElementById(`output-ws`);
if (mode == 'ws' && !button_ws.classList.contains('disabled')) {
button_ws.classList.add("active");
button_usb.classList.remove("active");
}
if (mode == 'usb' && !button_usb.classList.contains('disabled')) {
button_usb.classList.add("active");
button_ws.classList.remove("active");
}
}
function transfer_blob(name, data) {
if (context.transfer_mode == 'ws') {
context.socket.send(name);
context.socket.send(data);
}
if (context.transfer_mode == 'usb') {
throw 'Unimplemented';
}
}
/* Dumper */
function start() {
/* Ask the user for confirmation */
if (context.safety) {
var msg = '';
msg += 'Are you sure you want to dump your system files?\n';
msg += 'This process could take few minutes.';
if (!confirm(msg)) {
return;
}
}
/* Load and execute exploit */
var script = document.createElement('script');
script.onload = function () {
exploit();
};
script.src = context.base + 'exploit.js';
document.body.appendChild(script);
/* Update interface */
document.onclick = undefined;
}
function main() {
ws_init();
var found = navigator.userAgent.match(/PlayStation 4 ([0-9]+\.[0-9]+)/);
if (found) {
var version = found[1];
console.log(`Detected PlayStation 4 on version ${version}`);
switch (version) {
case '4.55':
context.base = 'exploit/455/';
break;
case '5.00':
context.base = 'exploit/500/';
break;
case '5.01':
context.base = 'exploit/500/';
break;
default:
alert("This PlayStation 4 sofware version is not supported");
}
} else {
console.error("Run this on the target PlayStation 4 machine");
}
}
document.addEventListener("DOMContentLoaded", main);