Win32, Wie kann ich Funktionen in kompilierte Programme mit C ++ einbinden?

Nehmen Sie zum Beispiel diese Funktion (im Ollydbg-Debugger angezeigt)

Der erste PUSH-EBP-Befehl ist der Start für ein void * f (int32_t n) (idk was er zurückgibt, nur void erraten *). Ich weiß, dass der Eingabeparameter n auf dem Stapel liegt und EBP + 8 ein Zeiger ist Für diese Variable wäre es vermutlich wie folgt: int * n = (int *) (uint32_t (EBP) + 0x08); / * Unter der Annahme, dass EBP eine Lücke ist * und sizeof (EBP) == sizeof (uint32_t) == sizeof (void *) und dass die +8-Mathematik in c ++ uint32_t und x86-Assembly identisch ist. * /

Ich möchte einen Hook erstellen, der überprüft, ob n über 7 oder unter 0 liegt. Wenn dies der Fall ist, ändern Sie ihn in 1. Mit ollydbg kann ich den Assembler-Code direkt schreiben und den ersten MOV EBP patchen , ESP-Anweisung an JMP KURZ an die INT3-Anweisung dahinter (ich benötige 7 Bytes), dann ändern Sie die (nicht verwendeten) INT3-Anweisungen in MOV EBP, ESP JMP LONG 0068BCCD, wobei 0068BCCD für die nicht verwendeten 0x000000000000-Anweisungen am Ende der Datei steht

, dann kann ich auf der 0068BCCD die Assembler-Codes schreiben, um den Int zu überprüfen, auf den EBP + 8 zeigt, und ihn bei Bedarf ändern:

PUSHAD
CMP DWORD PTR SS:[EBP+8],7
JA SHORT Error
CMP DWORD PTR SS:[EBP+8],0
JL SHORT Error
JMP SHORT Finished
Error:
PUSHAD
PUSH OFFSET TheString
CALL Onlink-x86.App::Output
ADD ESP,4
POPAD
MOV DWORD PTR SS:[EBP+8],1
Finished:
POPAD
JMP LONG 00447493
TheString:
"Warning: label assertion failed, but (pretending its 1 and) trying to ignore.."+0x00

which (wenn ich nicht versaut habe) ist im Grunde das Äquivalent von

void FilterIntAtEBP_8(){
int i=*(int*)(uint32_t(EBP)+8);
if(i>7 || i<0){
Output("Warning: label assertion failed, but (pretending its 1 and) trying to ignore..");
*(int*)(uint32_t(EBP)+8)=1;
}
return;
}

Finally, hier ist die Frage: Wie kann ich diesen Haken machen, nicht mit Ollydbg, aber mit C ++? (Ich habe vor langer Zeit einen Quellcode gesehen, ein MMORPG-Cheat-Programm, das den Client einbindet, aber der Code geht mir verloren.)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage