You are not logged in.
Dans la précédente partie du tuto Voir [TUTO-C-Hook] Partie 1 Hooker une fonction je vous avais expliquer comment hooker une fonction, maintenant je vais vous expliquer comment récupérer les informations sur la fonction a hooker "Nom Du Module, Nom De La Librairie, Nid".
Alors d'abord allons chez notre ami SilverSpring pour récupérer un fichier XML qui contient une partie des information sur les modules, les fonctions, les librairies de la PSP, le fichier en question 5.00 LibDoc extrayez l'archive et ouvrer le fichier XML qu'il contient. Maintenant nous allons récupérer les information sur la fonction que je vous est montrer comment hooker une fonction, aller ouvrons ce fichier XML et cherchons la fonction en question sceRtcGetCurrentClockLocalTime, résultat voir image.
Voila maintenant nous avons déjà le nom de la fonction a hooker "même si il faut que vous l'ayez déjà au départ si vous voulez hooker une fonction" et le nid de la fonction en question, nous pouvons donc déjà ajouter ces information a la fonction sctrlHENFindFunction :
u32 orgaddr = sctrlHENFindFunction(const char* szMod, const char* szLib, 0xE7C27D1B);
Voila ceci fait il nous manque quand même deux information pour hooker la fonction les nom du module qui contient la fonction et le nom de la librairie qui contient la fonction a hooker pour cela il suffit de remonter un peut dans le fichier XML et de s'arrêter a l'endroit ou il y a écrit le nom du prx qui contient la fonction et le nom de la librairie voir image résultat, nous avons ce qu'il faut pour récupérer la fonction a hooker entrons maintenant c'est argument dans la fonction sctrlHENFindFunction :
u32 orgaddr = sctrlHENFindFunction("sceRTC_Service", "sceRtc", 0xE7C27D1B);
Voila notre fonction au complet nous pouvons commencer le hook de la fonction en question :
Ajoutons nos includes :
// Pour les types kernel et fonction
#include <pspkernel.h>
// Pour les fonctions temps de la PSP
#include <psprtc.h>
// Pour les fonctions pour hooker
#include <systemctrl.h>
// Pour les fonctions caractère de la libc
#include <string.h>
Maintenant nos defines :
// Une define pour ma version majeur MY_MAJOR_VERSION.0
#define MY_MAJOR_VERSION 1
// Une define pour ma version mineur 1.MY_MINOR_VERSION
#define MY_MINOR_VERSION 0
// Une define pour mon Mode Kernel Personnaliser
#define MY_PSP_MODULE_KERNEL 0x1007
Le code pour le fonctionnement du module :
// Pour l'information du module et une macro spécial PSP pour compiler votre Module
PSP_MODULE_INFO("MyModuleName", MY_PSP_MODULE_KERNEL, MY_MAJOR_VERSION, MY_MINOR_VERSION);
Le main (module_start puisque c'est un module prx) :
// Pour l'entrée du module
int module_start(SceSize args, void *argp)
{
// Récupère la fonction original sceRtcGetCurrentClockLocalTime avec le NomDuModule, NomDeLaLibrairie, Nid
u32 orgaddr = sctrlHENFindFunction("sceRTC_Service", "sceRtc", 0xE7C27D1B);
// Patche la fonction original sceRtcGetCurrentClockLocalTime avec le Syscall
sctrlHENPatchSyscall(orgaddr, sceRtcGetCurrentClockLocalTimePatched);
// Écris les données dans la mémoire cache
sceKernelDcacheWritebackAll();
// Invalide le cache d'instruction du CPU.
sceKernelIcacheClearAll();
// Renvoi 0 pour déclarer une fin de fonction
return 0;
}
Le module_stop (par forcement nécessaire mais c'est toujours utile) :
// Pour arrêter le module
int module_stop(SceSize args, void *argp)
{
// Renvoi 0 pour déclarer une fin de fonction
return 0;
}
Et enfin notre fonction hooker :
// Fonction Temps Patcher
int sceRtcGetCurrentClockLocalTimePatched(pspTime *time)
{
// Met le registre processeurs k1 a 0
int k1 = pspSdkSetK1(0);
// Met la variable day de la structure time a 33
time->day = 33;
// Met la variable month de la structure time a 3
time->month = 3;
// Met la variable year de la structure time a 3
time->year = 3;
// Met la variable hour de la structure time a 3
time->hour = 3;
// Met la variable minutes de la structure time a 33
time->minutes = 33;
// Met la variable seconds de la structure time a 33
time->seconds = 33;
// Met le registre processeurs k1 a la precedente valeur de k1
pspSdkSetK1(k1);
// Renvoi 0 pour déclarer une fin de fonction
return 0;
}
-Ce que vous devez savoir
Si vous hooker une fonction, la fonction remplacer par la fonction a hooker doit forcement avoir les même paramètres (arguments) d'entrer et le même type en gros si la fonction a hooker est :
SceUID sceKernelLoadModule(const char *path, int flags, SceKernelLMOption *option);
la fonction remplacer par la fonction a hooker devra être tu type [c]SceUID (int)[/c] et avoir comme arguments d'entrer const char *path, int flags, SceKernelLMOption *option
Example :
SceUID nomQueVousVoulez(const char *path, int flags, SceKernelLMOption *option);
Voila donc c'est tout pour la partie 2 du tuto sur le hook de fonction, le prochain tuto sera sur le patch de module, et peut-être une partie 3 pour le tuto sur le hook de fonction intituler Partie 3 Savoir si une fonction est un syscall, comment les reconnaitre.
[large]Toute copie de ce tutoriel sans mon accord est non autoriser.[/large]
Offline
Encore un super tuto!! Merci^^
En suivant le tuto, je suis arrivé à ça (afin de hooker le pad (fonction "vshCtrlReadBufferPositive")) :
/ Pour les types kernel et fonction
#include <pspkernel.h>
// Pour les fonctions PAD de la PSP
#include <pspctrl.h>
// Pour les fonctions pour hooker
#include <systemctrl.h>
// Pour les fonctions caractère de la libc
#include <string.h>
// Une define pour ma version majeur MY_MAJOR_VERSION.0
#define MY_MAJOR_VERSION 1
// Une define pour ma version mineur 1.MY_MINOR_VERSION
#define MY_MINOR_VERSION 0
// Une define pour mon Mode Kernel Personnaliser
#define MY_PSP_MODULE_KERNEL 0x1007
// Pour l'information du module et une macro spécial PSP pour compiler votre Module
PSP_MODULE_INFO("MyModuleName", MY_PSP_MODULE_KERNEL, MY_MAJOR_VERSION, MY_MINOR_VERSION);
int funPatched(SceCtrlData* pad_data,int count)
{
int ret = vshCtrlReadBufferPositive(pad_data,count);
int interrupts = pspSdkDisableInterrupts();
//Verifie si on n'est pas dans le navigateur
if(!sceKernelFindModuleByName("htmlviewer_plugin_module"))
{
//convertit les mouvements du joystick en appui du pad analogique
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
if(pad_data->Lx == 0)
pad_data->Buttons |= PSP_CTRL_LEFT;
if(pad_data->Lx == 255)
pad_data->Buttons |= PSP_CTRL_RIGHT;
if(pad_data->Ly == 0)
pad_data->Buttons |= PSP_CTRL_UP;
if(pad_data->Ly == 255)
pad_data->Buttons |= PSP_CTRL_DOWN;
}
pspSdkEnableInterrupts(interrupts);
return ret;
}
// Pour l'entrée du module
int module_start(SceSize args, void *argp)
{
// Récupère la fonction original sceRtcGetCurrentClockLocalTime avec le NomDuModule, NomDeLaLibrairie, Nid
[large]u32 orgaddr = sctrlHENFindFunction(sceVshBridge_Driver, sceVshBridge, 0xC6395C03);[/large]
// Patche la fonction original sceRtcGetCurrentClockLocalTime avec le Syscall
sctrlHENPatchSyscall(orgaddr, funPatched);
// Écris les données dans la mémoire cache
sceKernelDcacheWritebackAll();
// Invalide le cache d'instruction du CPU.
sceKernelIcacheClearAll();
// Renvoi 0 pour déclarer une fin de fonction
return 0;
}
// Pour arrêter le module
int module_stop(SceSize args, void *argp)
{
// Renvoi 0 pour déclarer une fin de fonction
return 0;
}
Mais quand je compile, j'obtiens l'erreur suivante :
Mickael devs@mickaeldevs ~/projets/hooktestpad
$ make
psp-gcc -I/usr/local/pspdev/psp/sdk/include/libc -I. -I/usr/local/pspdev/psp/sdk
/include -O2 -G0 -Wall -fno-pic -c -o main.o main.c
main.c: In function 'funPatched':
main.c:31: warning: implicit declaration of function 'vshCtrlReadBufferPositive'
main.c: In function 'module_start':
main.c:57: error: 'sceVshBridge_Driver' undeclared (first use in this function)
main.c:57: error: (Each undeclared identifier is reported only once
main.c:57: error: for each function it appears in.)
main.c:57: error: 'sceVshBridge' undeclared (first use in this function)
make: *** [main.o] Error 1
J'ai pas trop compris pourquoi il me dit que "sceVshBridge_Driver" et "sceVshBridge" ne sont pas déclarés...
Merci d'avance!!
Mickael2054
P.S. Désolé pour la question de noob^^
Offline
Parceque ce sont des type char donc c'est :
u32 orgaddr = sctrlHENFindFunction("sceVshBridge_Driver", "sceVshBridge", 0xC6395C03);
Et non :
u32 orgaddr = sctrlHENFindFunction(sceVshBridge_Driver, sceVshBridge, 0xC6395C03);
Au passage pour pouvoir utiliser vshCtrlReadBufferPositive(SceCtrlData* pad_data, int count);
il faut quelle sois importer donc :
int (* vshCtrlReadBufferPositive)(SceCtrlData* pad_data, int count);
// Pour l'entrée du module
int module_start(SceSize args, void *argp)
{
// Récupère la fonction original vshCtrlReadBufferPositive avec le NomDuModule, NomDeLaLibrairie, Nid
u32 orgaddr = sctrlHENFindFunction("sceVshBridge_Driver", "sceVshBridge", 0xC6395C03);
// Import de la fonction vshCtrlReadBufferPositive
vshCtrlReadBufferPositive = (void *) orgaddr;
// Patche la fonction original vshCtrlReadBufferPositive avec le Syscall
sctrlHENPatchSyscall(orgaddr, funPatched);
// Écris les données dans la mémoire cache
sceKernelDcacheWritebackAll();
// Invalide le cache d'instruction du CPU.
sceKernelIcacheClearAll();
// Renvoi 0 pour déclarer une fin de fonction
return 0;
}
Offline
Offline
Merci ça va me servir ![]()
Offline
Puis-je voir le code source à la psnpatch.prx?
Offline
Pourquoi donc ?
Offline
Zer01ne wrote:
Pourquoi donc ?
Parce que je veut voir comment vous codé le PSN pour que je puisse tester quelques jeux en ligne qui traite avec PSN. Il serait m'aider à comprendre beaucoup plus dans la façon de programmer PSN
Last edited by j7rofessor (22-02-2010 03:33:13)
Offline
Je ne fait rien d'autre que de remplacer une valeur par 0 pour permettre d'accéder au PSN sans supprimer sont compte rien d'autre.
Offline
Zer01ne wrote:
Je ne fait rien d'autre que de remplacer une valeur par 0 pour permettre d'accéder au PSN sans supprimer sont compte rien d'autre.
Je voudrais encore de voir la source si thats cool avec vous. Il m'aide un lot
Offline
Je vous est ajouter sur MSN ![]()
Offline
Voici mon nom sur MSN j7rofessor
Offline