Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

API DirectX Hook?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Heiko



Anmeldungsdatum: 28.07.2008
Beiträge: 101

BeitragVerfasst am: 12.04.2009, 22:47    Titel: API DirectX Hook? Antworten mit Zitat

sowas in der art suche ich: http://www.codeguru.com/Cpp/W-P/dll/hooking/article.php/c127/

also möchte eine dll mit ein paar dx routinen schreiben, die die dll der 3d engine hooked, welche ich für meine spiele verwende.

Also im großen ganzen würde ich nur Zwei funktionen in der dll benötigen.
Eine Init und eine DeInit, damit ich in dem vorhandenen dx fenster zeichnen kann.
und es darf nicht anwendungsabhängig, heißt appname.exe sein.

wäre cool, wenn da jemand was hätte....
oder weiß wie man zwei solche funktionen schreibt, weil ich bin in FB noch nicht so fit.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 13.04.2009, 11:31    Titel: Antworten mit Zitat

Ich muss mich bei dir für diesen interessanten Artikel bedanken.

API-Hooks habe ich bis jetzt einfach direkt in die EXE "reingepatcht", ich wollte mich aber sowieso mal an ner Methode zur Laufzeit versuchen, ich probiere mal, den Source Code von der Library, die du verlinkt hast, nach FB zu portieren. Hab Geduld happy

Einen Code zum Einschleusen der DLL in einen Prozess (aber noch ohne Hooks) kann ich dir geben:

Code:
#Include "windows.bi"

Function InjectDLL(hProcess As HANDLE, dllpath As String) As HMODULE
   ' get module handle of kernel32.dll
   Var kernel32 = GetModuleHandle("Kernel32")

   ' allocate space for dll name in victim's address space
   Var addr = VirtualAllocEx(hProcess, NULL, Len(dllpath) + 1, MEM_COMMIT, PAGE_READWRITE)
   If addr = NULL Then Return NULL

   ' write dll name into newly allocated memory
   WriteProcessMemory(hProcess, addr, StrPtr(dllpath), Len(dllpath) + 1, NULL)

   ' call LoadLibrary in victim's address space in order to load our dll
   Var hThread = CreateRemoteThread(hProcess, NULL, 0, GetProcAddress(kernel32, "LoadLibraryA"), addr, NULL, NULL)

   ' free memory used for dll name
   VirtualFreeEx(hProcess, addr, Len(dllpath) + 1, MEM_RELEASE)
   
   ' check if CreateRemoteThread failed
   If hThread = NULL Then Return NULL
   WaitForSingleObject(hThread, INFINITE)

   ' get hModule of our dll
   Dim hDllModule As HMODULE
   GetExitCodeThread(hThread, @hDllModule)
   If hDllModule = NULL Then Return NULL
   CloseHandle(hThread)

   Return hDllModule
End Function

' *** TEST: Inject some dll into notepad ***

' check if WinNT/2000/XP/Vista is used
Var shlwapi = LoadLibrary("shlwapi")
Dim IsOS As Function(As Dword) As BOOL = GetProcAddress(shlwapi, 437)
#Define OS_NT 1
If IsOS = NULL OrElse IsOS(OS_NT) = FALSE Then
   Print "operating system not supported"
   Sleep
   FreeLibrary(shlwapi)
   End
EndIf
FreeLibrary(shlwapi)

' start notepad
Dim pi As PROCESS_INFORMATION
Dim si As STARTUPINFO
Var AppName = Environ("windir") & "\system32\calc.exe"
If CreateProcess(StrPtr(AppName), StrPtr(AppName), NULL, NULL, FALSE, NULL, NULL, NULL, @si, @pi) = FALSE Then
   Print "starting notepad failed"
   Sleep
   End
EndIf

' inject the dll
Var hDllModule = InjectDLL(pi.hProcess, "some_dll.dll")
If hDllModule = NULL Then
   Print "injecting dll failed"
   Sleep
   End
EndIf
Print "successful! hModule of dll: " & hDllModule
Sleep

' close handles
CloseHandle(pi.hProcess)
CloseHandle(pi.hThread)


Englisch kommentiert, da ursprünglich für englisches Forum.

Zum Testen kannst du als DLL eine nehmen, die du z.B. per FB erzeugt hast, und die eine MessageBox ausgibt. (der Code der außerhalb von Functions/Subs steht, wird bei ner FB-DLL beim Laden ausgeführt)

mfG Cherry
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Heiko



Anmeldungsdatum: 28.07.2008
Beiträge: 101

BeitragVerfasst am: 13.04.2009, 16:19    Titel: Antworten mit Zitat

ich brauch das ganze als zwei funktionen Init und DeInit.
Und zwar muss ich den CreateDevice(heißt glaub ich so) process hooken.
Ist eine 3d engine, und ich möchte bisschen was in 2d via dx machen, daher brauch ich diesen hook.....

Vielleicht wärst du ja so nett?

also anbieten kann ich sozusagen eine dll, welche die 3d engine ist, sowie wenn gestartet... mittels des befehls GetDevice() --- LPDIRECT3DDEVICE9 zurückgibt.

vielleicht ist das nützlich.
das api gebiet ist nämlich völliges neuland für mich....
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Heiko



Anmeldungsdatum: 28.07.2008
Beiträge: 101

BeitragVerfasst am: 21.04.2009, 12:46    Titel: Antworten mit Zitat

any news?!?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 23.04.2009, 21:10    Titel: Antworten mit Zitat

Ich kam leider noch nicht dazu, hab noch so viel am Hut... Ich hab dich aber nicht vergessen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Heiko



Anmeldungsdatum: 28.07.2008
Beiträge: 101

BeitragVerfasst am: 23.04.2009, 23:52    Titel: Antworten mit Zitat

oh kein thema, ich bin auch ein stückchen weiter.
ich brauch nun wohl doch keinen hook, kann direkt per GetDevice der engine zeichnen, allerdings muss ich mich wohl noch mit renderstates etc. rumplagen, aber hab dir ja geschrieben.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz