[C++]BMax Funktion durch Speicheraddresse aufrufen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

kog

Betreff: [C++]BMax Funktion durch Speicheraddresse aufrufen

BeitragDi, Nov 04, 2008 16:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Nov 04, 2008 17:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Nov 04, 2008 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber hast du dann wenigstens eine erklärung dazu, warum es mit *2 dann funktioniert Very Happy?
Also ich will nicht behaupten das deine Aussage falsch ist, stimmt schon. Aber wäre trotzdem wissenswert wieso es dann mit *2 funktioniert.
 

ChristianK

BeitragDi, Nov 04, 2008 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Nov 04, 2008 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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!

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group