OldSchoolHack

Register / Login English

D3D-Hook Problem


icon D3D-Hook Problem #1

Join Date: Dec 2009

Posts: 10

Hi Leute,
ich hab ein kleines Problem mit meinem D3D-Hook, wenn ich die DLL in Counter Strike, oder irgend eine andere D3D-Anwendung injecte stürzt das Programm sofort ab.
Die EndScene Adresse in der D3D9.dll habe ich schon gefunden:

http://www.myimg.de/?img=EndScene5e6dc.jpg

Hier der Souce Code:
TEXT Code:
  1.  
  2. #include <windows.h>
  3. #include <cstdio>
  4. #include <d3d9.h>
  5. #include <d3dx9.h>
  6.  
  7.  
  8.  
  9. //LPDIRECT3DDEVICE9 pDevice;
  10. const D3DCOLOR txtPink = D3DCOLOR_ARGB(255, 255, 0, 255); // Alpha, Rot, Grün, Blau
  11. void InitHook();
  12. void *DetourFunc(BYTE *src, const BYTE *dst, const int len);
  13. typedef HRESULT(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9);
  14. void DrawRect (LPDIRECT3DDEVICE9 Device_t, int X, int Y, int L, int H, D3DCOLOR color);
  15. EndScene_t pEndScene;
  16.  
  17.  
  18.  
  19. HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice)
  20. {
  21. DrawRect (pDevice, 10, 10, 200, 200, txtPink);
  22. return pEndScene(pDevice);
  23. }
  24.  
  25.  
  26. int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)
  27. {
  28. switch(reason)
  29. {
  30. case DLL_PROCESS_ATTACH:
  31. // Hier kommt unser Code rein
  32. CreateThread(0, 0, (LPTHREAD_START_ROUTINE) InitHook, 0, 0, 0);
  33. break;
  34. }
  35. return true;
  36. }
  37.  
  38.  
  39.  
  40. void InitHook()
  41. { HMODULE hModule = NULL;
  42. while( !hModule )
  43. {
  44. hModule = GetModuleHandleA( "d3d9.dll" ); // Handle zur DLL holen
  45. Sleep( 100 ); // 100ms warten
  46. }
  47.  
  48.  
  49. pEndScene = ( EndScene_t )DetourFunc((PBYTE)0x74A447AF,(PBYTE)hkEndScene, 5);
  50.  
  51.  
  52. }
  53.  
  54. void DrawRect (LPDIRECT3DDEVICE9 Device_t, int X, int Y, int L, int H, D3DCOLOR color)
  55. {
  56. D3DRECT rect = {X, Y, X+L, Y+H};
  57. Device_t->Clear(1, &rect, D3DCLEAR_TARGET, color, 0, 0); // bei Google gibt’s näheres
  58. }
  59.  
  60.  
  61. void *DetourFunc(BYTE *src, const BYTE *dst, const int len) // credits to gamedeception
  62. {
  63. BYTE *jmp = (BYTE*)malloc(len+5);
  64. DWORD dwback;
  65. VirtualProtect(src, len, PAGE_READWRITE, &dwback);
  66. memcpy(jmp, src, len); jmp += len;
  67. jmp[0] = 0xE9;
  68. *(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;
  69. src[0] = 0xE9;
  70. *(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
  71. VirtualProtect(src, len, dwback, &dwback);
  72. return (jmp-len);
  73. }
  74.  

Normalerweise müsste man jetzt oben links ein pinkes Viereck sehen.

Ich hoffe ihr könnt mir helfen, danke schon mal im vorraus.

Mfg SiZeXtreme

__________________

Wer zuerst malt, malt zuerst.
icon #2

Join Date: Dec 2009

Posts: 10

Bei " pEndScene = ( EndScene_t )DetourFunc((PBYTE)0x74A447AF,(PBYTE)hkEndScene, 5); " liegt der Fehler, das 0x74A447AF muss durch das Offset von EndScene ersetzt werden und mit dem Handle der d3d9.dll addiert werden, nur leider bekomme ich es nicht hin. "Offset=0x74A447AF - Handle"
TEXT Code:
  1.  
  2. DWORD dwOffSet
  3. dwOffSet=0x74A447AF-(DWORD)hModule
  4. ...
  5.  

Wenn ich es so versuche bekomme ich den gleichen Fehler wie immer.. Weiß jemand eine Lösung für das Problem??

__________________

Wer zuerst malt, malt zuerst.
icon #3

Join Date: Aug 2008

Posts: 2594

User-Rating:

17 positive
5 negative
Dynamische Adresse.
In dem tutorial ganz unten steht wie man damit umgehen soll.
icon #4

Join Date: Dec 2009

Posts: 10

TEXT Code:
  1. HMODULE hModule = NULL;
  2. while(!hModule)
  3. {
  4. hModule = GetModuleHandleA("d3d9.dll");
  5. Sleep(100);
  6. }
  7. dwBeginScene = (DWORD)hModule + 0x87010;
  8. dwEndScene = (DWORD)hModule + 0x871A0;
  9. dwReset = (DWORD)hModule + 0x636B0;
  10. dwDrawIndexedPrimitive = (DWORD)hModule + 0x88830;
  11. dwSetViewPort = (DWORD)hModule + 0x82F70;
Muss ich für EndScene auch "0x871A0" nehmen oder muss ich meinen Offset verwenden?

__________________

Wer zuerst malt, malt zuerst.
icon #5

Join Date: Aug 2007

Posts: 8643

User-Rating:

199 positive
33 negative
du hast kein Offset bisher sondern nur die fixe Adresse, die wird aber wahrscheinlich immer anders sein

greetz KN4CK3R

__________________

Hallo
icon #6

Join Date: Dec 2009

Posts: 10

wie komme ich dann auf mein offset? ich hab gelesen ich muss meine EndScene Adresse minus dem Handle der d3d9.dll rechnen?!

__________________

Wer zuerst malt, malt zuerst.
icon #7

Join Date: Dec 2009

Posts: 10

Hat sich alles erledigt, jetzt funktioniert alles. Hab jetzt Gordons methode verwendet, funktioniert wunderbar. Jedoch würde es mich immer noch interessieren warum es vorher nicht geklappt hat?..

Mfg SiZeXtreme

__________________

Wer zuerst malt, malt zuerst.
icon #8

Join Date: Aug 2007

Posts: 8643

User-Rating:

199 positive
33 negative
weil die Adresse sich ändern kann. Entweder Adresse der DLL auslesen + Offset von EndScene oder sonst eine Methode benutzen um die Adresse dynamisch auszulesen.

greetz KN4CK3R

__________________

Hallo