Hey HaBo =)
Habe ein kleines Problem und bekomme einfach keine (einfach) Lösung raus.
Ich will eine Adresse im Speicher anspringen(in dem Fall SetCursorPos)
Das Problem ist es jedoch, diese Adresse zur Laufzeit anzuspringen.
So hab ich eine Funktion
Olly sagt dazu
Soweit sogut, aber irgendwie hab ich noch ne menge Zeugs aufm Stack..
D.h. die Parameter sind weiter unten
Wie komme ich am leichtesten an die Parameter?
Generell scheint mir die Funktion irgendwie umständlich.. Geht es nicht viel einfacher?
Danke im voraus
P.s. Die Stackansicht ist gebreakt @ CALL EBX (0040141D)
EDIT:
Ich möchte es nicht mit typedef usw machen, da ich meine Funktion quasi noch etwas umleiten will
also die Funktion ist jetzt roh, da soll vorher noch was bearbeitet werden und dann mitten in die SetCursorPos reingesprungen werden.
Habe ein kleines Problem und bekomme einfach keine (einfach) Lösung raus.
Ich will eine Adresse im Speicher anspringen(in dem Fall SetCursorPos)
Das Problem ist es jedoch, diese Adresse zur Laufzeit anzuspringen.
So hab ich eine Funktion
Code:
BOOL callSetCursorPos(int x, int y){
int blubb = (int)GetProcAddress(LoadLibrary("user32.dll"), "SetCursorPos");
asm("call %%ebx":"+b" (blubb));
asm("leave"); //<- Zur Returnaddresse aufm Stack rücken
asm("ret");//Hier will ich den Rückgabewert direkt 'Weiterreturnen'
return 0; // <- Dummy dass der Compiler nicht meckert.
}
Code:
004013EE /$ 55 PUSH EBP
004013EF |. 89E5 MOV EBP,ESP
004013F1 |. 53 PUSH EBX ; USER32.SetCursorPos
004013F2 |. 83EC 14 SUB ESP,14
004013F5 |. C70424 5D204400 MOV DWORD PTR SS:[ESP],ggTest.0044205D ; |ASCII "user32.dll"
004013FC |. E8 4F3F0100 CALL <JMP.&KERNEL32.LoadLibraryA> ; \LoadLibraryA
00401401 |. 83EC 04 SUB ESP,4
00401404 |. C74424 04 68204400 MOV DWORD PTR SS:[ESP+4],ggTest.00442068 ; |ASCII "SetCursorPos"
0040140C |. 890424 MOV DWORD PTR SS:[ESP],EAX ; |USER32.SetCursorPos
0040140F |. E8 443F0100 CALL <JMP.&KERNEL32.GetProcAddress> ; \GetProcAddress
00401414 |. 83EC 08 SUB ESP,8
00401417 |. 8945 F8 MOV [LOCAL.2],EAX ; USER32.SetCursorPos
0040141A |. 8B5D F8 MOV EBX,[LOCAL.2] ; USER32.SetCursorPos
0040141D |. FFD3 CALL EBX ; USER32.SetCursorPos
0040141F |. 895D F8 MOV [LOCAL.2],EBX ; USER32.SetCursorPos
00401422 |. C9 LEAVE
00401423 \. C3 RETN
00401424 . B8 00000000 MOV EAX,0
00401429 . 8B5D FC MOV EBX,DWORD PTR SS:[EBP-4]
0040142C . C9 LEAVE
0040142D . C3 RETN
Code:
0022FF20 77D10000 USER32.77D10000
0022FF24 77D55E4B USER32.SetCursorPos
0022FF28 00000008
0022FF2C 77C04E2F RETURN to msvcrt.77C04E2F from msvcrt.77C09D59
0022FF30 77D55E4B USER32.SetCursorPos
0022FF34 7FFDE000
0022FF38 /0022FF78
0022FF3C |0040150E RETURN to ggTest.0040150E from ggTest.004013EE
0022FF40 |00000001 <---- [COLOR=Red][B]PARAM[/B][/COLOR]
0022FF44 |00000002 <---- [COLOR=Red][B]PARAM[/B][/COLOR]
0022FF48 |0040CD28 ggTest.0040CD28
0022FF4C |004014F5 RETURN to ggTest.004014F5 from ggTest.0040D238
D.h. die Parameter sind weiter unten
Wie komme ich am leichtesten an die Parameter?
Generell scheint mir die Funktion irgendwie umständlich.. Geht es nicht viel einfacher?
Danke im voraus
P.s. Die Stackansicht ist gebreakt @ CALL EBX (0040141D)
EDIT:
Ich möchte es nicht mit typedef usw machen, da ich meine Funktion quasi noch etwas umleiten will
also die Funktion ist jetzt roh, da soll vorher noch was bearbeitet werden und dann mitten in die SetCursorPos reingesprungen werden.
Zuletzt bearbeitet: