 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 12.04.2009, 22:47 Titel: API DirectX Hook? |
|
|
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 |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 13.04.2009, 11:31 Titel: |
|
|
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
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 |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 13.04.2009, 16:19 Titel: |
|
|
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 |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 21.04.2009, 12:46 Titel: |
|
|
any news?!? |
|
Nach oben |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 23.04.2009, 21:10 Titel: |
|
|
Ich kam leider noch nicht dazu, hab noch so viel am Hut... Ich hab dich aber nicht vergessen. |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 23.04.2009, 23:52 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|