2017-08-09 1 views
-2

en essayant d'appeler une fonction de processus en utilisant la convention fastcall de mon programme, mais j'ai eu un plantage à chaque tentative. Ont passé beaucoup de temps là-dessus et ne peut pas résoudre ce ... besoin d'aide s'il vous plaît ... est ici toutes les informations nécessaires et mon essayer:La fonction Fastcall se bloque

enter image description here

L'image montre le contexte d'instruction après un point d'arrêt quand est en cours d'exécution ...

Et voici mon code source du programme de la fonction:

typedef void (__fastcall * MyFoo)(void * client,DWORD trash, DWORD ConstantD, DWORD objBattid, DWORD zeroParam, DWORD thousParam, float fVal,DWORD targetID); 
MyFoo launchMe; 

DWORD getProcessBaseAdress(DWORD ProcessID); 

char *flyffServer = "insanity flyff\0"; 

HWND neuzWindow = NULL; 
DWORD neuzProcessID = NULL; 
DWORD neuzRamAdress = NULL; 
HANDLE neuzHandle = NULL; 
DWORD clientAdr = NULL; 

int main(){ 
neuzWindow = FindWindowA(0,flyffServer); 
//-------------------------------------- 
if(neuzWindow){ 
    GetWindowThreadProcessId(neuzWindow,&neuzProcessID); 

    if(neuzProcessID){ 
     neuzHandle = OpenProcess(PROCESS_ALL_ACCESS,false,neuzProcessID); 

     if(neuzHandle){ 
      neuzRamAdress = getProcessBaseAdress(neuzProcessID); // Extracting Neuz's base address 

      if(neuzRamAdress){ 
       launchMe = (MyFoo)((DWORD)neuzRamAdress + 0x5C400); 
       clientAdr = (DWORD)neuzRamAdress + 0x8D0DC0; 

       printf("Instruction: 0x%08X\n",launchMe); 
       printf("Client ADR: 0x%08X\n",clientAdr); 

       for(;;Sleep(100)){ 
        //------------ init params ------------ 
        void * client = (void*)clientAdr; 
        DWORD trashDX = (DWORD)0x0000000B; 
        DWORD msge = (DWORD)0x0000001D; 
        DWORD selectedBattID = 0x04D4A929; 
        DWORD zeroParam = (DWORD) 0x00000000; 
        DWORD milleParam = 0x00010000; 
        float speedAtt = 0.07f; 
        DWORD targetID = 0x0089B964; 

        printf("0x%08X\n0x%08X\n0x%08X\n0x%08X\n0x%08X\n0x%08X\n%f\n0x%08X\n", 
         client, 
         trashDX, 
         msge, 
         selectedBattID, 
         zeroParam, 
         thousParam, 
         speedAtt, 
         targetID 
        ); 

         launchMe(client,trashDX,msge,selectedBattID,zeroParam,milleParam,speedAtt,targetID); // -> Error 
         scanf("%d",&trashDX); // for blocking the program 
         return 0; 
       } 
      } 
      else printf("Unable to access to Neuz's Ram Adress\n"); 
     } 
     else printf("Unable to obtain neuz's handle\n"); 
    } 
    else printf("Unable to detect neuz's process ID\n"); 
} 
else printf("Unable to detect neuz's window\n"); 
return 0; 
} 

DWORD getProcessBaseAdress(DWORD ProcessID){ 
    HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessID); 
    MODULEENTRY32 me32; 
    me32.dwSize = sizeof(MODULEENTRY32); 
    Module32First(hModuleSnap,&me32); 
    return (DWORD) me32.modBaseAddr; 
} 

Merci à l'avance :) ...

+1

Il est impossible de répondre à cette question étant donné les informations présentées (je n'ai pas cliqué sur le lien de l'image vers un site d'hébergement d'images aléatoires). Il n'y a aucun moyen pour nous de savoir, quelle convention d'appel la fonction à l'offset '0x5C400' attend, mais si cela entraîne un * "crash" * il va de soi que ce n'est pas celui que vous avez spécifié. – IInspectable

+0

Si vous vérifiez l'image, vous verrez une image avec cheatengine débobinant le processus pour obtenir l'adresse de l'instruction avec des éléments de pile complets pour vérifier les paramètres, et mes adresses/parameeters ont les mêmes valeurs que celles affichées dans le debbuger. Que devrais-je plus fournisseur de sorte que vous puissiez me répondre? – Mouley

+0

La signature ** true ** de la fonction au décalage «0x5C400». Jusqu'à présent, nous ne voyons que votre meilleure estimation. – IInspectable

Répondre

0

Comme IInspectable dans son commentaire, le problème est venu d'accéder à l'espace virtuel d'un autre processus. Vérification de la gestion de la mémoire Windows et de l'injection de DLL aurait résolu le problème pour moi ... peut-être que n'importe qui serait confronté à cela dans le futur.