DarXPloit_$a1
Halbprofi
Beiträge: 206
Gruppe: User
Registriert seit: Oct 2010
Status:
Offline
Danke erhalten: 218
|
[TUT] Exploiting Savegames [TEIL 3]
-> Exploiting Savegames [TEIL 1]
-> Exploiting Savegames [TEIL 2]
############################################################ ###################
Der 3. Teil - Main.c
Ich werde anhand des berühmt berüchtigten Sparta SDK´s erklären.
Nachdem wir uns gründlichst mit Teil 1 und ebenfalls Teil 2 des Tutorials auseinander gesetzt haben, können wir uns jetzt um unseren ausführbaren Code kümmern.
Dieser "eigentlicher" code wird sich später in Form der Datei "main.c" befinden.
Bevor wir beginnen:
1. Erst einmal brauchen wir einen Text Editor , oder eine Entwicklungsumgebung.
Ich persönlich finde das Notepad++ sehr gut für solche Zwecke.
2. Zudem werde ich nicht den ganzen code ausführlich erklären können. Zu faul
Ich erkläre nur das aller nötigste ausführlich, der Rest ist eh nur Augenweide.
3. Ich stelle euch hiermit als erstes mal ein SDK zur Verfügung.
Dort befinden sich typische .h files ( Header Dateien) für PSP, aber auch noch eine help.h.
In dieser help.h befindet sich eine Ansammlung an Delarationen und Funktionen von dem Sparta SDK welche ihr natürlich benutzen könnt. Es lohnt sich auf jeden Fall die Datei zu durchstöbern.
Also beginnen wir:
Als erstes müssen wir in der main.c die "sdk.h" inlcudieren. In der "sdk.h" wiederum befinden sich alle Includierungen die wir benötigen werden.
------------------------------------------------------------------------------------------------------------
Werfen wir also zunächst einen Blick auf die sdk.h, bevor wir sie in der main.c deklarieren.
SDK.H
#include "pspdisplay.h"
#include "pspctrl.h"
#include "pspkernel.h"
#include "pspdebug.h"
#include "pspaudio.h"
#include "help.h"
#ifndef __VAL-SDK__
#define __VAL-SDK__
// Typedefs
typedef unsigned char byte;
#endif
Jetz kann man hoffentlich verstehen , was ich gemeint habe:
Da die sdk.h alle unsere anderen .h files includiert, brauchen wir nur dieses sdk.h in unsere main.c einbinden. Das spart Platz und trägt der Übersichtlichkeit bei.
--------------------------------------------------------------------------------------------------------
Nach diesem kurzem Zwischenschritt bringen wir nun unser "sdk.h" in unsere main.c
Main.c
Ok, jetzt wollen wir mal Farbe ins Spiel bringen
Wir werden nun mal ein paar Farb-Namen definen und ihnen Farbwerte zuweisen.
Das machen wir so:
#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 long colours[11];
int color,i;
void InitGlobals()
{
colours[10] = 0x00000000L;
colours[1] = 0x00FFFFFFL;
colours[2] = 0x00FF00FFL;
colours[3] = 0x000000FFL;
colours[4] = 0x00FF0000L;
colours[5] = 0x0000FF00L;
colours[6] = 0x0000FFFFL;
colours[7] = 0x00FFFF00L;
colours[8] = 0x00FFFF88L;
colours[9] = 0x00888888L;
colours[0] = 0x00008800L;
i=0;
color=INDEX_GRAY;
}
Jeder Wert "colours[0] = 0x00008800L" hat eine Nummer (hier 0) welche mit unseren definieten Namen "INDEX_DARKGREEN 0" übereinstimmen sollte.
Später mir wir dadurch nur den Farb-Namen benützen.
Jetzt gebe ich euch nochmal den Syntax aller Funktionen an, die nun verwendet werden können
Das sollten wir ebenfalls in unsere main.c schreiben, um immer die Übersicht über unsere Funktionen zu haben.
Nicht vergessen , die richtige Funktion befindet sich in der help.h !
// get vram address for character position
unsigned char *GetVramAddr(unsigned long x,unsigned long y);
// print a single character
void PutChar(unsigned long x,unsigned long y,unsigned long color,unsigned long bgcolor,unsigned char ch,char drawfg,char drawbg,char mag);
// print a string
void Print(unsigned long x,unsigned long y,unsigned long color,const char *str);
// x is in pixels rather than character cells
void PrintFine(unsigned long x,unsigned long y,unsigned long color,const char *str);
// clear video ram
void Fillvram(unsigned long color);
void WriteNibble(int x, int y, unsigned char val);
void WriteByte(int x, int y, unsigned char val);
void WriteDword(int x, int y, unsigned long val);
void WriteNibbleDummy(int x, int y, unsigned char val);
void WriteByteDummy(int x, int y, unsigned char val);
void WriteDwordDummy(int x, int y, unsigned long val);
void FillRect(RECT *xirect, unsigned long xicolour);
void MoveToEx(short x, short y);
void LineTo(short x, short y);
void changeBuffer();
void DebugValue(int y, char * label, unsigned long val);
void WriteDecimal(int x, int y, unsigned long val);
void initScreenAndCtrl();
void memcpy(char *dest, char *src, int size);
int strlen(char * xistr);
void createScreenshot();
void memdump();
Und weiter gehts !
Im späteren Verlauf wollen wir ja sicherlich unser Joypad benützen. Zum Beispiel , wenn wir x drücken, dann soll ein Programm oder eine Funktion starten (aka If Bedingung).
Aber wie stellen wir das an ? - Ganz einfach
Dafür müssen wir zunächst "SceCtrlData" ins Spiel bringen. Das returned unsere Controller Daten.
Nachdem wir es deklariert haben , geben wir ihr?ihm *lol* noch einen Trivialnamen, in diesem Fall "gpaddata".
Unsere If Bedingungen selbst werden wir in einer "void" sammeln. Das hilft wieder mal zur Übersichtlichkeit.
Am Ende sieht das dann so aus:
SceCtrlData gpaddata;
void ProcessKeys(unsigned long xikeys)
{
if (xikeys & PSP_CTRL_UP || xikeys & PSP_CTRL_RIGHT) {
if(color>=10) { color=0; }
else { color++; }
// up taste oder recht Taste drücken um Farbe zu verändern
}
if (xikeys & PSP_CTRL_DOWN || xikeys & PSP_CTRL_LEFT) {
if(color<0) { color=10; }
else { color--; }
// down taste oder links Taste drücken um Farbe zu verändern
}
if (xikeys & PSP_CTRL_HOME) // if home is pressed
{
for(i=0;i<278;i++) {
Fillvram(0x00FFFFFFL);
changeBuffer(); // flip screen to display what i just wrote
sceKernelDelayThread(1*1000);
}
changeBuffer(); // flip the buffer back to drawing mode
fadeIn(); // fadeIn
fadeOut(); // fadeOut
sceKernelExitGame(); // exit
}
if (xikeys & PSP_CTRL_TRIANGLE) createScreenshot();
if (xikeys & PSP_CTRL_CIRCLE) memdump();
}
So das wars - NEIN , Moment mal ?!?
In C haben wir doch die main() , in der sich unser Hauptcode befindet.
So leicht haben wir es bei Savegame Exploits nicht. Da wir durch unseren Shellcode zu einer bestimmten Stelle im RAM springen, müssen wir das auch der main.c deutlich machen.
Und zwar so:
void _start(unsigned long, unsigned long *) __attribute__ ((section (".text.start")));
void _start(unsigned long arglen, unsigned long *argp)
{
}
Das wird unseren Code an der vom Shellcode & Linker.x gewünschten RAM-Location ausführen.
Als Erstes werden wir nun die Function "sceKernelDcacheWritebackAll();" declarieren.
Das wird unsere Cache zum Memory zurückschreiben.
.
Ebenfalls schreiben wir noch "InitGlobals();" Damit haben wir die Farbe im Hauptprogramm.
Die "initScreenAndCtrl();" darf auch nicht fehlen, da sie den Bildschirm und unsere Controls initialisiert
sceKernelDcacheWritebackAll();
InitGlobals();
initScreenAndCtrl();
So dann wollen wir ein Cooles Intro für unseren Exploit , das schafft man mit den Funktionen "fadeIn();" und "fadeOut();" , ebenfalls kann man noch etwas im Intro aus auf dem Bildschirm ausgeben, und zwar mit der Funktion
"Print(unsigned long x,unsigned long y,unsigned long color,const char *str);"
x für die X-Achse , y für die Y-Achse, color für eure Farbe , und *str für euren Text
Man könnte dann sowas daraus machen:
fadeIn();
fadeOut();
Print (22,15,colours[INDEX_GREEN]," - Hello World! -");
changeBuffer();
sceKernelDelayThread(2*1000*1000);
changeBuffer();
fadeIn();
fadeOut();
Nach dem Intro müssen wir nun in eine "for( ; ; ) { }" treten.
Unser Code sollte sich ja am besten für immer wiederholen. Dies ermöglicht eine Deklaration der for schleife mit 2 Semikolon.
Um jetzt binden wir unsere "ProcessKeys" Function in die for( ; ; ) schleife ein.
gpaddata.Buttons = 0;
sceCtrlReadBufferPositive(&gpaddata,1);
ProcessKeys(gpaddata.Buttons);
Nun kommen wir zu unserem Hello World, das wir auf dem PSP Bildschirm ausgeben werden.
Davor müssen wir allerdings den Video RAM einfärben. Da wir am Anfang unsere Farben declariert haben , ist dies nun ganz einfach - mit der Function "Fillvram(unsigned long color);".
Zuletzt können wir nun den gewünschten Text ausgeben. Mein Code würde so aussehen:
Fillvram(colours[INDEX_BLACK]);
Print (0,0,colours[color],"Hello World Tutorial von Darxploit");
Print (0,2,colours[INDEX_WHITE],"Juhu :) , das ist unser Hallo Welt !!!");
Print (0,3,colours[INDEX_WHITE],"Jetzt sind wir richtige Hacker :P ");
Print (0,5,colours[INDEX_WHITE],"Was lernen wir daraus:");
Print (0,7,colours[INDEX_WHITE],"Exploits sind aufwendig und erfordern eine gewisse Routine !");
Print (0,9,colours[INDEX_WHITE],"Visit: http://darxploit-dev.blogspot.com/ ");
Print (0,25,colours[INDEX_GRAY],"Druecke o fuer einen memory dump");
Print (0,26,colours[INDEX_GRAY],"Druecke /\\ fuer einen screenshot");
Print (0,27,colours[INDEX_GRAY],"Druecke HOME um den Exploit zu beenden");
Jetzt nur noch den Frame-Buffer neu aufsetzen, was mit dieser Funktion gelingt - changeBuffer();
Es ist sehr wichtig, dass ihr diese Funktion am Ende der for( ; ; ) schleife benutzt, sonst werdet ihr nur einen Blackscreen bekommen.
Die Zusammenfassung unserer erstellten Main.c :
#include "sdk.h"
#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 long colours[11];
int color,i;
void InitGlobals()
{
colours[10] = 0x00000000L;
colours[1] = 0x00FFFFFFL;
colours[2] = 0x00FF00FFL;
colours[3] = 0x000000FFL;
colours[4] = 0x00FF0000L;
colours[5] = 0x0000FF00L;
colours[6] = 0x0000FFFFL;
colours[7] = 0x00FFFF00L;
colours[8] = 0x00FFFF88L;
colours[9] = 0x00888888L;
colours[0] = 0x00008800L;
i=0;
color=INDEX_GRAY;
}
// get vram address for character position
unsigned char *GetVramAddr(unsigned long x,unsigned long y);
// print a single character
void PutChar(unsigned long x,unsigned long y,unsigned long color,unsigned long bgcolor,unsigned char ch,char drawfg,char drawbg,char mag);
// print a string
void Print(unsigned long x,unsigned long y,unsigned long color,const char *str);
// x is in pixels rather than character cells
void PrintFine(unsigned long x,unsigned long y,unsigned long color,const char *str);
// clear video ram
void Fillvram(unsigned long color);
void WriteNibble(int x, int y, unsigned char val);
void WriteByte(int x, int y, unsigned char val);
void WriteDword(int x, int y, unsigned long val);
void WriteNibbleDummy(int x, int y, unsigned char val);
void WriteByteDummy(int x, int y, unsigned char val);
void WriteDwordDummy(int x, int y, unsigned long val);
void FillRect(RECT *xirect, unsigned long xicolour);
void MoveToEx(short x, short y);
void LineTo(short x, short y);
void changeBuffer();
void DebugValue(int y, char * label, unsigned long val);
void WriteDecimal(int x, int y, unsigned long val);
void initScreenAndCtrl();
void memcpy(char *dest, char *src, int size);
int strlen(char * xistr);
void createScreenshot();
void memdump();
SceCtrlData gpaddata;
void ProcessKeys(unsigned long xikeys)
{
if (xikeys & PSP_CTRL_UP || xikeys & PSP_CTRL_RIGHT) {
if(color>=10) { color=0; }
else { color++; }
}
if (xikeys & PSP_CTRL_DOWN || xikeys & PSP_CTRL_LEFT) {
if(color<0) { color=10; }
else { color--; }
}
if (xikeys & PSP_CTRL_HOME) // if home is pressed
{
for(i=0;i<278;i++) {
Fillvram(0x00FFFFFFL);
changeBuffer();
sceKernelDelayThread(1*1000);
}
changeBuffer(); // flip the buffer back
fadeIn(); // fadeIn
fadeOut(); // fadeOut
sceKernelExitGame(); // exit
}
if (xikeys & PSP_CTRL_TRIANGLE) createScreenshot();
if (xikeys & PSP_CTRL_CIRCLE) memdump();
}
void _start(unsigned long, unsigned long *) __attribute__ ((section (".text.start")));
void _start(unsigned long arglen, unsigned long *argp)
{
sceKernelDcacheWritebackAll();
InitGlobals();
initScreenAndCtrl();
fadeIn();
fadeOut();
Print (22,15,colours[INDEX_GREEN]," - Hello World! -");
changeBuffer();
sceKernelDelayThread(2*1000*1000);
changeBuffer();
fadeIn();
fadeOut();
for(;;)
{
gpaddata.Buttons = 0;
sceCtrlReadBufferPositive(&gpaddata,1);
ProcessKeys(gpaddata.Buttons);
Fillvram(colours[INDEX_BLACK]);
drawPixel(0,240,480,265,colours[INDEX_DARKGREEN]);
Print (0,0,colours[color],"Hello World Tutorial von Darxploit");
Print (0,2,colours[INDEX_WHITE],"Juhu :) , das ist unser Hallo Welt !!!");
Print (0,3,colours[INDEX_WHITE],"Jetzt sind wir richtige Hacker :P ");
Print (0,5,colours[INDEX_WHITE],"Was lernen wir daraus:");
Print (0,7,colours[INDEX_WHITE],"Exploits sind aufwendig und erfordern eine gewisse Routine !");
Print (0,9,colours[INDEX_WHITE],"Visit: http://darxploit-dev.blogspot.com/ ");
Print (0,25,colours[INDEX_GRAY],"Druecke o fuer einen memory dump");
Print (0,26,colours[INDEX_GRAY],"Druecke /\\ fuer einen screenshot");
Print (0,27,colours[INDEX_GRAY],"Druecke HOME um den Exploit zu beenden");
changeBuffer();
}
}
Wer will mehr xD ?
Wem dieses Hello World zu langweilig ist , der kann natürlich auch das Folgende nehmen.
Es wird euch sicherlich bekannt vorkommen, da es schon einige Hacker benutzt haben, unter anderem Wololo
#include "sdk.h"
#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 long colours[11];
int color,i;
void InitGlobals()
{
colours[10] = 0x00000000L;
colours[1] = 0x00FFFFFFL;
colours[2] = 0x00FF00FFL;
colours[3] = 0x000000FFL;
colours[4] = 0x00FF0000L;
colours[5] = 0x0000FF00L;
colours[6] = 0x0000FFFFL;
colours[7] = 0x00FFFF00L;
colours[8] = 0x00FFFF88L;
colours[9] = 0x00888888L;
colours[0] = 0x00008800L;
i=0;
color=INDEX_GRAY;
}
// get vram address for character position
unsigned char *GetVramAddr(unsigned long x,unsigned long y);
// print a single character
void PutChar(unsigned long x,unsigned long y,unsigned long color,unsigned long bgcolor,unsigned char ch,char drawfg,char drawbg,char mag);
// print a string
void Print(unsigned long x,unsigned long y,unsigned long color,const char *str);
// x is in pixels rather than character cells
void PrintFine(unsigned long x,unsigned long y,unsigned long color,const char *str);
// clear video ram
void Fillvram(unsigned long color);
void WriteNibble(int x, int y, unsigned char val);
void WriteByte(int x, int y, unsigned char val);
void WriteDword(int x, int y, unsigned long val);
void WriteNibbleDummy(int x, int y, unsigned char val);
void WriteByteDummy(int x, int y, unsigned char val);
void WriteDwordDummy(int x, int y, unsigned long val);
void FillRect(RECT *xirect, unsigned long xicolour);
void MoveToEx(short x, short y);
void LineTo(short x, short y);
void changeBuffer();
void DebugValue(int y, char * label, unsigned long val);
void WriteDecimal(int x, int y, unsigned long val);
void initScreenAndCtrl();
void memcpy(char *dest, char *src, int size);
int strlen(char * xistr);
void createScreenshot();
void memdump();
SceCtrlData gpaddata;
void ProcessKeys(unsigned long xikeys)
{
if (xikeys & PSP_CTRL_UP || xikeys & PSP_CTRL_RIGHT) {
if(color>=10) { color=0; }
else { color++; }
}
if (xikeys & PSP_CTRL_DOWN || xikeys & PSP_CTRL_LEFT) {
if(color<0) { color=10; }
else { color--; }
}
if (xikeys & PSP_CTRL_HOME) // if home is pressed
{
for(i=0;i<278;i++) {
Fillvram(0x00FFFFFFL);
changeBuffer(); // flip screen to display what i just wrote
sceKernelDelayThread(1*1000);
}
changeBuffer(); // flip the buffer back to drawing mode for fade* functions
fadeIn(); // fadeIn -----| Nice Cute
fadeOut(); // fadeOut -----| Effect
sceKernelExitGame(); // exit
}
if (xikeys & PSP_CTRL_TRIANGLE) createScreenshot();
if (xikeys & PSP_CTRL_CIRCLE) memdump();
}
typedef struct snoflake {
int x,y,flake;
} snoflake;
snoflake snowflake[100];
void _start(unsigned long, unsigned long *) __attribute__ ((section (".text.start")));
void _start(unsigned long arglen, unsigned long *argp)
{
sceKernelDcacheWritebackAll();
int a=0,sway=0;
InitGlobals();
initScreenAndCtrl();
fadeIn();
fadeOut();
Print (22,15,colours[INDEX_GREEN]," - Hello World! -");
changeBuffer();
sceKernelDelayThread(2*1000*1000);
changeBuffer();
fadeIn();
fadeOut();
for (i = 0; i<100; i++) {
snowflake[i].x = rand()%480;
snowflake[i].y = rand()%272;
snowflake[i].flake = rand()%3;
}
for(;;)
{
gpaddata.Buttons = 0;
sceCtrlReadBufferPositive(&gpaddata,1);
ProcessKeys(gpaddata.Buttons);
Fillvram(colours[INDEX_BLACK]);
for (a = 0;a<100;a++) {
sway = rand()%4;
if (sway == 1 || sway == 2) {
snowflake[a].x -= 1;
}
if (sway == 3 || sway == 4) {
snowflake[a].x += 1;
}
snowflake[a].y += rand()%4;
if (snowflake[a].y > 272) {
snowflake[a].y = 0;
snowflake[a].x = rand()%480;
}
if(snowflake[a].flake==0) {
drawPixel(snowflake[a].x,snowflake[a].y,1,1,colours[color]);
}
if(snowflake[a].flake==1) {
drawPixel(snowflake[a].x,snowflake[a].y,2,2,colours[color]);
}
if(snowflake[a].flake==2) {
drawPixel(snowflake[a].x,snowflake[a].y,3,3,colours[color]);
}
}
drawPixel(0,240,480,265,colours[INDEX_DARKGREEN]);
Print (0,0,colours[color],"Hello World Tutorial von Darxploit");
Print (0,2,colours[INDEX_WHITE],"Juhu :) , das ist unser Hallo Welt !!!");
Print (0,3,colours[INDEX_WHITE],"Jetzt sind wir richtige Hacker :P ");
Print (0,5,colours[INDEX_WHITE],"Was lernen wir daraus:");
Print (0,7,colours[INDEX_WHITE],"Exploits sind aufwendig und erfordern eine gewisse Routine !");
Print (0,9,colours[INDEX_WHITE],"Visit: http://darxploit-dev.blogspot.com/ ");
Print (0,25,colours[INDEX_GRAY],"Druecke o fuer einen memory dump");
Print (0,26,colours[INDEX_GRAY],"Druecke /\\ fuer einen screenshot");
Print (0,27,colours[INDEX_GRAY],"Druecke HOME um den Exploit zu beenden");
changeBuffer();
}
}
--------------------------------------------------------------------------------------------------------------
Abspann:
Ok, das wars so weit von mir ! Ich hoffe es hat euch gefallen
Als cooles Spezial gibts von mir noch ein SDK für eure Exploits !
Und ebenfalls das SDK von dem Sukkiri Exploit, falls ihr noch keinen eigen habt. So kann jeder testen
Downloads:
Meine_SDK´s_FÜR_EUCH
Sukkiri Savegame Exploit
############################################################ ###################
-> Exploiting Savegames [TEIL 1]
-> Exploiting Savegames [TEIL 2]
Dieser Beitrag wurde zuletzt bearbeitet: 17.02.2011 15:52 von DarXPloit_$a1.
|
|