Black Dev's Team Forum

You are not logged in.

Announcement

You have a problem about programation ? Post it on the forum !
Black devs Team Security System Coming soon.
  • Index
  •  » PSP
  •  » [TUTO-C-Hook-FR] Partie 2 Trouver les info sur la fonction a hooker

#1 24-08-2009 01:51:25

Zer01ne
Site Admin
Registered: 22-08-2009
Posts: 44
Website

[TUTO-C-Hook-FR] Partie 2 Trouver les info sur la fonction a hooker

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

 

#2 26-08-2009 19:53:50

Mickael2054
Member
Registered: 24-08-2009
Posts: 10
Website

Re: [TUTO-C-Hook-FR] Partie 2 Trouver les info sur la fonction a hooker

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^^


Mickael2054

PSP FAT - Last custom firmware - DEV lua/C

Offline

 

#3 26-08-2009 20:02:18

Zer01ne
Site Admin
Registered: 22-08-2009
Posts: 44
Website

Re: [TUTO-C-Hook-FR] Partie 2 Trouver les info sur la fonction a hooker

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

 

#4 10-10-2009 18:49:17

Sh0ck
Member
Registered: 10-10-2009
Posts: 2
Website

Re: [TUTO-C-Hook-FR] Partie 2 Trouver les info sur la fonction a hooker

Très pratique ces deux tutoriaux, il me tarde de voir le reste, au passage, je suis nouveau wink

Offline

 

#5 10-10-2009 23:11:07

Zer01ne
Site Admin
Registered: 22-08-2009
Posts: 44
Website

Re: [TUTO-C-Hook-FR] Partie 2 Trouver les info sur la fonction a hooker

Merci smile

Offline

 

#6 20-01-2010 16:05:04

fou2psp
Member
Registered: 09-01-2010
Posts: 1

Re: [TUTO-C-Hook-FR] Partie 2 Trouver les info sur la fonction a hooker

Merci ça va me servir big_smile

Offline

 

#7 21-02-2010 17:11:11

j7rofessor
Member
Registered: 21-02-2010
Posts: 5

Re: [TUTO-C-Hook-FR] Partie 2 Trouver les info sur la fonction a hooker

Puis-je voir le code source à la psnpatch.prx?

Offline

 

#8 21-02-2010 23:47:52

Zer01ne
Site Admin
Registered: 22-08-2009
Posts: 44
Website

Re: [TUTO-C-Hook-FR] Partie 2 Trouver les info sur la fonction a hooker

Pourquoi donc ?

Offline

 

#9 22-02-2010 03:28:33

j7rofessor
Member
Registered: 21-02-2010
Posts: 5

Re: [TUTO-C-Hook-FR] Partie 2 Trouver les info sur la fonction a hooker

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

 

#10 24-02-2010 00:00:15

Zer01ne
Site Admin
Registered: 22-08-2009
Posts: 44
Website

Re: [TUTO-C-Hook-FR] Partie 2 Trouver les info sur la fonction a hooker

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

 

#11 24-02-2010 17:35:32

j7rofessor
Member
Registered: 21-02-2010
Posts: 5

Re: [TUTO-C-Hook-FR] Partie 2 Trouver les info sur la fonction a hooker

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

 

#12 25-02-2010 04:59:58

Zer01ne
Site Admin
Registered: 22-08-2009
Posts: 44
Website

Re: [TUTO-C-Hook-FR] Partie 2 Trouver les info sur la fonction a hooker

Je vous est ajouter sur MSN wink

Offline

 

#13 25-02-2010 14:53:09

j7rofessor
Member
Registered: 21-02-2010
Posts: 5

Re: [TUTO-C-Hook-FR] Partie 2 Trouver les info sur la fonction a hooker

Voici mon nom sur MSN j7rofessor

Offline

 
  • Index
  •  » PSP
  •  » [TUTO-C-Hook-FR] Partie 2 Trouver les info sur la fonction a hooker

Board footer

Propulsé par FluxBB
Traduction par FluxBB.fr