Fremder Funktionsaufruf

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Der Eisvogel

Betreff: Fremder Funktionsaufruf

BeitragDi, März 29, 2011 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo

Da ich mit CreateRemoteThread keinen Erfolg hatte Funktionen anderer Programm mit mehreren Parametern aufzurufen habe ich mich zu Dll Injection gewagt. Die Injection klappt prima alles andere auch. Die Funktionen werden aufgerufen und bewirken ihren Zweck. Ja aber was ist den jetzt das Problem? Anscheinend wirft meine Dll ab und zu EXCEPTIONS. Das vermute ich zumindest mal, da das Programm auf welches ich mich beziehe eine eigene Abfangroutine für Exceptions hat und diese im Error Log immer ovn Access Violations in meiner Dll spricht.

Die Funktionen die ich aufrufen möchte werden laut IDA Pro so deklaiert:
Code: [AUSKLAPPEN]
public: virtual void __thiscall CPlayer::UseAction(int)
public: virtual void __thiscall CPlayer::SetTarget(long, signed char)


Diese Funktionen binde ich in meine Dll wie folgt ein:
BlitzMax: [AUSKLAPPEN]
Local SetTarget(param1:Int, param2:Byte) = Byte Ptr(settarget_address)
Local UseAction(param:Int) = Byte Ptr(useaction_address)


Bei SetTarget wird laut IDA Pro ein Long verlangt, aber wenn ich Long angebe, funktioniert die Funktion nicht deshalb nehme ich Int.

Diese Funktionen verwende ich dann in meiner Dll wie alle anderen. Also zum Beispiel so:
BlitzMax: [AUSKLAPPEN]
UseAction(3)


Diese Funktionsaufrufe funktionieren perfekt. Es passiert was passieren soll, aber nach kurzer Zeit schon stürzt das Programm ab und ich finde im Error Log eine Access Violation meiner Dll. Ich haber schon versucht den Fehler zu beseitigen in dem ich nur eine der beiden Funktionen verwende, aber egal welche ich benutze, es kommt zum Absturz.
Woran kann das liegen? Gibt es eine Möglichkeit dem Fehler auf die Spur zu gehen? Gibt es alternativen?

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

mpmxyz

BeitragMi, März 30, 2011 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe zwar keine großen Erfahrungen mit C++ gesammelt, aber kann es sein, dass diese 'Funktionen' eher 'Methoden' sind? (kein "static")
Wie man diese aber einbindet, weiß ich nicht.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

BtbN

BeitragMi, März 30, 2011 15:02
Antworten mit Zitat
Benutzer-Profile anzeigen
thiscall heisst immer, dass es sich um member funktionen handelt, die zu einer instanz der klasse gehören. thiscall ist eine calling convention, die BMax nicht beherrscht. Es ist also unmöglich, diese funktionen in BMax aufzurufen.

Selbst aus C++ herraus würde dies schwierig, da memberfunktions-pointer immer recht unsicher sind.

Der Eisvogel

BeitragMi, März 30, 2011 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber warum funktioniert es dann kurzzeitig und führt erst später zu einem Error?
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BtbN

BeitragMi, März 30, 2011 16:44
Antworten mit Zitat
Benutzer-Profile anzeigen
es kann auch kurzfristig nicht funktionieren, da du den this-pointer nicht mit an die funktion gibst.

Der Eisvogel

BeitragMi, März 30, 2011 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber es funktioniert. Das weiß ich, da ich ja sehe das meine Dll arbeitet, doch dann stürzt sie aufgrund einer Access Violation ab.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BtbN

BeitragMi, März 30, 2011 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht abstürzen und funktionieren sind 2 verschiedene dinge.

Der Eisvogel

BeitragMi, März 30, 2011 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Was genau willst du damit sagen?

Ich kann genaustens sehen, dass meine Dll arbeitet, da genau das passiert was die Dll bezwecken soll, was nicht passieren würde wenn die Dll nicht arbeiten würde, doch nach kurzer Zeit stürzt es ab.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

ChristianK

BeitragMi, März 30, 2011 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht greifen deine Methoden nicht auf Objektvariablen zu und benutzen so den this-Zeiger (der sich auf dem Stack befindet) nicht. Das würde erklären, warum das Programm nicht abstürzt.
Weil dein Programm aber von diesem Zeiger nichts weiß, wird er beim Aufruf auch nicht auf dem Stack gespeichert. Die Methode in der DLL setzt aber voraus, dass er sich dort befindet und versucht, ihn nach dem Aufruf vom Stack zu entfernen. Dabei werden fälschlicherweise andere Werte, die mit der Methode nichts zu tun haben, gelöscht, was dann zum Absturz führt.
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

Der Eisvogel

BeitragMi, März 30, 2011 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hört sich irgendwie schön plausibel an, dennoch etwas verwirrend, da ich dann wohl oft den teil erwische an dem die richtige Address auf dem Stack liegt.

Jetzt kommts aber lustig: Ich habe meine Dll bisher immer versehentlich im Debug-Modus compiled (hab vergessen -r zu setzen) jetzt wo ich sie im Release-Modous compile funktioniert alles wunderbar. Das macht die Erklärung von dir zwar zu Nichte wenn ich das richtig verstanden habe, aber so lange es funktioniert bin ich glücklich. Im Moment läuft die Dll seit ca. 5 min ohne Absturz, meine bisheriger Rekord lag bei 14 Sekunden. Schon lustig dass der Debug-Modus diesen Absturz verursacht.

Danke an alle die mir geholfen haben. Ich bin jetzt wieder einen Schritt weiter.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BtbN

BeitragMi, März 30, 2011 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Du lebst also bewusst mit einem schweren fehler, der zu 100% random undefined verhalten mit beliebigen crashes und allem drum rum führen kann?
Ist also schonmal eine Person mehr auf meiner Liste, deren Software ich von meinem Rechner fern halte.

Der Eisvogel

BeitragMi, März 30, 2011 18:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Glaub mir die Software wirst du niemals verwenden, und anscheinend wurden die Fehler durch den Debug-Modus verursacht, also hatte es nur sekundär etwas mit diesen Funktionen zu tun. Jetzt läuft alles prima, was bedeutet, das keine Fehler mehr auftauchen, da diese Fehler direkt in einen Log-Datei geschrieben würden, welche derzeit noch leer ist, und die Dll noch immer fehlerfrei läuft.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

mpmxyz

BeitragMi, März 30, 2011 21:15
Antworten mit Zitat
Benutzer-Profile anzeigen
"durch den Debug-Modus verursacht": Vielleicht existieren die Sicherungsmechanismen, die den Fehler bemerken, auch nur im Debug-Modus?
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Der Eisvogel

BeitragMi, März 30, 2011 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja dann muss irgendwas grundsätzlich falsch sein, da nach längerem probieren auch Fehler erzeugt wurden wenn ich keine der Funktionen verwendet habe.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group