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