[C++]BMax Funktion durch Speicheraddresse aufrufen
Übersicht

![]() |
kogBetreff: [C++]BMax Funktion durch Speicheraddresse aufrufen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Guten Tag, heute habe ich mich mal wieder mit hooking per C++ beschäftigt.
Habe bei einer sehr einfach Anwendung versucht per DLL eine BMax funktion aufzurufen / bzw. Umzuleiten. Code: [AUSKLAPPEN] SuperStrict
Framework brl.retro Import brl.system Function test:Int(i:Int) Return i*2 End Function Notify test(2) Notify Hex(Int(Byte Ptr(test))) Notify "End" in C++ definiere ich die Funktion so: Code: [AUSKLAPPEN] int __stdcall test_h(signed int i)
{ sprintf(buffer,"hihihi : %i",(signed int)i); MessageBoxA(0,buffer,"",0); return test_o(i*2); } Komisch ist, das der richtige i Wert (2) übergeben wird, doch sobald ich die original funktion wieder aufrufe mit dem i parameter stürtzt die Anwendung ab, sobald ich ein *2 nehme funktoniert es. Ich hoffe jemand hat eine zündente Lösung dafür.. Einen schönen Tag noch. *Edit* Was mir noch aufgefallen ist, sobald ich i*2 durch z.b. einen fixen Wert 2 ersetze, funktioniert es auch problemlos. *edit* Dies ist die Funktion im ASM Zustand zur Laufzeit: Code: [AUSKLAPPEN] ode:0041281A ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
code:0041281A code:0041281A ; Attributes: bp-based frame code:0041281A code:0041281A sub_41281A proc near ; CODE XREF: sub_41279C+32p code:0041281A ; DATA XREF: sub_41279C+4Eo code:0041281A code:0041281A arg_0 = dword ptr 8 code:0041281A code:0041281A push ebp code:0041281B mov ebp, esp code:0041281D mov eax, [ebp+arg_0] code:00412820 shl eax, 1 code:00412822 jmp short $+2 code:00412824 mov esp, ebp code:00412826 pop ebp code:00412827 retn code:00412827 sub_41281A endp |
||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es ist wenig verwunderlich, dass die Anwendung abstürtz, wenn du eine BMax-Eigene funktion von C aus aufrust. Das Bringt den GC vollkommen aus dem Takt und crashes sind nicht ungewöhnlich. | ||
![]() |
kog |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aber hast du dann wenigstens eine erklärung dazu, warum es mit *2 dann funktioniert ![]() Also ich will nicht behaupten das deine Aussage falsch ist, stimmt schon. Aber wäre trotzdem wissenswert wieso es dann mit *2 funktioniert. |
||
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich weiß nicht, ob das der Fehler ist, aber in der C++ Datei gibst du _stdcall als Aufrufkonvention an, während die BlitzMax-Funktion _cdecl ist. In dem Fall müsste dann hinter dem Funktionsnamen "Win32" stehen. | ||
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT |
![]() |
kog |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du bist ein Genie!
__stdcall hatte ich aus dem Tutorial für C++ Funktionen. Doch was mir schon öfters auffällt: Code: [AUSKLAPPEN] int _cdecl test_h(signed int i)
{ sprintf(buffer,""); MessageBoxA(0,buffer,"",0); return test_o(i); } so funktionierts tadellos, auch bei anderen OpenGL versuchen, musste ich bevor die Original funktion aufgerufen wurde, einen DummyFunktionsaufruf machen, da sonst alles abstürtzte. Hier ist es wieder gleich, sobald ich sprintf den Buffer mit "" fülle und per messageBoxA ausgeben klappts. Sobald ich die 2 Zeilen wieder wegnehme, stürtzt wieder alles ab. *edit* Es reicht auch schon wenn sprintf(buffer,""); drinnen bleibt vor dem aufruf! |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group