Erstmal: Sorry, falls die Zeilenumbrüche beschissen sind, ich habe dieses TUT offline mit Notepad++ geschrieben
Wer Fehler findet, bitte melden (ich meine mir melden, nicht einem Moderator )
Dieses Tutorial ist größtenteils eine reine Übersetztung von FreePlays Code, deshalb danke an ihn
Ich hab mich ja wie schon oft gesagt viel mit exploit beschäftigt, und hab mich dazu entschieden 2 kleine Tutorials zu machen:
- Eins für Mercury (mit dem SDK von FreePlay)
- Eins für das 5.03 TIFF Exploit (für dass gibt es kein SDK)
Danke an:
- Team C+D: Das Mercury Exploit, den Binary loader und das NET ifHandle Kernel-Mode Exploit (UnlockKmem_9A6261EC(NetIfhandle_lib_9A6261EC) )
- FreePlay: Für das veröffentlichen des Exploits und das SDK (ja, ich danke im dafür, ohne ihn hätte ich womöglich nie für ein GameSploit gecodet )
- Raiden1996: Für seine großartige Hilfe in sachen Function Imports und MIPS Programmierung
- PSPDEV: Für das Modul Tutorial und das perfekte Forum
- lan.st: Für das super Forum (dort und auf PSPDEV kann man so viel lernen )
- Jeden den ich vergessen habe
Was jeder haben sollte, der dieses Tutorial liest:
- Grundkenntnisse in C
- Damit es besser verständlich ist empfehle ich auch Grundlagen in MIPS
- Eine Mercury UMD (ein SK ist empfehlenswert, die ideotisch langen Ladezeiten sind beim coden echt nervig)
- Eine eingerichtete Entwicklungsumgebung, egal ob MinPSPw oder Cygwin
- Dieses Packet. Es enthält den Binary loader von FreePlay/Team C+D und das FreePlay's SDK.
/* Wenn ihr Funktionen importieren wollt (in diesem TUT aber nicht ausführlich besprochen), braucht ihr auch folgendes: */
- PRXTOOL von PSPDEV.org
- Die paf.prx eurer Firmware und die Libdoc von SilverSpring
Also fangen wir mal an
Entpackt das gedownloadete Archiv irgendwo auf der Festplatte und geht in den Ordner wo die Datei header Datei "mercury_sdk" und der Ordner "Includes" sind.
Euch ist sicher aufgefallen, dass weder eine Quelldatei noch eine Makefile vorhanden ist... Die erstellen wir miteinander
Erstellt euch jetzt eine Datei namens "crt0.c". Aus dieser Datei werden wir den main-thread deklinieren und laden.
Öffnet die Datei und gebt folgende Zeile ein:
int main(void);
void _start(unsigned long, unsigned long *) __attribute__ ((section (".text.start")));
void _start(unsigned long arglen, unsigned long *argp)
{
main();
while(1);
};
Die Erklährung:
Der Prototyp meiner main Funktion.
Jeder der MIPS kann weiß, dass der Hauptspeicher in verschiedene Sektionen aufgeteilt ist (z.B. ".data" für Variablen und ".text" für Funktionen).
Wenn das Exploit geladen wird, wird die Sektion ".text.start" ausgeführt. Durch diese Zeile weiß der Compiler, wo der Ausführbare Bereich beginnt.
Warum es _start sein muss, erklähr ich später.
{
main();
while(1);
};
Übersetzt: Starte die Funktion "main(void)" und warte wenn sie beendet wird für immer.
So. Jetzt schließt die crt0.c, erstellt euch die Datei main.c, öffnet sie und schreibt folgendet Text hinein:
#include "mercury_sdk.h"
#include "crt0.c"
#define SCREEN_WIDTH 512
#define SCREEN_HEIGHT 272
#define LINESIZE 512
#define CMAX_X 60
#define CMAX_Y 38
#define FRAMESIZE 0xAA000
#define INDEX_BLACK 10
#define INDEX_WHITE 1
#define INDEX_PINK 2
#define INDEX_RED 3
#define INDEX_BLUE 4
#define INDEX_GREEN 5
#define INDEX_YELLOW 6
#define INDEX_CYAN 7
#define INDEX_GRAY 9
#define INDEX_DARKGREEN 0
#define RANDOM rand()%9
unsigned char *vramtop=(unsigned char *)0x04000000;
unsigned long drawframe;
unsigned char *GetVramAddr(unsigned long x, unsigned long y)
{
return vramtop + (drawframe?FRAMESIZE:0) + x*4 + y*LINESIZE*4 + 0x40000000;
}
unsigned long colours[11] =
{
0x00008800L,
0x00FFFFFFL,
0x00FF00FFL,
0x000000FFL,
0x00FF0000L,
0x0000FF00L,
0x0000FFFFL,
0x00FFFF00L,
0x00FFFF88L,
0x00888888L,
0x00000000L
};
const unsigned char font[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00,
0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,
0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00,
0x30,0x7C,0xC0,0x78,0x0C,0xF8,0x30,0x00,
0x00,0xC6,0xCC,0x18,0x30,0x66,0xC6,0x00,
0x38,0x6C,0x38,0x76,0xDC,0xCC,0x76,0x00,
0x60,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,
0x18,0x30,0x60,0x60,0x60,0x30,0x18,0x00,
0x60,0x30,0x18,0x18,0x18,0x30,0x60,0x00,
0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,
0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x60,
0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,
0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,
0x7C,0xC6,0xCE,0xDE,0xF6,0xE6,0x7C,0x00,
0x30,0x70,0x30,0x30,0x30,0x30,0xFC,0x00,
0x78,0xCC,0x0C,0x38,0x60,0xCC,0xFC,0x00,
0x78,0xCC,0x0C,0x38,0x0C,0xCC,0x78,0x00,
0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x1E,0x00,
0xFC,0xC0,0xF8,0x0C,0x0C,0xCC,0x78,0x00,
0x38,0x60,0xC0,0xF8,0xCC,0xCC,0x78,0x00,
0xFC,0xCC,0x0C,0x18,0x30,0x30,0x30,0x00,
0x78,0xCC,0xCC,0x78,0xCC,0xCC,0x78,0x00,
0x78,0xCC,0xCC,0x7C,0x0C,0x18,0x70,0x00,
0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,
0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x60,
0x18,0x30,0x60,0xC0,0x60,0x30,0x18,0x00,
0x00,0x00,0xFC,0x00,0x00,0xFC,0x00,0x00,
0x60,0x30,0x18,0x0C,0x18,0x30,0x60,0x00,
0x78,0xCC,0x0C,0x18,0x30,0x00,0x30,0x00,
0x7C,0xC6,0xDE,0xDE,0xDE,0xC0,0x78,0x00,
0x30,0x78,0xCC,0xCC,0xFC,0xCC,0xCC,0x00,
0xFC,0x66,0x66,0x7C,0x66,0x66,0xFC,0x00,
0x3C,0x66,0xC0,0xC0,0xC0,0x66,0x3C,0x00,
0xF8,0x6C,0x66,0x66,0x66,0x6C,0xF8,0x00,
0xFE,0x62,0x68,0x78,0x68,0x62,0xFE,0x00,
0xFE,0x62,0x68,0x78,0x68,0x60,0xF0,0x00,
0x3C,0x66,0xC0,0xC0,0xCE,0x66,0x3E,0x00,
0xCC,0xCC,0xCC,0xFC,0xCC,0xCC,0xCC,0x00,
0x78,0x30,0x30,0x30,0x30,0x30,0x78,0x00,
0x1E,0x0C,0x0C,0x0C,0xCC,0xCC,0x78,0x00,
0xE6,0x66,0x6C,0x78,0x6C,0x66,0xE6,0x00,
0xF0,0x60,0x60,0x60,0x62,0x66,0xFE,0x00,
0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0x00,
0xC6,0xE6,0xF6,0xDE,0xCE,0xC6,0xC6,0x00,
0x38,0x6C,0xC6,0xC6,0xC6,0x6C,0x38,0x00,
0xFC,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00,
0x78,0xCC,0xCC,0xCC,0xDC,0x78,0x1C,0x00,
0xFC,0x66,0x66,0x7C,0x6C,0x66,0xE6,0x00,
0x78,0xCC,0xE0,0x70,0x1C,0xCC,0x78,0x00,
0xFC,0xB4,0x30,0x30,0x30,0x30,0x78,0x00,
0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xFC,0x00,
0xCC,0xCC,0xCC,0xCC,0xCC,0x78,0x30,0x00,
0xC6,0xC6,0xC6,0xD6,0xFE,0xEE,0xC6,0x00,
0xC6,0xC6,0x6C,0x38,0x38,0x6C,0xC6,0x00,
0xCC,0xCC,0xCC,0x78,0x30,0x30,0x78,0x00,
0xFE,0xC6,0x8C,0x18,0x32,0x66,0xFE,0x00,
0x78,0x60,0x60,0x60,0x60,0x60,0x78,0x00,
0xC0,0x60,0x30,0x18,0x0C,0x06,0x02,0x00,
0x78,0x18,0x18,0x18,0x18,0x18,0x78,0x00,
0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x78,0x0C,0x7C,0xCC,0x76,0x00,
0xE0,0x60,0x60,0x7C,0x66,0x66,0xDC,0x00,
0x00,0x00,0x78,0xCC,0xC0,0xCC,0x78,0x00,
0x1C,0x0C,0x0C,0x7C,0xCC,0xCC,0x76,0x00,
0x00,0x00,0x78,0xCC,0xFC,0xC0,0x78,0x00,
0x38,0x6C,0x60,0xF0,0x60,0x60,0xF0,0x00,
0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0xF8,
0xE0,0x60,0x6C,0x76,0x66,0x66,0xE6,0x00,
0x30,0x00,0x70,0x30,0x30,0x30,0x78,0x00,
0x0C,0x00,0x0C,0x0C,0x0C,0xCC,0xCC,0x78,
0xE0,0x60,0x66,0x6C,0x78,0x6C,0xE6,0x00,
0x70,0x30,0x30,0x30,0x30,0x30,0x78,0x00,
0x00,0x00,0xCC,0xFE,0xFE,0xD6,0xC6,0x00,
0x00,0x00,0xF8,0xCC,0xCC,0xCC,0xCC,0x00,
0x00,0x00,0x78,0xCC,0xCC,0xCC,0x78,0x00,
0x00,0x00,0xDC,0x66,0x66,0x7C,0x60,0xF0,
0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0x1E,
0x00,0x00,0xDC,0x76,0x66,0x60,0xF0,0x00,
0x00,0x00,0x7C,0xC0,0x78,0x0C,0xF8,0x00,
0x10,0x30,0x7C,0x30,0x30,0x34,0x18,0x00,
0x00,0x00,0xCC,0xCC,0xCC,0xCC,0x76,0x00,
0x00,0x00,0xCC,0xCC,0xCC,0x78,0x30,0x00,
0x00,0x00,0xC6,0xD6,0xFE,0xFE,0x6C,0x00,
0x00,0x00,0xC6,0x6C,0x38,0x6C,0xC6,0x00,
0x00,0x00,0xCC,0xCC,0xCC,0x7C,0x0C,0xF8,
0x00,0x00,0xFC,0x98,0x30,0x64,0xFC,0x00,
0x1C,0x30,0x30,0xE0,0x30,0x30,0x1C,0x00,
0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x00,
0xE0,0x30,0x30,0x1C,0x30,0x30,0xE0,0x00,
0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
void Fillvram(unsigned long color)
{
unsigned char *vptr0;
unsigned long i;
vptr0 = GetVramAddr(0, 0);
for (i = 0; i < (FRAMESIZE/4); i++)
{
*(unsigned long *)vptr0 = color;
vptr0 += 4;
}
}
void PutChar(unsigned long x, unsigned long y, unsigned long color, unsigned long bgcolor, unsigned char ch, char drawfg, char drawbg, char mag)
{
unsigned char *vptr0;
unsigned char *vptr;
const unsigned char *cfont;
unsigned long cx, cy;
unsigned long b;
char mx, my;
cfont = font + ch*8;
vptr0=GetVramAddr(x, y);
for (cy = 0; cy < 8; cy++)
{
for (my = 0; my < mag; my++)
{
vptr = vptr0;
b = 0x80;
for (cx = 0; cx < 8; cx++)
{
for (mx = 0; mx < mag; mx++)
{
if ((*cfont&b) != 0)
{
if (drawfg) // Die Schrift selber, sollte aktiviert bleiben ;)
{
*(unsigned long *)vptr = color;
};
}
else
{
// Der Hintergrund, ich hab ihn in der Print() Funktion deaktiviert, wenn benötigt den vorletzten Param auf 1 stellen :)
if (drawbg)
{
*(unsigned long *)vptr = bgcolor;
};
};
vptr += 4;
};
b = b>>1;
};
vptr0 += LINESIZE*4;
};
cfont++;
};
};
void Print(unsigned long x, unsigned long y, unsigned long color, const char *str)
{
while (*str != 0 && x < CMAX_X && y < CMAX_Y)
{
// Ich hab die Hintergrundfarbe deaktiviert
PutChar(x*8, y*8, color, 0, *str, 1, 0, 1);
str++;
x++;
if (x >= CMAX_X)
{
x = 0;
y++;
}
}
}
void changeBuffer()
{
sceDisplayWaitVblankStart();
sceDisplaySetFrameBuf((void*)GetVramAddr(0,0), 512, PSP_DISPLAY_PIXEL_FORMAT_8888, 0);
drawframe=(drawframe?0:1);
}
void initScreenAndCtrl()
{
drawframe = 0;
sceDisplaySetMode(0,SCREEN_WIDTH,SCREEN_HEIGHT);
sceDisplaySetFrameBuf((void*)vramtop, 512, PSP_DISPLAY_PIXEL_FORMAT_8888, 1);
Fillvram(0x00000000);
drawframe = 1;
Fillvram(0x00000000);
sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(1);
}
Auf diese Zeilen geh ich jetzt nicht weiter ein, sie die Funktionen "Print" etc. wurden bis jetzt in jedem Exploit verwendet, da man
mit wenigen Änderungen erreichen kann, das keine Funktionen erreicht werden (nach dem TIFF Tutorial werdet ihr verstehen was ich meine).
Wenn ihr nicht wisst was mit dem "0x04000000" gemeint ist, das ist ganz einfach: 0x04000000 ist die Addresse des VRAMs der PSP.
Die anderen Speicher Addressen, die ihr vielleicht mal brauchen könntet:
0x00010000: Scratch pad (fast unnützt, nur 16kb groß)
0x04000000: VRAM
0x44000000: VRAM Cache
0x08800000: Main RAM (diese Addresse werdet ihr im TIFF Tutorial brauchen)
0x48800000: Main RAM Cache
0x88000000: Kernel RAM
Also zurück zu main.c:
Jetzt fügt diese Zeilen hinzu:
int main(void)
{
sceKernelDcacheWritebackAll();
initScreenAndCtrl();
Fillvram(colours[INDEX_BLACK]);
Ja, jetzt kommt unsere main Funktion
Die ersten 2 Funktionen sind eigentlich nur zum Initialisieren des SDKs etc. und die Funktion Fillvram(colours[INDEX_BLACK]) füllt den Bildschirm
mit schwarzer Farbe.
SceCtrlData pad;
sceCtrlSetSamplingMode(1);
while(1)
{
pad.Buttons = 0;
sceCtrlReadBufferPositive(&pad, 1);
Print(0, 1, colours[INDEX_WHITE], "Hurra, ich hab gerade mein erstes Programm");
Print(0, 2, colours[INDEX_WHITE], "Savegame Exploit gecodet!");
Print(0, 3, colours[INDEX_WHITE], "$ony hat keine Chance mehr :P");
changeBuffer();
if(pad.Buttons & PSP_CTRL_CROSS)
{
Print(0, 5, colours[INDEX_RED], "Servus");
changeBuffer();
sceKernelDelayThread(150000);
break;
};
};
sceKernelExitGame();
return 0;
};
Zu diesen Zeilen denk ich mal muss ich auch nicht so viel sagen, wer dass nicht kapiert, sollte sich noch mal mit den Grundkenntnissen beschäftigen
Ihr könnt jetzt die main.c Datei schließen.
Jetzt erstellt eine Datei namens "linkfile.l" und schreibt hinein:
OUTPUT_FORMAT("elf32-littlemips")
OUTPUT_ARCH(mips)
ENTRY(_start)
SECTIONS
{
. = 0x09FD0C00;
.text.start :
{
*(.text.start)
}
.text :
{
*(.text)
}
.rodata :
{
*(.rodata)
}
.data :
{
*(.data)
}
.bss :
{
*(.bss)
}
}
So, jetzt müsste man halt MIPS können
Nur mal ne kurze Erklährung:
ENTRY(_start)
Deshalb muss die Funktion "void _start(...)" heißen
. = 0x09FD0C00;
Die binary wird auf die Addresse "0x09FD0C00" geladen, später wichtig fürs TIFF!
Mit den anderen Zeilen werden die einzelnen Hauptspeicher Sektionen zugeordnet.
UUUND die makefile:
PSPSDK=$(shell psp-config --pspsdk-path)
PSPDEV=$(shell psp-config --pspdev-path)
INCLUDE=$(PSPSDK)/include
all: us eu
clean:
rm -rf *~ *.o *.elf *.bin *.s *.bin
CC = psp-gcc
CFLAGS := $(INCLUDES) -W -Wall -G0 -fno-pic -mno-abicalls -w
FLAGS_US := -DMERCURY_US
FLAGS_EU := -DMERCURY_EU
ASM = psp-as
main_us.o: main.c mercury_sdk.h
$(CC) $(CFLAGS) $(FLAGS_US) -S main.c -o main_us.s
$(ASM) main_us.s -o main_us.o
main_eu.o: main.c mercury_sdk.h
$(CC) $(CFLAGS) $(FLAGS_EU) -S main.c -o main_eu.s
$(ASM) main_eu.s -o main_eu.o
us: main_us.o linkfile.l
$(PSPDEV)/bin/psp-ld -T linkfile.l -o main_us.elf -L$(PSPSDK)/lib main_us.o
$(PSPDEV)/bin/psp-strip -s main_us.elf
$(PSPDEV)/bin/psp-objcopy -O binary main_us.elf mercury_us.bin
eu: main_eu.o linkfile.l
$(PSPDEV)/bin/psp-ld -T linkfile.l -o main_eu.elf -L$(PSPSDK)/lib main_eu.o
$(PSPDEV)/bin/psp-strip -s main_eu.elf
$(PSPDEV)/bin/psp-objcopy -O binary main_eu.elf mercury_eu.bin
Das ist die original makefile von FreePlay, für ein so kleines Programm ist sie OK
So, jetzt erstellt ihr das Projekt mit dem Befehl "make".
Kompiert jetzt die beiden Ordner aus dem Ordner "Bin_loader" in dem Download oben nach ms0:/PSP/SAVEGAME und die beiden Binary Dateien (je nach mercury
Version) ins Root des MemorySticks.
Startet Mercury, ladet den Spielstand und geniest unlizensierten Code auf PSPs mit niedriger Firmware als 6.20
Jetzt werdet ihr euch denken: Öch, was erzählt denn dieser HacKmaN ständig für eine Scheiße? Das ist doch nicht schwieriger zu coden als ne EBOOT!
Naja, wie dem so sei, wenn ihr zum ersten mal versucht eine Datei zu inkludieren, werdet ihr eine böse Überraschung erleben^^
Entweder der Compiler findet die Datei nicht, oder wenn er sie nach etwas herumbasteln in der makefile findet, wird es euch nichts bringen:
1. Mache Headerdateien wie pspctrl.h werden nicht mit dem SDK kompatibel sein, "blablabla was already decleared..."
2. In den Headerdateien des PSPSDKs stehen nur Funktions-Prototypen, die Funktionen im pspsdk wurden keinesfalls neu geschrieben,
sondern sind Zeiger auf die NIDs der Funktionen. Diese NIDs ändern sich mit so ziemlich jeder Firmware, deshalb ist es unmöglich die aus dem SDK zu benutzten.
Also müssen wir das salbe machen: Die Funktionen mit über ihre NIDs importieren, daher der Name "Funktion import".
Also, wie importieren wir jetzt Funktionen???
Nun ja, das ist nicht so einfach wie er ausschaut. Ich werde mich jetzt auch nicht groß damit beschäftigen, teilweiße hab ichs selbst noch nicht verstanden
Nur mal die Gundlagen:
Irgendwo auf der HD nen Ordner erstellen, SilverSprings Dokumentation und eine decryptete paf.prx reinkopieren, CMD starten, mit CD in den Ordner wechseln
und dann folgendes eingeben:
prxtool -f -n psplibdoc.xml paf.prx
Dann den NID suchen und in Mercury mit folgender Syntax initialisieren:
Bei EU Version:
int (* Funktion) (Parameter oder void) = (void *) (0x0880406C + NID);
Bei US Version:
int (* Funktion) (Parameter oder void) = (void *) (0x08804000 + NID);
Das ist NICHT getestet, sollte aber funktionieren.
Es können auch keine Libarys genutzt werden, daher können Libs wie OSLib oder VLF nicht genutzt werden, diese müssen neu geschrieben werden.
Naja, ich denke das reicht erstmal, das TIFF Tutorial kommt bald (kann aber noch ein bisschen dauern xD).
Und ich verspreche euch, das wird komplizierter, denn fürs 5.03 TIFF gibt es weder ein SDK noch irgendeine Dokumentation oder ein Tutorial
Grund: Zu instabil um groß dafür zu coden xD
mfg, HacKmaN