WinApi hooken?
-
SetCursorPosA + länge der Opcodes bist jmp [DLLFunc] + 5 für die länge des Opcodes jmp
Absprung = (DWORD)GetProcAddress(hInst, "SetCursorPosA") + opcodes + 5
was sind die länge der Opcodes?
-
Also entweder kannste ned lesen oder du verstehst due Grundlagen nicht!?
In beiden Fällen rate ich dir lass es einfach!
-
also als erstes, ein einfachs +5 tuts nicht. das verschiebt den offset um
5 * sizeof(funcptr) = 20 bytes. zuerst nach char castender offset wird vom folgenden befehl aus gerechnet
quelle = newfunc + 5 + 5
ziel = func + 5ziel - quelle = func - newfunc - 5
edianprobleme hatte ich auf meinem intel x86 nicht

hab aber auch das ganze DWORD reinkopiert also nicht byteweisemusste aber n bissel ruumprobierenbis das aufs byte genau passt, ober von
obriger formel sollte man ausgehen. (disassembly im debugmodus > all)morgen guck ich nochmal den genauen wert nach
-
helferlein schrieb:
edianprobleme hatte ich auf meinem intel x86 nicht

hab aber auch das ganze DWORD reinkopiert also nicht byteweiseAlso beim schreiben in Inline Assembly war des bei mir au keine Problem, aber beim auslesen eines jmp + Offset eines Prozesses, siehe verheriger Link, wusste ich nicht wo der hinspringt wegen dem Little-Endian-Format und kommte somit meine Funktion nicht patchen.
Gruß Pingu
-
wie gehört es sich denn richtig?
-
helferline ich habe es so gemacht wie du gesagt hast:
#include <windows.h> #include <iostream> using namespace std; DWORD DLLFunc; BOOL __declspec(naked) SetCursorPosA(int x, int y) { __asm { mov edi, edi push ebp mov ebp, esp jmp [DLLFunc] } } int main() { Sleep(2000); HINSTANCE hInst = LoadLibrary(TEXT("user32.dll")); HINSTANCE hInst2 = GetModuleHandle(0); DLLFunc = (DWORD)GetProcAddress(hInst, "SetCursorPos") + (char)5 - (DWORD)GetProcAddress(hInst2, "SetCursorPosA") + (char)5 + (char)5; SetCursorPosA(0, 0); return 0; }Aber jetzt führt es nichtmal mehr die funktion aus
-
hier nochmal der vorherige code
#include <windows.h> #include <iostream> using namespace std; DWORD DLLFunc; BOOL __declspec(naked) SetCursorPosA(int x, int y) { __asm { mov edi, edi push ebp mov ebp, esp jmp [DLLFunc] } } int main() { Sleep(2000); HINSTANCE hInst = LoadLibrary(TEXT("user32.dll")); DLLFunc = (DWORD)GetProcAddress(hInst, "SetCursorPos") + 5; SetCursorPosA(20, 20); Beep(2000, 200); cout << "lol"; Sleep(1000); return 0; }Alles funktioniert einwandfrei SetCursorPos wird auch ausgeführt und Beep usw auch, erst bei return 0; crashed es. Darauf zeigt der Debugger:
00344A78 or byte ptr [edx+34h],0
wie kann etwas bei return 0 crashen oO
-
man schonmal was von nem debugger gehört -wenn du schon solche hässliche frickelei machst, dann debugg den schrott gefälligst selbst

-
ich hab schon den debugger benützt:
00344A78 or byte ptr [edx+34h],0
aber das sagt mir nichts
-
Frickel mal richtig:
BOOL __stdcall __declspec (naked) SetCursorPosA (int x, int y)Ohne "__stdcall" frickelt der Kompiler noch ein
PUSH 14 PUSH 14 CALLN FRICKEL.SetCursorPosA ADD ESP,+08 ; <- :open_mouth:nach dem Funktionsaufruf hinzu, was dann den Stack durcheinanderfrickelt.
-
oberfrickel schrieb:
BOOL __stdcall __declspec (naked) SetCursorPosA (int x, int y)Das __stdcall muss denke ich nach __declspec (naked) sonst geht es nicht.
Falls du kein __stdcall haben willst, kannst du den Stack auch wieder in Ordnung bringen:__asm { mov esp, ebp pop ebp }
-
danke ich hab das jetzt zum laufen gebracht nur leider funktioniert das ganze nur mit funktionen aus der user32. Wieso geht das bei kernel funktionen nicht?