Eigenes Programm detouren

Hi,

ich habe mir ein Opferprogramm geschrieben und deren Funktionsadresse mit IDA ermittelt.

Opfer:

Code:
void show (int i)
{
	cout << i << endl;
}

int main(int argc, char *argv[]) 
{
	int i = 0;

	while ( i < 100 )
	{
		if (kbhit())
		{
			show (i);
			i++;
			getch();
		}
	}  return 0;
}

Nun wollte ich mit Detours die show Funktion abfangen und den Wert (i) verändern.

Hook:

Code:
typedef void (__cdecl *ShowType) ( int i );

ShowType show_o = NULL;

void __cdecl show ( int i )
{
	i *= 2;
	return show_o(i);
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
           
            show_o = (ShowType) (DetourFunction((PBYTE)0x00401000, (PBYTE)show ));
			break;

        case DLL_PROCESS_DETACH:

			DetourRemove((PBYTE)0x00401000, (PBYTE)show );
            
            break;
	}
    return TRUE; // succesful
}

Das detouren an sich klappt auch wunderbar, mein Problem ist leider nur die Variable "i".
Der Wert ist immer um die 2 Millionen hoch, selbst wenn ich i unverändert an die Originalfunktion weitergebe o0

Mache ich etwas falsch ?
 
Wie genau hookst Du ? Schreibst Du am Anfang von Show einen Call zu der hookfunktion? Wenn ja: Du überschreibst damit ja auch den Stackframe "Aufbau" ;). Allerdings wundert es mich, dass das Programm nach show Aufruf nicht abstürzt. Sonst würden ein paar Details mehr sicherlich nicht schaden ;).

Edit: ach ja, eventuell verwendet msvc per default auch stdcall.
 
Ich vermute auch, dass die Aufrufkonventionen anders sind: Versuche mal in deinem Opferprogramm show ebenfalls als __cdecl zu deklarieren.

von CDW
Wie genau hookst Du ? Schreibst Du am Anfang von Show einen Call zu der hookfunktion? Wenn ja: Du überschreibst damit ja auch den Stackframe "Aufbau" Augenzwinkern .
Ich vermute mal er verwendet Detours: http://research.microsoft.com/en-us/projects/detours/
Dies sollte sich automatisch um eine entsprechende "Trampolinfunktion" kümmern, die die überschriebenen Opcodes ausführt.
 
Genau ich nutze Detours (v1.5).
Also ich habe die calling convention nun auf __cdecl gesetzt aber leider auch erfolglos :/
Die convention habe ich ebenfalls mit ida auslesen können also das dürfte auch stimmen.
 
Dann gehe am besten mal mit einem Debugger(z.B. OllyDbg) durch und schaue nach an welcher Stelle der Fehler entsteht.
 
Zurück
Oben