KINGx - Das inoffizielle PlayStation Forum & News Portal

Normale Version: [TUT-1] Binarys für ein Exploit - Mercury
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
So, hi alle zusammen!

Erstmal: Sorry, falls die Zeilenumbrüche beschissen sind, ich habe dieses TUT offline mit Notepad++ geschrieben Wink
Wer Fehler findet, bitte melden (ich meine mir melden, nicht einem Moderator Tongue)
Dieses Tutorial ist größtenteils eine reine Übersetztung von FreePlays Code, deshalb danke an ihn Smile

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) Big Grin)
- 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 Wink)
- 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 Smile)
- 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 Smile
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 Wink

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:

Code:
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:

crt0.c :
int main(void);


Der Prototyp meiner main Funktion.

crt0.c :
void _start(unsigned long, unsigned long *) __attribute__ ((section (".text.start")));


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.

crt0.c :
void _start(unsigned long arglen, unsigned long *argp)
{
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:

Code:
#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:

Code:
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:

Code:
int main(void)
{
    sceKernelDcacheWritebackAll();
    initScreenAndCtrl();
    Fillvram(colours[INDEX_BLACK]);


Ja, jetzt kommt unsere main Funktion Smile
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.

Code:
    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 Big Grin

Ihr könnt jetzt die main.c Datei schließen.
Jetzt erstellt eine Datei namens "linkfile.l" und schreibt hinein:

Code:
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 Tongue
Nur mal ne kurze Erklährung:

Code:
ENTRY(_start)


Deshalb muss die Funktion "void _start(...)" heißen Smile

Code:
    . = 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:

Code:
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 Tongue

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 Smile

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 Wink
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:

Code:
prxtool -f -n psplibdoc.xml paf.prx


Dann den NID suchen und in Mercury mit folgender Syntax initialisieren:
Bei EU Version:

Code:
int (* Funktion) (Parameter oder void) = (void *) (0x0880406C + NID);


Bei US Version:

Code:
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 Wink
Grund: Zu instabil um groß dafür zu coden xD


mfg, HacKmaN

HacKmaN :
Spoiler: (anzeigen)


Super echt klasse!
Lerne auch grade C/++ und da ist das sehr hilfreich!

PS: Freue mich schon auf das Tiff Tut!!!

Danke... ;D

D!S :

HacKmaN :
Spoiler: (anzeigen)


Super echt klasse!
Lerne auch grade C/++ und da ist das sehr hilfreich!

PS: Freue mich schon auf das Tiff Tut!!!

Danke... ;D


Danke Smile
Ich arbeite schon dran xD

HacKmaN :

D!S :

HacKmaN :
Spoiler: (anzeigen)


Super echt klasse!
Lerne auch grade C/++ und da ist das sehr hilfreich!

PS: Freue mich schon auf das Tiff Tut!!!

Danke... ;D


Danke Smile
Ich arbeite schon dran xD


Ok,danke!
Echt klasse...
Melde dich wenn du es fertig hast Big Grin

Danke !
Hast dir sehr viel Mühe gegeben thumb
Danke gutes tut^^

pspbricker :
Danke !
Hast dir sehr viel Mühe gegeben thumb


20 Minuten in denen ich eigentlich Latein lernen sollte xD

Echt hammer TUT
Respect Wink

LG
Yata
Danke Smile
Ganz brauchbares TUT, aber man kann auch andere Imports, als von der paf benutzen^^
Stimmt.
Sorry, ich hab das mit der paf mehr so als Beispiel gemeint Wink
Naja, danke, wenn ich an nen PC komme bessere ichs aus.
Wenn du einen Savegame Exploit hast musst du Imports vom Game nehmen(EBOOB.BIN)

Total_Noob :
Wenn du einen Savegame Exploit hast musst du Imports vom Game nehmen(EBOOB.BIN)

Du meinst wohl "eboot.bin"Wink
(Ist nicht böse gemeint)
mfg.flo

Danke, ich habs grad gemerkt, wenn man die Imports wie in Tut benutzt, crasht die PSP.
Ich bin im Moment mit der PSP on und kann deshalb meinen 'etwas' langen Post nicht editieren (die PSP hat nen Zeichen Eingabe Limit), wenn ich wieder an nen PC mit Netzt komm, update ich das Tutorial (und bessere die etwas misslungenen Sätze aus.)
Ansonsten:
Einfach die EBOOT.BIN aus nem SK von Mercury nehmen, mit prxdecr. decrypten und dann mit folgendem Befehl die NIDs bekommen:
prxtool -f -n psplibdoc.xml EBOOT.BIN

Total_Noob :
Wenn du einen Savegame Exploit hast musst du Imports vom Game nehmen(EBOOB.BIN)

Falsch. Man muss nicht die Imports des Games nehmen, man kann alle usermode Imports benutzen, die von einem Modul, das im usermode geladen wird, benutzen.

Seiten: 1 2
Referenz-URLs