-> Exploiting Savegames [TEIL 1]
############################################################ ###################
Hallo Leute,
Ich begrüße euch herzlichst zu dem 2. Teil über das Thema "Savegame Exploits"
Dank des Tutorials "Exploiting Savegames" wissen wir nun, wie wir Savegames exploiten können...
... jedoch müssen wir zuvor noch ein SDK anfertigen, bevor wir zum Coden beginnen können.
Wie ihr im Verlauf sehen werdet , spielt das SDK eine unheimlich wichtige Rolle, aber dazu mehr im Folgenden
(Es empfiehlt sich auf jeden Fall zuerst das andere TUT von mir zu lesen, da Einiges aufeinander aufbaut !)
Ein SDK für eueren Exploit erstellen
Aber was ist ein SDK ?
Nun, das SDK ist die Süd-Deutsche Krankenversicherung , natürlich nicht, Spass bei Seite ^^
Das SDK ist ein "Software Development Kit" , welches später euch und anderen Codern hilft , Software , also Binaries für eueren Savegame Exploit zu schreiben.
************************************************************ ********************************************
Unsere durch PRXTool erhaltene Liste an Funktionen
So, ich habe nicht ohne Grund geschrieben , das Einiges nun aufeinander aufbaut.
Wir benötigen jetzt unsere .txt Datei wieder , welche wir zuvor mit PRXTool erstellt haben.
Die Datei sollte unsere "Funktionen" beinhalten, mit ihren dazugehörigen "Stubs".
SDK.S
Wenn wir in einem Programm eine Funktion benutzen, z.B "sceIoOpen" um eine Datei zu öffnen , dann braucht der Compiler auch eine Addresse , wo er diese Funktion finden kann.
Anders gesagt: "Der Stub ist ein Funktion Caller"
Das SDK.S , das übrigens ein Assembler File ist , dient hier so zusagen als Inhaltsverzeichnis an Functionen für den Compiler.
Das heißt im Gegenzug aber auch, dass ihr nur Funktionen benützen könnt , die das Spiel importiert !
.macro AddNID funcname, nid
.globl \funcname
.ent \funcname
\funcname = \nid
.end \funcname
.endm
.file 1 "sdk.c"
.section .mdebug.eabi32
.section .gcc_compiled_long32
.previous
.text
.align 2
AddNID sceKernelDcacheWritebackInvalidateAll, 0x08ABC008
AddNID sceKernelDcacheWritebackAll, 0x08ABBFF8
AddNID sceIoOpen, 0x08ABBDC0
AddNID sceIoRead, 0x08ABBD50
AddNID sceIoClose, 0x08ABBD68
AddNID sceIoWrite, 0x08ABBD38
AddNID sceDisplaySetMode , 0x08ABC088
AddNID sceDisplaySetFrameBuf, 0x08ABC098
AddNID sceDisplayWaitVblankStart, 0x08ABC0A8
AddNID sceCtrlSetSamplingMode, 0x08ABC0B8
AddNID sceCtrlReadBufferPositive, 0x08ABC0C0
AddNID sceKernelExitGame, 0x08ABBE20
AddNID sceKernelDelayThread,0x08ABBEB8
AddNID ...
AddNID ...
.ident "VAL-SDK"
Wir wir gut erkennen können, besteht das SDK.S aus :
AddNID Funktionsname( zB. sceIoOpen) Stub( 0x08ABBDC0 )
In dieser Form wird das SDK.S später in das eigentliche SDK eingegliedert.
Nun habt ihr 2 Möglichkeiten:
Entweder ihr erstellt euer SDK.S manuell, sprich ihr gebt jede Funktion & Stub per Tastatur ein , was übrigens ziemlich lange dauern kann, da ein Spiel durchaus um die 100 Funktionen importiert haben kann.
oder
Ihr lasst den Computer für euch arbeiten, sprich wir benutzen ein Ruby File von dem "Hacker Wololo", welches unser SDK.S von ganz allein generiert.
Dieses .rb File könnt ihr im Anhang downloaden.
Dafür braucht ihr wieder mal eure Kompiler Kenntnisse.
Es empfiehlt sich Cygwin mit einem Ruby Addon installiert zu haben, da wir nun das Ruby File kompilieren müssen / können.
Ihr könnt aber auch einen Ruby Interpreter installieren. Den Windows Installer findet ihr ebenfalls im Anhang zum downloaden.
Dafür legen wir zuerst einen neuen Ordner an, wo wir das Ruby File (buildsdk.rb) und unsere mit prxtool erhaltene .txt Datei hinein kopieren.
Übrigens müsst ihr euere .txt datei in "functions.txt" umbennen.
Danach müsst ihr zu dem Ordner linken, also mit dem "cd" Befehl und dann kompilieren.
Hier ist der Code dafür:
cd /cygdrive/c/ wo auch immer euer Ordner ist /
./buildsdk.rb
Danach sollte sich in dem angelegten Ordner eine SDK.S befinden.
PRIMA
SDK.H
OK, nun nehmen wir mal die nächste Datei für unser SDK unter in Ansicht ^^
#include <pspdisplay.h>
#include <pspctrl.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspaudio.h>
#ifndef __VAL-SDK__
#define __VAL-SDK__
// Typedefs
typedef unsigned char byte;
#endif
Wie der Name schon sagt, ist SDK.H eine "Header Datei"
Header Dateien ?
Header Datein sind allgemein Ansammlungen von Deklarationen (Library), die hier in Bezug zur PSP fast immer gebraucht werden. Sie enthalten z.B. Definition von Funktionen und sind dazu da, damit Programmcode nicht immer neu entwickelt werden muss.
Wie wir hier sehen , werden: pspdisplay , pspctrl , pspkernel , pspdebug & pspaudio includiert. Das sind die am meisten gebräuchlichen Library´s für Savegame Exploits.
Linker.x
So, nun sind wir beim Linker.x angekommen. Erst mal der Code dafür:
OUTPUT_FORMAT("elf32-littlemips")
OUTPUT_ARCH(mips)
ENTRY(_start)
SECTIONS
{
. = 0x08810000;
.text.start : {
*(.text.start)
}
.text : {
*(.text)
}
.rodata : {
*(.rodata)
}
.data : {
*(.data)
}
.bss : {
*(.bss)
}
}
Linker.x spielt eine entscheidende Rolle im weiteren Verlauf.
Die Datei hat einen Zusammenhang mit unserem Shellcode und ebenfalls mit der main.c , in der sich später unser eigentlicher Code befinden wird.
Wer das erste Tutorial von mir gelesen hat, dem sollte nun ein ganz bestimmtes Value auffallen - das Value 0x08810000
Als wir uns im letzten TUT den Shellcode erklärt haben, sind wir nur oberflächlich darauf eingegangen. Das werden wir jetzt ändern !
Bevor sceIoRead mit der Anweisung jal aufgerufen wird , sieht man noch folgende Befehle:
lui $a1 , 0x0881 /* load upper immediate / lade 0x08810000 */
lui $a2, 1 /* lese 10 000 bytes von der Datei */
jal sceIoRead /* Call sceIoRead */
Diese gehören zur Funktion sceIoRead. Hier mal die Synax für die Funktion:
sceIoRead ( SceUID fd, void *data, SceSize size)
* fd - Der Name der Datei , die geöffnet werden soll
* data - Die Addresse im RAM, wo der Code zum Lesen hingeladen werden soll
* size - Bestimmt , wie viele Bytes gelesen werden sollen.
Also wenn wir die Syntax mit dem Assembler Ausschnitt vergleichen,
dann merken wir, das wir alles haben
* Wir haben den Namen der Datei
* Wir haben die Addresse ( 0x08810000 )
* und wir haben die Anzahl der Bytes die gelesen werden sollen (10 000)
Hier sollte es *Klick gemacht haben ,
der linker.x muss das selbe Value haben, wie wir schon zuvor im Shellcode bestimmt haben.
Sonst wird die Binary nicht ausgeführt.
Das heißt jedoch auch, dass wir nur 10 mb große Binaries erstellen können.
Das Makefile
PSPSDK=$(shell psp-config --pspsdk-path)
PSPDEV=$(shell psp-config --pspdev-path)
INCLUDE=$(PSPSDK)/include
all: main
clean:
rm -rf *~ *.o *.elf *.bin main.s *.bin
CC = psp-gcc
CFLAGS := -D PSP -I $(INCLUDE) -W -Wall -O2 -G0 -fno-pic -mno-abicalls -w -fomit-frame-pointer
ASM = psp-as
sdk.o: sdk.S
$(ASM) sdk.S -o sdk.o
main.o: main.c
$(CC) $(CFLAGS) -S main.c -o main.s
$(ASM) main.s -o main.o
main: main.o sdk.o linker.x
$(PSPDEV)/bin/psp-ld -T linker.x -L$(PSPSDK)/lib main.o sdk.o -o main.elf
$(PSPDEV)/bin/psp-strip -s main.elf
$(PSPDEV)/bin/psp-objcopy -O binary main.elf h.bin
Hierzu ist nur zusagen , dass das Makefile eure Binary erstellen wird.
************************************************************ ********************************************
Abspann
Also, an diesem Punkt sollten wir nun ein: sdk.s , sdk.h , linker.x & makefile haben.
In dem Anhang , welchen ihr downloaden könnt, findet ihr ebefalls die Dateien , die wir in diesem TUT bearbeitet haben.
Jedoch fehlt uns noch die Schlüsseldatei - die main.c
In der main.c wird sich unser ausführbarer Code befinden ^^
Dazu komme ich im wahrscheinlich letzten Tutorial zu diesem Thema
Bis dahin , habt Spass am Hacken !!!
ANHANG
############################################################ ###################
-> Exploiting Savegames [TEIL 3]
-> Exploiting Savegames [TEIL 1]