Windows Hook

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Der Eisvogel

Betreff: Windows Hook

BeitragSo, Nov 14, 2010 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Ich versuche mich derzeit mit DLL-Injection in ein fremdes Programm. Um die DLL in den fremden Process zu injecten verwenden ich Windows-Hooks. Allerdings klappt es nicht so ganz. Die DLL wird in den fremden Process geladen, aber der Windows-Hook ansuch funktioniert nicht so wie er soll. Hier der Code der DLL:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Framework brl.blitz
Import brl.system
Import brl.stream
Import brl.filesystem
Import brl.retro

Extern "Win32"
Function CallNextHookEx:Int(hHook:Int, nCode:Int, wParam:Int, lParam:Byte Ptr)
End Extern

Notify("Die DLL wurde erfolgreich eingebunden.")

Function Product:Int(a:Int, b:Int)
Notify(a * b)
Return a * b
EndFunction


Function Callback:Int(nCode:Int, wParam:Int, lParam:Byte Ptr)
Select nCode
Case $12
Notify("Die Anwendung wird jetzt beendet.")
End Select
CallNextHookEx(Null, nCode, wParam, lParam)
Return True
End Function


Und hier der Code des Injecters:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Import "testdll.a"

Extern
Function Product(a:Int, b:Int)
Function Callback(uMsg:Int, wParam:Int, lParam:Int)
End Extern

Product(1, 2)


Extern "Win32"
Function FindWindow(lpClassName:Byte Ptr, lpWindowName:Byte Ptr) = "FindWindowA@8"
Function GetModuleHandle(lpModuleName:Byte Ptr) = "GetModuleHandleA@4"
Function GetWindowThreadProcessId(hWnd:Int, lpdwProcessId:Int Var)
Function SetWindowsHookEx:Int(idHook:Int, lpfn:Int, hMod:Int, dwThreadId:Int) = "SetWindowsHookExA@16"
End Extern

Const WH_GETMESSAGE:Int = $3


Local hWnd:Int = FindWindow(Null, "Unbenannt - Editor")
Local hModule:Int = GetModuleHandle("testdll")
Local dwProcessId:Int
Local dwThreadId:Int = GetWindowThreadProcessId(hWnd, dwProcessId)
Local hHook:Int

If hWnd <> 0 Then hHook = SetWindowsHookEx(WH_GETMESSAGE, Int(Byte Ptr(Callback)), hModule, dwThreadId)

Print "Window-Handle: " + hWnd
Print "Module-Handle: " + hModule
Print "Process-Handle: " + dwProcessId
Print "Thread-Handle: " + dwThreadId
Print "Hook-Handle: " + hHook
Input "Press [Enter] ..."


Alles wird Ordnungsgemäß gemacht. Aber sobald ich jetzt das Notepad-Fenster aktiviere, beendet es sich ohne irgendetwas. Ich klicke nicht auf das X. Was mache ich falsch?

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

BeitragSo, Nov 14, 2010 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Höchst wahrscheinlich muss der Callback, wie alle anderen Win32-Funktionen auch, mit stdcall callbar sein, und nicht, wie BMax es von haus aus macht, per cdecl.
Ich bin mir da nich 100% sicher, ob man das mit BMax ändern kann, ich meine aber, es wäre nicht möglich. Lediglich für eingebundene funktionen aus fremden libs kann man die calling convention setzen.
Die Folge draus wäre, dass das, was du vorhast, mit BMax nicht möglich ist.

Der Eisvogel

BeitragSo, Nov 14, 2010 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, dass ich das richtig verstehe: Die DLL muss ich in einer anderen Sprache wie C++ schreiben, aber die Injection ansich kann ich dennoch mit BlitzMax machen?
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

BeitragSo, Nov 14, 2010 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Funktion Callback muss halt stdcall sein. Wenn dus irgendwie schaffen solltest, BMax dazu zu bringen, sie als stdcall zu kompilieren, würde es auch in BMax gehen.

Der Eisvogel

BeitragSo, Nov 14, 2010 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
OK, kann ich meine DLL auch ohne ein Callback injecten? Ich muss leider den Weg über Windows-Hooks verwenden, da meine Ziel-Anwendungen andere nicht zulässt.
Oder gibt es noch einen anderen Weg eine DLL zu injecten? Manuell über CreateRemoteThread und LoadLibary geht es nicht, da die Anwendung das verweigert. Geht es noch irgendwie anders?

EDIT: Habe grade gelesen, dass der stdcall durch ein Anhängen von "Win32" hinter der Funktion erreicht wird. Damit sollte es doch dann eigentlich funktionieren, oder? Notepad stürzt aber dennoch 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.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group