OldSchoolHack

Register / Login English

[DELPHI] d3d crosshair


icon [DELPHI] d3d crosshair #1

Join Date: Mar 2011

Posts: 16

Hi Leute,

Nach langem Suchen bin ich schließlich auf etwas brauchbares gestoßen:
TEXT Code:
  1.  
  2. (...)
  3. function CreateDeviceCallback(const Self: Pointer; Adapter: LongWord; DeviceType: TD3DDevType; hFocusWindow: HWND; BehaviorFlags: DWord; pPresentationParameters: PD3DPresentParameters; out ppReturnedDeviceInterface: IDirect3DDevice9) : HResult; stdcall;
  4. begin
  5. Result := CreateDeviceNext(Self, Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, ppReturnedDeviceInterface);
  6.  
  7. Callback.pD3D := ppReturnedDeviceInterface;
  8. Callback.Initialize();
  9.  
  10. // Hook EndScene
  11. if (Result = 0) and (@EndSceneNext = nil) then
  12. gHook.HookJMP(GetInterfaceMethod(ppReturnedDeviceInterface, 42), @EndSceneCallback, @EndSceneNext);
  13.  
  14. // Hook DrawIndexedPrimitive
  15. if (Result = 0) and (@DrawIndexedPrimitiveNext = nil) then
  16. gHook.HookJMP(GetInterfaceMethod(ppReturnedDeviceInterface, 82), @DrawIndexedPrimitiveCallback, @DrawIndexedPrimitiveNext);
  17. end;
  18.  
  19. function Direct3DCreate9Callback(SDKVersion: Cardinal): Pointer; stdcall;
  20. begin
  21. Result := Direct3DCreate9Next(SDKVersion);
  22.  
  23. // Hook CreateDevice
  24. if not(Result = nil) and (@CreateDeviceNext = nil) then
  25. gHook.HookJMP(GetPtrMethod(Result, 16), @CreateDeviceCallback, @CreateDeviceNext);
  26. end;
  27.  
  28. procedure DllMain(dwReason: DWord);
  29. begin
  30. if (dwReason = DLL_PROCESS_ATTACH) then
  31. begin
  32. gHook := CDeepHook.Create();
  33.  
  34. // Hook the interface.
  35. gHook.HookJMP(GetProcAddress(GetModuleHandle('d3d9.dll'), 'Direct3DCreate9'), @Direct3DCreate9Callback, @Direct3DCreate9Next);
  36. end;
  37. end;
  38.  
  39. begin
  40. DllProc := @DllMain;
  41. DllMain(DLL_PROCESS_ATTACH);
  42. end.
  43.  
Credit: "The Acid", "DeepBluaSea"

Das ist das Grundgerüst, wenn ich mich nicht irre.
Jetzt habe ich noch eine Procedure zum zeichnen eines Fadenkreuzes:

TEXT Code:
  1.  
  2. procedure DrawXhair (const Device: IDirect3DDevice9; color: D3DCOLOR);
  3. var
  4. viewP: D3DVIEWPORT9;
  5. ScreenCenterX,ScreenCenterY: DWORD;
  6. rec1,rec2: D3DRECT;
  7. begin
  8. Device.GetViewport(viewP);
  9. ScreenCenterX:= ((viewP.Width div 2) - 1);
  10. ScreenCenterY:= ((viewP.Height div 2) - 1);
  11.  
  12. rec1.x1:= ScreenCenterX-20;
  13. rec1.y1:= ScreenCenterY;
  14. rec1.x2:= ScreenCenterX+ 20;
  15. rec1.y2:= ScreenCenterY+1;
  16. rec2.x1:= ScreenCenterX;
  17. rec2.y1:= ScreenCenterY-20;
  18. rec2.x2:= ScreenCenterX+ 1;
  19. rec2.y2:= ScreenCenterY+20;
  20.  
  21. Device.Clear(1, @rec1, D3DCLEAR_TARGET, color, 0, 0);
  22. Device.Clear(1, @rec2, D3DCLEAR_TARGET, color, 0, 0);
  23. end;
  24.  

Mein Problem ist jetzt, ich weiss nicht wo ich die Prozedur genau aufrufen muss, und ob das schon alles war. Wie gesagt ich will nur ein "simples" crosshair darstellen.

Rein Intuitiv würde ich die Prozedur hier aufrufen:
TEXT Code:
  1.  
  2. function Direct3DCreate9Callback(SDKVersion: Cardinal): Pointer; stdcall;
  3. begin
  4. Result := Direct3DCreate9Next(SDKVersion);
  5. DrawXhair(Self, $ 0 0 0 0 f f f f ); //Farbe
  6.  
  7. (...)
  8. end;
  9.  

Wenn ich aber versuche das zu compilieren spuckt er mir "Undefinierter Bezeichner: 'Self' " aus.
Hoffe jemand kann mich auf den richtigen Weg bringen.

icon #2

Join Date: Mar 2011

Posts: 16

Hi, bin schon etwas weitergekommen:

TEXT Code:
  1.  
  2. (...)
  3. function PresentCallback(const Self: IDirect3DDevice9;const SourceRect, DestRect: PRect;
  4. const DestWindowOverride: HWND;DirtyRegion: PRgnData): HResult; stdcall;
  5.  
  6. var Font: D3DX9.ID3DXFont;
  7. rec: PRect;
  8. begin
  9. asm
  10. pushad
  11. end;
  12. DrawXhair(Self, $ 0 0 0 0 f f f f ); //Leerzeichen nur damit es hier richtig abgezeigt wird
  13. asm
  14. popad
  15. end;
  16.  
  17. Result := PresentNext( Self,SourceRect, DestRect,
  18. DestWindowOverride,DirtyRegion);
  19. end;
  20. (...)
  21.  

Leider kommt jetzt, wenn ich compilen will "[Fataler Fehler] Ausgabedatei kann nicht erstellt werden"

Was kann da schief laufen?? Irgendwelche Fehler im Code? Mein Speicherordner liegt nicht auf C:/Programme/... also kann ich verweigerte zugriffsrechte theoretisch ausschließen.

Help please
icon #3

Join Date: Mar 2011

Posts: 127

User-Rating:

1 positive
0 negative
der fehler kann dadurch entstehen, dass der prozess/library schon aktiv ist.

Ich denke du hast dll compiled & injected in einen prozess, diesen jedoch nicht geschlossen -> kannst du die dll nicht überschreiben / löschen
=> schließ den Prozess compiliere nomma, dann gehts

EDIT: zum 1. problem: falls du die CreateDevice-funtkion hookst: diese wird 1 mal aufgerufen (dann wenn das D3D-Device erstellt wird) du brauchst aber eine funktion, bei der gezecihnet wird, die meist verwendete ist die EndScene-Funktion.
icon #4

Join Date: Mar 2011

Posts: 16

ok, hab das problem mit dem fatalen fehler gelöst -> dll lässt sich ohne probleme compilen und injecten, jedoch ohne Veränderung im Spiel.

Es sollte eigl. ein Corsshair gezeichnet werden, es passiert aber nichts ...
Wie gesagt injecten klappt, ich werde auch nicht von pb gekickt wegen disallowed program driver.

btw: es handelt sich um cod4