[ASM] ESP - Probleme

Cromon

Erfahrenes Mitglied
Hallo zusammen!

Kurzfristig hat mich plötzlich die Lust gepackt wieder mal etwas in Assembler rumzustöbern. Meine KEnntnisse sind äusserst rudimentär und meine Praxiserfahrung mehr als gerin. Genau das möchte ich ändern.

Meine erste Programmidee:
Ich möchte so eine Art exceptionhandling mit trace machen. Vorgestellt habe ich mir das so:
Code:
#include <iostream>

static unsigned long dwOldFunc = 0;

void my_trap()
{
	__asm
	{
		pop dword ptr [dwOldFunc]
	}
	printf("Old retpoint: %X\n", dwOldFunc);
	__asm
	{
		push dwOldFunc
		retn
	}
}

static unsigned long gTrap = (unsigned long)my_trap;

void my_testfunc(unsigned long val)
{
	__asm
	{
		cmp val, 0h
		jnz end
		push gTrap
		retn
end:
	}
	printf("%u\n", val);
}

int main()
{
	unsigned long dwTest = (unsigned long)my_testfunc;
	printf("Orig: %u\n", dwTest);
	__asm
	{
		push 0h
		call dwTest
		add esp, 4
		nop
		nop
		nop
	}
	getchar();
}

Das hat nicht funktioniert! Ändere ich in my_trap das push vor dem ret in die Adresse von add esp, 4, so klappt es. Ich habe natürlich den Debugger angeschmissen und geschaut, was die Register so machen. Dabei ist mir aufgefallen, dass esp nicht nur um 4 verringer ist zum Zeitpunkt cmp val, 0h wie ich es wegen der Rücksprungadresse erwartet habe, sondern dass esp über 0x100 verringert ist. Daher pope ich in der Trapfunktion eine komplett falsche Adresse vom Stack.

Weiss jemand von euch vielleicht, woher das kommt? Muss ich meine testfunktion speziell deklarieren, dass der da nicht so viel macht?

Gruss
Cromon
 
Zurück