1. Ce site utilise des "témoins de connexion" (cookies) conformes aux textes de l'Union Européenne. Continuer à naviguer sur nos pages vaut acceptation de notre règlement en la matière. En savoir plus.

Résolu Appeler applymultidamage via un module ?

Discussion dans 'Support des modules AMX Mod X ou Metamod indépendants de la base' démarrée par Midori, 13 Juillet 2014.

  1. Midori

    Midori Membre

    Bonjour, je voudrais appeler cette fonction :

    PHP:
    //
    // ApplyMultiDamage - inflicts contents of global multi damage register on gMultiDamage.pEntity
    //
    // GLOBALS USED:
    //      gMultiDamage

    void ApplyMultiDamage(entvars_t *pevInflictor, entvars_t *pevAttacker )
    {
        Vector      vecSpot1;//where blood comes from
        Vector      vecDir;//direction blood should go
        TraceResult tr;
       
        if ( !gMultiDamage.pEntity )
            return;

        gMultiDamage.pEntity->TakeDamage(pevInflictor, pevAttacker, gMultiDamage.amount, gMultiDamage.type );
    }
    Dans un module mais il m'est impossible de le faire correctement, le serveur crash à l'appelle de cette fonction, je pense que je passe des mauvais types dedans, il n'y a que ça de toute façon.

    D'après le tutoriel pour rechercher les signatures j'ai trouvé ceci :
    0x8B,*,*,*,*,*,0x85,*,0x74,*,0x8B,*,*,*,*,*,0x8B,*,0x52​

    Signature_Making.

    Dans tous les cas je suis sûr que le Hook est réussit car ma fonction me retourne des pointeurs non égaux à 0.

    Voici la fonction où je vais chercher tout ça :

    PHP:
    bool HookMemoryFunctions( )
    {
    #ifdef _WIN32
        g_pClearMultiDamage_Addr = Hooker -> MemorySearch< Func_ClearMultiDamage >( "0x33,*,0xA3,*,*,*,*,0xA3,*,*,*,*,0xA3,*,*,*,*,0xC3", ( void* )gpGlobals, FALSE );
        g_pApplyMultiDamage_Addr = Hooker -> MemorySearch< Func_ApplyMultiDamage >( "0x8B,*,*,*,*,*,0x85,*,0x74,*,0x8B,*,*,*,*,*,0x8B,*,0x52", ( void* )gpGlobals, FALSE );
    #else
        g_pClearMultiDamage_Addr = Hooker -> MemorySearch< Func_ClearMultiDamage >( "_Z16ClearMultiDamagev", ( void* )gpGlobals, TRUE );
        g_pApplyMultiDamage_Addr = Hooker -> MemorySearch< Func_ApplyMultiDamage >( "_Z16ApplyMultiDamageP9entvars_sS0_", ( void* )gpGlobals, TRUE );
    #endif

        return ( g_pClearMultiDamage_Addr != NULL && g_pApplyMultiDamage_Addr != NULL );
    }
    Le problème vient d'ici :

    PHP:
    void ClientCommand_Post( edict_t * pPlayer )
    {
        const char * c = g_engfuncs. pfnCmd_Argv( 0 );

        if( c && !strcmp( c, "ApplyMultiDamage" ) )
        {
            g_pClearMultiDamage_Addr( );

            SERVER_PRINT( "\n\nTest fonction ApplyMultiDamage( ) : " );
            g_pApplyMultiDamage_Addr( &( pPlayer -> v ), &( pPlayer -> v ) );
            SERVER_PRINT( "OK\n\n" );
        }

        RETURN_META( MRES_IGNORED );
    }
    Le serveur plante dès que g_pApplyMultiDamage_Addr est appelé, pourtant, les types correspondent et d'après le code source vu que la variable gMultiDamage. pEntity est NULLE, la fonction s'arrêtera au niveau du return, du coup ça ne devrait pas faire ça.

    Voici le code source au complet au cas où, j'arrive vraiment pas à comprendre d'où ça vient :

    PHP:
    #include "amxxmodule.h"

    CHooker  HookerClass;
    CHooker * Hooker = &HookerClass;

    typedef void ( * Func_ClearMultiDamage )( );
    typedef void ( * Func_ApplyMultiDamage )( entvars_t *, entvars_t * );

    Func_ClearMultiDamage g_pClearMultiDamage_Addr = NULL;
    Func_ApplyMultiDamage g_pApplyMultiDamage_Addr = NULL;

    void ClientCommand_Post( edict_t * pPlayer )
    {
        const char * c = g_engfuncs. pfnCmd_Argv( 0 );

        if( c && !strcmp( c, "ApplyMultiDamage" ) )
        {
            g_pClearMultiDamage_Addr( );

            SERVER_PRINT( "\n\nTest fonction ApplyMultiDamage( ) : " );
            g_pApplyMultiDamage_Addr( &( pPlayer -> v ), &( pPlayer -> v ) );
            SERVER_PRINT( "OK\n\n" );
        }

        RETURN_META( MRES_IGNORED );
    }

    bool HookMemoryFunctions( )
    {
    #ifdef _WIN32
        g_pClearMultiDamage_Addr = Hooker -> MemorySearch< Func_ClearMultiDamage >( "0x33,*,0xA3,*,*,*,*,0xA3,*,*,*,*,0xA3,*,*,*,*,0xC3", ( void* )gpGlobals, FALSE );
        g_pApplyMultiDamage_Addr = Hooker -> MemorySearch< Func_ApplyMultiDamage >( "0x8B,*,*,*,*,*,0x85,*,0x74,*,0x8B,*,*,*,*,*,0x8B,*,0x52", ( void* )gpGlobals, FALSE );
    #else
        g_pClearMultiDamage_Addr = Hooker -> MemorySearch< Func_ClearMultiDamage >( "_Z16ClearMultiDamagev", ( void* )gpGlobals, TRUE );
        g_pApplyMultiDamage_Addr = Hooker -> MemorySearch< Func_ApplyMultiDamage >( "_Z16ApplyMultiDamageP9entvars_sS0_", ( void* )gpGlobals, TRUE );
    #endif

        return ( g_pClearMultiDamage_Addr != NULL && g_pApplyMultiDamage_Addr != NULL );
    }

    void OnPluginsLoaded( void )
    {
        SERVER_PRINT( "\n\nOnPluginsLoaded\n\n" );

        if( HookMemoryFunctions( ) == true )
        {
            SERVER_PRINT( "\n\nSignatures :: OK ::\n\n" );
            SERVER_PRINT( "Test fonction ClearMultiDamage( ) : " );

            g_pClearMultiDamage_Addr( );

            SERVER_PRINT( "OK\n\n" );
        }
        else
        {
            SERVER_PRINT( "\n\nSignatures :: ERREUR ::\n\n" );
        }
    }
     
    Tags:
  2. Arkshine

    Arkshine Le Docteur

    Là, comme ça je ne vois rien d'anormal. Les signatures semblent correctes.

    Ca crashe si tu hookes ApplyMultiDamage ?
    Ca crashe sous linux ?
     
  3. Midori

    Midori Membre

    Ça crashe quand j'appelle ApplyMultiDamage, le hook me renvoie bien une adresse valide et ne plante pas.

    Je viens d'essayer sous Linux, les signatures ne sont même pas bonnes apparemment :eek: 

    EDIT :
    Je ne comprends pas, la signature devrait être bonne (pour Linux), je vais t'expliquer ce que j'ai fais, peut être qu'il y a une erreur quelque part.

    (Je t'explique juste pour ApplyMultiDamage, étant donné que pour ClearMultiDamage j'ai fais le même procédé)

    Déjà j'ai trouvé la fonction avec IDA :

    Signatures_Making_Linux.

    J'ai testé les deux méthodes pour Hook ApplyMultiDamage :

    1 ère -- J'ai pris ce qui est encadré en noir (le symbole de la fonction) :

    PHP:
    g_pApplyMultiDamage_Addr = Hooker -> MemorySearch< Func_ApplyMultiDamage >( "_Z16ApplyMultiDamageP9entvars_sS0_", ( void* )gpGlobals, TRUE );
    2ème -- J'ai pris ce qui est encadré en rouge pour faire la signature d'octets :

    PHP:
    g_pApplyMultiDamage_Addr = Hooker -> MemorySearch< Func_ApplyMultiDamage >( "0x83,*,*,0xA1,*,*,*,*,0x85,*,0x74,*,0x8B,*,*,*,*,*,0x8B,*,0x89,*,*,0x89", ( void* )gpGlobals, FALSE );
    Aucune des deux méthodes ne marche, je ne comprends vraiment pas pourquoi, tu aurais une idée ??
     
    Dernière édition: 14 Juillet 2014
  4. Arkshine

    Arkshine Le Docteur

    Je crois qu'il faut que tu utilises __fastcall comme convention pour windows.
    Tu vois ce que je veux dire ?

    Genre :
    Code (C):
    #if defined(_WIN32)
        reinterpret_cast<void (__fastcall*)(entvars_t *, entvars_t *)>(g_pApplyMultiDamage_Addr)(&(pPlayer->v), &(pPlayer->v));
    #elif defined(__linux__) || defined(__APPLE__)
        reinterpret_cast<void (*)(entvars_t, *entvars_t *)>(g_pApplyMultiDamage_Addr)(&(pPlayer->v), &(pPlayer->v));
    #endif
     
    Dernière édition: 14 Juillet 2014
  5. Midori

    Midori Membre

    Arf désolé j'ai oublié de dire que j'ai déjà testé ces alternatives, j'ai même testé avec "__cdecl" "__thiscall" etc, ... (Trop désespéré, lol)

    J'ai essayé de me pencher un peu sur le code source d'Orpheu pour voir comment le module appelle ça, mais franchement après un petit coup d'oeil vu le code source il faudra que je mette un petit moment avant de bien comprendre :) 

    EDIT : Tu saurais pourquoi mes signatures sous Linux sont obsolètes ? Etant donné que je test tout ça sur des serveurs dédi je me pose des questions sur mes installations :lurking:  (Mais vu qu'il détecte la signature sur Windows et que ClearMultiDamage marche, ça ne vient pas de là)
     
  6. Arkshine

    Arkshine Le Docteur

    C'est ce que j'utilise pour les modules. C'est ce que utilises Ham par exemple aussi. Tu devrais essayer encore.
     
  7. Midori

    Midori Membre

    Oui c'est ce que j'utilise aussi pour hook les fonctions virtuels dans les modules, comme Ham le fait.
    Je vais refaire une série de tests, je te tiens au courant.
    --- Message fusionné : 16 Juillet 2014 ---
    Impossible de faire quoi que ce soit, je viens de mettre le projet en attaché :cyclops: 
     

    Pièces jointes:

    • Seiko.zip
      Taille du fichier:
      46.9 Ko
      Affichages:
      229
  8. Arkshine

    Arkshine Le Docteur

    Je n'ai pas bien cherché longtemps.

    gpGlobals pointe sur... la librarie engine. Forcément ça ne risque pas de bien fonctionner. T'as pas eu de chance que ça trouve une adresse. :ROFLMAO: 

    Pour pointer sur le mod, tu peux utiliser MDLL_Spawn par exemple.

    Me disait bien que t'avais fais ton bouley. :p 
     
  9. Midori

    Midori Membre

    Oh merde :troll: , j'ai chié dans la colle Doc'.
    Je modifierai mon code ce soir mais dans tous les cas je pense que ça sera bon (donc je met le poste en résolu).

    Merci beaucoup ;)  !

    EDIT : Ça explique bien pourquoi le hook sous Linux n'était pas bon, l'erreur toute bête ..
     

Partager cette page

Chargement...
Chargement...