2017-08-09 3 views
-2

versucht, eine Prozessfunktion mit FastCall Convention aus meinem Programm aufrufen, bekam aber immer einen Absturz zu versuchen. Haben so viel Zeit darauf bestanden, und dass nicht lösen kann ... Hilfe brauchen bitte ... hier alle benötigten Informationen und mein Versuch:Fastcall Funktion stürzt ab

enter image description here

Das Bild zeigt die Anweisung Kontext nach einem Breakpoint wenn das Programm die Funktion läuft ...

Und hier ist mein Code Quelle:

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; 
} 

Vielen Dank im Voraus :) ...

+1

Diese Frage kann nicht beantwortet werden, angesichts der Informationen präsentiert (Ich habe nicht auf den Bild-Link zu einer zufälligen Bild-Hosting-Site geklickt). Es gibt keine Möglichkeit für uns, zu wissen, welche Aufrufkonvention die Funktion bei Offset '0x5C400' erwartet, aber wenn es zu einem '' Absturz '' führt, ist es logisch, dass es nicht der ist, den Sie angegeben haben. – IInspectable

+0

Wenn Sie das Bild überprüfen, sehen Sie ein Bild mit cheatengine debugging den Prozess, um die Adresse des Befehls mit vollen Stapelelementen zu erhalten, um nach den Parametern zu suchen, und meine Adressen/Parameter haben die gleichen Werte wie die im debbuger .. Was sollte ich Provider mehr, damit Sie mir antworten können? – Mouley

+0

Die ** true ** Signatur der Funktion bei Offset '0x5C400'. Bis jetzt sehen wir nur deine beste Schätzung. – IInspectable

Antwort

0

Wie in seinem Kommentar zu beachten ist, kam das Problem vom Zugriff auf den virtuellen Raum eines anderen Prozesses. Überprüfung der Windows-Speicherverwaltung und DLL-Injektion würde das Problem für mich gelöst ... vielleicht würde jemand in Zukunft das Gesicht.