KINGx - Das inoffizielle PlayStation Forum & News Portal

Normale Version: [TUT] Exploiting Savegames [TEIL 2]
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
-> Exploiting Savegames [TEIL 3]

-> 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... Big Grin

... 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 Big Grin Big Grin Big Grin , 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 !

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

Code:
cd  /cygdrive/c/ wo auch immer euer Ordner ist /
./buildsdk.rb


Danach sollte sich in dem angelegten Ordner eine SDK.S befinden.
PRIMA Smile





SDK.H


OK, nun nehmen wir mal die nächste Datei für unser SDK unter in Ansicht ^^


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

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

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



* 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 Wink ,
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


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


ANHANG



############################################################ ###################


-> Exploiting Savegames [TEIL 3]

-> Exploiting Savegames [TEIL 1]

Wie beim letzten Tutorial: Sehr schön Smile
wär nur noch toll ein vid mit ergebnis zu sehen
Super TUT!
TUT 3 kommt bald.

In TUT 3 werden wir genauer auf die main.c eingehen, wo sich unser eigentlicher Code befinden wird.
Wir werden ein Hello World für Savegame Exploits coden.

Bis dahin , mfg
Darxploit
Kleiner Fehler, es muss "functions.txt" beim umbenennen heißen, ansonsten Super Tut

Sparky :
Kleiner Fehler, es muss "functions.txt" beim umbenennen heißen, ansonsten Super Tut


Danke , habs behoben thumb

Sehr gut Smile

Bzw:
Hier ist für die die nicht immer Internet haben und trotzdem dran arbeiten wolln der Download der beiden TuT´s als PDF :
http://www.multiupload.com/C044PIEZEH
Ich bin dafür, dass diese Tutorials gepinnt werden!

fixit98 :
Sehr gut Smile

Bzw:
Hier ist für die die nicht immer Internet haben und trotzdem dran arbeiten wolln der Download der beiden TuT´s als PDF :
http://www.multiupload.com/C044PIEZEH


Hey, echt super von dir, das auf pdf zu machen thumb

aber ich heiss Darxploit , nicht darksploit Rollende-Augen

DarXPloit_$a1 :

fixit98 :
Sehr gut Smile

Bzw:
Hier ist für die die nicht immer Internet haben und trotzdem dran arbeiten wolln der Download der beiden TuT´s als PDF :
http://www.multiupload.com/C044PIEZEH


Hey, echt super von dir, das auf pdf zu machen thumb

aber ich heiss Darxploit , nicht darksploit Rollende-Augen


Ja,ist mir nacher auch aufgefallen Wink Naja es geht ja um den guten Willen Smile

Nochmals die selbe Anregung von mir mit dem Delay Slot Wink


statt:

Code:

lui $a1 , 0x0881 /* load upper immediate / lade 0x08810000 */
lui $a2, 1 /* lese 10 000 bytes von der Datei */
jal sceIoRead /* Call sceIoRead */


bitte:

lui $a1 , 0x0881 /* load upper immediate / lade 0x08810000 */
jal sceIoRead /* Call sceIoRead */
lui $a2, 1 /* lese 10 000 bytes von der Datei */

Achja, in dem Pic hast du "li" verwendet, load immediate. Wie schon gesagt, load immediate ist nicht "lui" sondern, "lui" + "addiu".

Wenn du schreibst:
li $t0, 2, dann ist $t0 = 0x00000002
das erreichst du nur mit ori $t0, $zero, 2

Also: li ist nicht lui Wink


Ansonsten gutes Tut.

PSP_Lord :
Nochmals die selnbe Anregung von mir mit dem Delay Slot Wink


statt:

Code:

lui $a1 , 0x0881 /* load upper immediate / lade 0x08810000 */
lui $a2, 1 /* lese 10 000 bytes von der Datei */
jal sceIoRead /* Call sceIoRead */


bitte:

lui $a1 , 0x0881 /* load upper immediate / lade 0x08810000 */
jal sceIoRead /* Call sceIoRead */
lui $a2, 1 /* lese 10 000 bytes von der Datei */

Achja, in dem Pic hast du "li" verwendet, load immediate. Wie schon gesagt, load immediate ist nicht "lui" sondern, "lui" + "addiu".

Wenn du schreibst:
li $t0, 2, dan ist $t0 = 0x00000002
das erreichst du nur mit ori $t0, $zero, 2

ALso: li ist nicht lui Wink


Ansonsten gutes Tut.


Ersten ist es das register $a1. Und soll 0x0001 sein.

sceIoOpen braucht 2 parameter:
der eine ist :
li $a1 , 1
0x0001 heisst wir wollen nur Leseberechtigung, "PSP_O_RDONLY"
Smile

Und 2.
Ich bin zwar nicht besonders gut in Assembler Language, aber man muss doch zuerst die parameter setzen und dann die function callen.
Bisher hab ich niemanden gesehen, der wo es anders als hier gemacht hat.

DarXPloit_$a1 :
Ich bin zwar nicht besonders gut in Assembler Language, aber man muss doch zuerst die parameter setzen und dann die function callen.
Bisher hab ich niemanden gesehen, der wo es anders als hier gemacht hat.

Man sollte nie den Delay Slot frei lassen. Die beste Methode wäre es so zu machen wie PSP_Lord gesagt hat. In MIPS wird der Befehl, der direkt nach einem J-Type Befehl kommt zuerst ausgeführt.

Ich weis, welche Parameter sceIoOpen braucht, und ich bin mir auch bewusst, dass lui $a1, 1 0x00010000 bedeutet. ABER: in deinem pic steht li $a1, 1, und das ist a1 = 0x00000001. Nur in deinem Code verwendest du load upper immediate (was richtig ist!). Ich wollte nur klarstellen, dass li nicht lui ist und auch nicht den Effekt hat.

So zum jal: JAL ist ein JUMP and Link Befehl, dieser Befehl hat, wie alle branch und jump Befehle in MIPS, einen Delay Slot. Dieser Delay Slot wird VOR dem jump der JAL ausgeführt. Das heißt, man schreibt folgendes:

lui $a1 , 0x0881 //a1 = 0x08810000
jal sceIoRead //jump to sceIoRead, VORHER aber....
lui $a2, 1 //...a2 = 0x00010000

wenn du es so schreibst, wie du es willst:

lui $a1 , 0x0881 //a1 = 0x08810000
lui $a2, 1 //...a2 = 0x00010000
jal sceIoRead //jump to sceIoRead //dann musst du noch eine NOP hinter die JAL machen
nop

wie du siehts, ist das eine code Zeile zu viel, ist also nicht optimaler code, da eine zusätzliche, unnötige Operation ausgeführt wird. Bei komplexerem code mit vielen branch und jump Befehlen, ist es doch ein Unterschied, ob man den delay Slot verwendet oder nicht.

Ich habe durchaus Erfahrungen mit MIPS und ich programmiere auch für die PSP, blicke also in dieser Materie relativ gut durch, ohne jetzt behaupten zu wollen, ich könnte eine CFW schreiben.
Seiten: 1 2
Referenz-URLs