Anzahl der Parameter einer Funktion? (ollbydbg)



  • Hallöle,

    wie kann ich bestimmen, wie viele Parameter eine Funktion hat?

    Hier mal der Ausschnitt

    PUSH EBP
    MOV EBP,ESP
    SUB ESP,8
    PUSH EBX
    MOV DWORD PTR SS:[EBP-8],ECX
    MOV EAX,DWORD PTR SS:[EBP+8]
    MOV DWORD PTR SS:[EBP-4],EAX
    \MOV ECX,DWORD PTR SS:[EBP+C]
    MOV EDX,DWORD PTR SS:[EBP+C]
    SUB EDX,1
    MOV DWORD PTR SS:[EBP+C],EDX
    TEST ECX,ECX
    JE SHORT ******
    MOV EAX,DWORD PTR SS:[EBP+10]
    MOV ECX,DWORD PTR DS:[EAX]
    SHR ECX,8
    MOV EDX,DWORD PTR SS:[EBP+10]
    MOV EAX,DWORD PTR DS:[EDX]
    AND EAX,0FF
    MOV EDX,DWORD PTR SS:[EBP-4]
    XOR EBX,EBX
    MOV BL,BYTE PTR DS:[EDX]
    XOR EAX,EBX
    MOV EDX,DWORD PTR SS:[EBP+14]
    XOR ECX,DWORD PTR DS:[EDX+EAX*4]
    MOV EAX,DWORD PTR SS:[EBP+10]
    MOV DWORD PTR DS:[EAX],ECX
    MOV ECX,DWORD PTR SS:[EBP-4]
    ADD ECX,1
    MOV DWORD PTR SS:[EBP-4],ECX
    \JMP SHORT *****
    POP EBX
    MOV ESP,EBP
    POP EBP
    RETN 10
    

    Ich bitte auch um eine Erklärung 🙂

    Danke



  • Ich denke, mit ein Paar mutigen Vermutungen, die Funktion sieht so aus:

    void func(char *pParam1, int Param2, void Param3, int *pParam4, void Param5, int *pParam6)
    {
        char *pData = pParam1;
        int b = ECX;
    
        int tmp = Param2;
        int index;
    
        --Param2;
    
        while (tmp)
        {
            tmp = (*pParam4 / 256);
            index = (*pParam4 & 0xFF) ^ *pData;
            tmp ^= pParam6[index];
            *pParam4 = tmp;
            ++pData;
        }
    }
    

    Param3 und Param5 werden nicht benutzt, scheinbar. Und hier die Erklärung:

    PUSH EBP 
    MOV EBP,ESP 
    SUB ESP,8 
    PUSH EBX 
    MOV DWORD PTR SS:[EBP-8],ECX 
    MOV EAX,DWORD PTR SS:[EBP+8]    // Parameter 1
    MOV DWORD PTR SS:[EBP-4],EAX 
    \MOV ECX,DWORD PTR SS:[EBP+C]   // Parameter 2
    MOV EDX,DWORD PTR SS:[EBP+C]    // Parameter 2
    SUB EDX,1 
    MOV DWORD PTR SS:[EBP+C],EDX 
    TEST ECX,ECX 
    JE SHORT ****** 
    MOV EAX,DWORD PTR SS:[EBP+10]   // Parameter 4
    MOV ECX,DWORD PTR DS:[EAX] 
    SHR ECX,8 
    MOV EDX,DWORD PTR SS:[EBP+10]   // Parameter 4
    MOV EAX,DWORD PTR DS:[EDX] 
    AND EAX,0FF 
    MOV EDX,DWORD PTR SS:[EBP-4] 
    XOR EBX,EBX 
    MOV BL,BYTE PTR DS:[EDX] 
    XOR EAX,EBX 
    MOV EDX,DWORD PTR SS:[EBP+14]   // Parameter 6
    XOR ECX,DWORD PTR DS:[EDX+EAX*4] 
    MOV EAX,DWORD PTR SS:[EBP+10]   // Parameter 4
    MOV DWORD PTR DS:[EAX],ECX      
    MOV ECX,DWORD PTR SS:[EBP-4] 
    ADD ECX,1 
    MOV DWORD PTR SS:[EBP-4],ECX 
    \JMP SHORT ***** 
    POP EBX 
    MOV ESP,EBP 
    POP EBP 
    RETN 10
    

    Hoffe, habe keine Fehler gemacht...



  • Muesste PTR SS:[EBP+10] nicht der dritte Parameter sein? ...+14 vierte usw.?

    Die Formel lautet ja:
    [EBP + n*4 + 4]

    n = 0 ~> Ruecksprung Addresse
    n = 1 ~> Parameter 1
    n = n ~> Parameter n

    Wie kommst du da also auf 6Parameter ich Zaehle 4. 😕

    Gruß Tobi



  • T0bi schrieb:

    Wie kommst du da also auf 6Parameter ich Zaehle 4. 😕

    Stimmt, habe grade den Zettel gefunden, wo ich es ausgerechnet hatte, und was sehe ich denn da: 0, 4, 8, C, E, 10, 12, 14, 16 - weiss nicht, was in mich da gefahren ist. Natürlich muss Offset +4 sein: 0, 4, 8, C, 10, 14, 18, 1C usw...
    So müsste es nun richtig sein:

    PUSH EBP
    MOV EBP,ESP
    SUB ESP,8
    PUSH EBX
    MOV DWORD PTR SS:[EBP-8],ECX
    MOV EAX,DWORD PTR SS:[EBP+8]    // Parameter 1
    MOV DWORD PTR SS:[EBP-4],EAX
    \MOV ECX,DWORD PTR SS:[EBP+C]   // Parameter 2
    MOV EDX,DWORD PTR SS:[EBP+C]    // Parameter 2
    SUB EDX,1
    MOV DWORD PTR SS:[EBP+C],EDX    // Parameter 2
    TEST ECX,ECX
    JE SHORT ******
    MOV EAX,DWORD PTR SS:[EBP+10]   // Parameter 3
    MOV ECX,DWORD PTR DS:[EAX]
    SHR ECX,8
    MOV EDX,DWORD PTR SS:[EBP+10]   // Parameter 3
    MOV EAX,DWORD PTR DS:[EDX]
    AND EAX,0FF
    MOV EDX,DWORD PTR SS:[EBP-4]
    XOR EBX,EBX
    MOV BL,BYTE PTR DS:[EDX]
    XOR EAX,EBX
    MOV EDX,DWORD PTR SS:[EBP+14]   // Parameter 4
    XOR ECX,DWORD PTR DS:[EDX+EAX*4]
    MOV EAX,DWORD PTR SS:[EBP+10]   // Parameter 3
    MOV DWORD PTR DS:[EAX],ECX
    MOV ECX,DWORD PTR SS:[EBP-4]
    ADD ECX,1
    MOV DWORD PTR SS:[EBP-4],ECX
    \JMP SHORT *****
    POP EBX
    MOV ESP,EBP
    POP EBP
    RETN 10
    

    Es gibt nur 4 Parameter. Das mit der Umwandlung nach C lass ich es sein, bevor ich noch mehr Scheiss baue... Der arme Lubu ist jetzt wahrscheinlich komplett durcheinander.



  • ^^


Anmelden zum Antworten