Il developer cragson presenta Nihonium, un nuovo framework C++, progettato per manipolare la memoria della console PlayStation 5.
Attualmente in fase di sviluppo, il framework è stato testato solo sul firmware 2.00, ma dovrebbe funzionare su tutti i firmware supportati dalla suite SDK di John Törnblom, che è un requisito essenziale per il suo utilizzo.
(for devs only), a C++ framework for memory manipulation on the Playstation 5 (PS5). (Note: Currently heavily work in progress)
"only tested on Firmware 2.00 but should work on all supported firmwares by the SDK"https://t.co/5AEOvAjWU9— BrutalSam (@BrutalSam_) February 11, 2025
Il framework sfrutta C++23 e offre una serie di strumenti avanzati per interagire con la memoria del kernel e altre funzionalità di sistema.
Configurazione e compilazione
- Clonare e compilare l’SDK di John Törnblom (basato su GNU/Linux):
wget https://github.com/ps5-payload-dev/sdk/releases/latest/download/ps5-payload-sdk.zip
sudo unzip -d /opt ps5-payload-sdk.zip
- Clonare Nihonium:
git clone git@github.com:cragson/nihonium
- (Opzionale) Effettuare il jailbreak della PS5 per inviare il payload direttamente dopo la compilazione.
- Impostare l’indirizzo IP corretto della PS5 all’interno del file
nihonium/debug.sh
. - Eseguire
nihonium/debug.sh
per compilare il payload e inviarlo alla PS5.
Caratteristiche del Framework
Di seguito sono elencate tutte le funzionalità disponibili del framework, spiegate e accompagnate da esempi pratici.
KernelMemory
- Questo modulo fornisce l’accesso a funzioni utili per la manipolazione del Kernel, come la lettura e la scrittura nella memoria del kernel.
ILibKernel – Interfaccia per Libkernel
Attualmente sono supportate le seguenti funzioni:
sceKernelSendNotificationRequest
sceKernelGetHwModelName
sceKernelGetHwSerialNumber
sceKernelGetCpuFrequency
sceKernelGetCpuTemperature
sceKernelGetSocSensorTemperature
Esempi
Di seguito viene riportata una serie di piccoli esempi che illustrano l’utilizzo delle diverse parti di questo framework, consentendo di testarne facilmente le funzionalità.
Come ottenere la base del testo del kernel
#include "kernel_memory.hpp" #include <print> int main() { const auto kernel_txt = KernelMemory::get_kernel_text_base(); std::println( "[+] kernel text: {:X}", kernel_txt ); return 0; }
Come ottenere la base dei dati del kernel
#include "kernel_memory.hpp" #include <print> int main() { const auto kernel_data = KernelMemory::get_kernel_data_base(); std::println( "[+] kernel data: {:X}", kernel_data ); return 0; }
Come leggere la memoria del kernel
#include "kernel_memory.hpp" #include <print> int main() { const auto kernel_txt = KernelMemory::get_kernel_text_base(); if(!kernel_txt) return 0; const auto buffer = KernelMemory::read_kernel< uint64_t >( kernel_txt ); std::println( "[+] First 8 bytes from kernel text: {:X}", buffer ); return 0; }
Come scrivere nella memoria del kernel
#include "kernel_memory.hpp" #include <print> int main() { const auto kernel_data = KernelMemory::get_kernel_data_base(); if(!kernel_data) return 0; if( KernelMemory::write_kernel< uint64_t >( kernel_data + 0x1337, 0xDEADAFFE ) ) std::println( "[+] Successfully wrote to memory!" ); else std::println( "[!] Failed to write to memory!" ); return 0; }
Come modificare la protezione della memoria di una regione di memoria nel kernel
#include "kernel_memory.hpp" #include <print> int main() { const auto pid = int32_t( 0x1337); const auto address = std::uintptr_t( 0xDEADBEEF ); constexpr auto PROT_READ = 0x01; constexpr auto PROT_WRITE = 0x02; constexpr auto PROT_EXEC = 0x04; if( KernelMemory::change_memory_protection( pid, address, 0x420, PROT_READ | PROT_WRITE | PROT_EXEC ) ) std::println( "[+] Successfully changed memory protection!" ); else std::println( "[!] Failed change memory protection!" ); return 0; }
Come recuperare un processo in base al suo pid
#include "kernel_memory.hpp" #include <print> int main() { const auto process = KernelMemory::get_process( 0x1337 ); std::println( "[+] process: {:X}", process ); return 0; }
Download: Source code Nihonium
Fonte: x.com