|
Verfasser |
Nachricht |
DarXPloit_$a1
Halbprofi
Beiträge: 206
Gruppe: User
Registriert seit: Oct 2010
Status:
Offline
Danke erhalten: 218
|
[TUT] Exploiting Savegames [TEIL 2]
-> 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...
... 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]
Dieser Beitrag wurde zuletzt bearbeitet: 17.02.2011 15:01 von DarXPloit_$a1.
|
|
05.02.2011 23:04 |
|
Folgende User bedanken sich: NeverCheat (Oct-8-2014), onlinesoccer (Feb-8-2011), eMKayWe (Feb-7-2011), WinterFrost (Feb-6-2011), Xeramon (Feb-6-2011), Cor7eZ (Feb-6-2011), -blue7 (Feb-6-2011), doener-junior (Feb-6-2011), m33 (Feb-6-2011), Cha0z (Feb-6-2011), pspbricker (Feb-6-2011), Camaro8000 (Feb-5-2011), joni17 (Feb-5-2011), _Kai_ (Feb-5-2011), xxx_knoppix_xxx (Feb-5-2011) |
|
HacKmaN
Ex-Developer
Beiträge: 2.423
Gruppe: User
Registriert seit: Oct 2009
Status:
Offline
Danke erhalten: 3319
|
RE: [TUT 2] Savegame Exploits & SDK´s
Wie beim letzten Tutorial: Sehr schön
|
|
05.02.2011 23:08 |
|
Folgende User bedanken sich: |
|
KingBecks95
Profi
Beiträge: 354
Gruppe: User
Registriert seit: Jan 2011
Status:
Offline
Danke erhalten: 46
|
RE: [TUT 2] Savegame Exploits & SDK´s
wär nur noch toll ein vid mit ergebnis zu sehen
PSP:
Modell: 3004 (Brite)
DateCode: 8C
FW-History:
6.20+ (im Dez.10 vom Kumpel abgekauft)->....->5.03 GEN-C(Full)->5.03 Prome-3(4)-> 6.20 PRO-B8 (perm)
|
|
06.02.2011 00:16 |
|
|
|
Cha0z
Banned
Beiträge: 1.501
Gruppe: Banned
Registriert seit: Oct 2010
Status:
Abwesend
Danke erhalten: 436
|
RE: [TUT] Exploiting Savegames [TEIL 2]
Alter Nick: Co$m0
Was für ein Lügner! Der Bearbeitet ein Bild mit schönen Paint -.-
|
|
06.02.2011 09:17 |
|
|
|
DarXPloit_$a1
Halbprofi
Beiträge: 206
Gruppe: User
Registriert seit: Oct 2010
Status:
Offline
Danke erhalten: 218
|
RE: [TUT] Exploiting Savegames [TEIL 2]
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
|
|
06.02.2011 09:39 |
|
Folgende User bedanken sich: |
|
Sparky
Profi
Beiträge: 337
Gruppe: User
Registriert seit: Dec 2010
Status:
Offline
Danke erhalten: 73
|
RE: [TUT] Exploiting Savegames [TEIL 2]
Kleiner Fehler, es muss "functions.txt" beim umbenennen heißen, ansonsten Super Tut
…
|
|
06.02.2011 10:09 |
|
Folgende User bedanken sich: |
|
DarXPloit_$a1
Halbprofi
Beiträge: 206
Gruppe: User
Registriert seit: Oct 2010
Status:
Offline
Danke erhalten: 218
|
RE: [TUT] Exploiting Savegames [TEIL 2]
Kleiner Fehler, es muss "functions.txt" beim umbenennen heißen, ansonsten Super Tut
Danke , habs behoben
|
|
06.02.2011 10:16 |
|
Folgende User bedanken sich: |
|
fixit98
Experte
Beiträge: 610
Gruppe: User
Registriert seit: Nov 2009
Status:
Abwesend
Danke erhalten: 525
|
RE: [TUT] Exploiting Savegames [TEIL 2]
|
|
06.02.2011 15:47 |
|
Folgende User bedanken sich: |
|
Cor7eZ
ps3zone.de
Beiträge: 2.143
Gruppe: User
Registriert seit: Aug 2009
Status:
Abwesend
Danke erhalten: 1098
|
RE: [TUT] Exploiting Savegames [TEIL 2]
Ich bin dafür, dass diese Tutorials gepinnt werden!
|
|
06.02.2011 16:30 |
|
Folgende User bedanken sich: |
|
DarXPloit_$a1
Halbprofi
Beiträge: 206
Gruppe: User
Registriert seit: Oct 2010
Status:
Offline
Danke erhalten: 218
|
RE: [TUT] Exploiting Savegames [TEIL 2]
Sehr gut
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
aber ich heiss Darxploit , nicht darksploit
|
|
06.02.2011 17:45 |
|
|
|
fixit98
Experte
Beiträge: 610
Gruppe: User
Registriert seit: Nov 2009
Status:
Abwesend
Danke erhalten: 525
|
RE: [TUT] Exploiting Savegames [TEIL 2]
Sehr gut
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
aber ich heiss Darxploit , nicht darksploit
Ja,ist mir nacher auch aufgefallen Naja es geht ja um den guten Willen
|
|
06.02.2011 18:28 |
|
|
|
PSP_Lord
Durchstarter
Beiträge: 87
Gruppe: User
Registriert seit: Sep 2010
Status:
Abwesend
Danke erhalten: 133
|
RE: [TUT] Exploiting Savegames [TEIL 2]
Nochmals die selbe Anregung von mir mit dem Delay Slot
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
Ansonsten gutes Tut.
Dieser Beitrag wurde zuletzt bearbeitet: 07.02.2011 14:06 von PSP_Lord.
|
|
06.02.2011 18:52 |
|
Folgende User bedanken sich: |
|
DarXPloit_$a1
Halbprofi
Beiträge: 206
Gruppe: User
Registriert seit: Oct 2010
Status:
Offline
Danke erhalten: 218
|
RE: [TUT] Exploiting Savegames [TEIL 2]
Nochmals die selnbe Anregung von mir mit dem Delay Slot
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
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"
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.
Dieser Beitrag wurde zuletzt bearbeitet: 06.02.2011 19:13 von DarXPloit_$a1.
|
|
06.02.2011 19:09 |
|
Folgende User bedanken sich: |
|
Dr. Soup
Durchstarter
Beiträge: 58
Gruppe: User
Registriert seit: Mar 2010
Status:
Offline
Danke erhalten: 70
|
RE: [TUT] Exploiting Savegames [TEIL 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.
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.
|
|
06.02.2011 19:25 |
|
Folgende User bedanken sich: |
|
PSP_Lord
Durchstarter
Beiträge: 87
Gruppe: User
Registriert seit: Sep 2010
Status:
Abwesend
Danke erhalten: 133
|
RE: [TUT] Exploiting Savegames [TEIL 2]
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.
|
|
06.02.2011 19:37 |
|
Folgende User bedanken sich: |
|
|