Entwickler-Ecke

Windows API - DLL Injection


Muellermilchtrinker - Sa 27.11.10 14:40
Titel: DLL Injection
Also ich möchte eine DLL in ein Spiel injecten. Diese DLL soll von meinem Programm einen String bekommen und die DLL soll dann immer wenn das Spiel einen neuen Frame zeichnet diesen Text oben mit zeichenen.
Mein Problem ist nun, wie merke ich, dass ein neuer Frame gezeichnet wurde und wie injecte ich die DLL in das Spiel.


Jakob_Ullmann - Sa 27.11.10 14:58

Ich nehme an, von dem Programm hast du keinen Sourcecode? Dann wird das ganz schön kompliziert und ich bezweifle, dass sowas erlaubt ist.


Delete - Sa 27.11.10 15:12

Moin!

Sowas ist im Grunde relativ einfach zu machen. Man injeziert allerdings keine DLL oder ähnliches, sondern führt lediglich einen D3D-Hook aus. Wie man das ganze mit anderen APIs macht weiß ich nicht, aber das wird schon mal ein Anhaltspunkt sein:

http://www.gamedev.net/community/forums/topic.asp?topic_id=359794

MfG


Jakob_Ullmann - Sa 27.11.10 19:52

Das betrifft sicherlich die Sache mit dem Mitschneiden, wann ein neuer Frame gezeichnet wird. Aber das macht es nicht unbedingt einfach, einen Text im Spiel anzuzeigen. Und ich denke, wenn das ganze nicht extrem viel Leistung nehmen soll, muss das Programm selbst verändert werden. Du kannst ja schlecht ein Fenster darüber legen, wo der Text angezeigt wird. Zumindest kann ich mir nicht vorstellen, dass das geht, ohne die Framerate nicht mindestens zu halbieren.


Delphi-Laie - So 28.11.10 12:55

Da hier offensichtlich völlige Unklarheit herrscht, welches Verb zum Substantiv „Injektion“ gehört (jedenfalls weder „injecten“ noch „injektieren“, igitt), erlaube ich mir, es hier zu nennen: „injizieren“ (und übrigens auch nicht „injezieren“).


Delete - So 28.11.10 13:06

user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
Das betrifft sicherlich die Sache mit dem Mitschneiden, wann ein neuer Frame gezeichnet wird. Aber das macht es nicht unbedingt einfach, einen Text im Spiel anzuzeigen. Und ich denke, wenn das ganze nicht extrem viel Leistung nehmen soll, muss das Programm selbst verändert werden. Du kannst ja schlecht ein Fenster darüber legen, wo der Text angezeigt wird. Zumindest kann ich mir nicht vorstellen, dass das geht, ohne die Framerate nicht mindestens zu halbieren.

Nein, es ist durchaus möglich das performant zu regeln.


uall@ogc - So 28.11.10 14:27

http://uall.cheat-project.com/uallCollection/

wenns es ein OpenGL Spiel ist, dann wglSwapBuffers oder glFinish hooken


DonManfred - Di 30.11.10 14:53

user profile iconuall@ogc hat folgendes geschrieben Zum zitierten Posting springen:
wenns es ein OpenGL Spiel ist, dann wglSwapBuffers oder glFinish hooken


Weisst Du zufällig ob Herr der Ringe Online ein OpenGL-Spiel ist? Ich planer eine Anzeige der/des Raids, die an diesem Tage stattfinden als Overlay im Spiel anzuzeigen (um den User drauf hinzuweisen...

Hast du evtl. einen kleinen Beispielcode um einen Text über diesen Hook auf dem "Screen" auszugeben? Ich habe mich mit Hook, 3D usw bisher noch gar nicht befasst und könnte einen hilfreichen Beispielcode gut gebrauchen :-)


uall@ogc - Sa 04.12.10 19:21

Ne wieß ich nicht, du kannst dur aber z.B. mal den SourceCode von Mumble anschauen. Die haben da ein Overlay der Namen für DirectX/OpenGL Spiele eingebaut.


shorke - Sa 04.12.10 21:22

Ich weiss nicht welche API HDRO verwendet, aber das kannst du relativ einfach über das Auflisten der geladenen Module herausfinden - oder einfach einen Debugger verwenden.

Sich Mumble anzuschauen ist mit Sicherheit eine gute Idee, wenn du nicht gebannt werden willst. :-)

Falls es auf D3D9 läuft könntest du probieren Present zu hooken, nocheinmal BeginScene und EndScene aufzurufen und deine Sachen zu rendern. Es kann sein, dass du dabei auf das aktuelle Rendertarget, die Renderstates, Blendstates, usw. achten musst.

Schau dir am besten die Basics für beide APIs an.


Dude566 - Sa 04.12.10 21:45

Fraps macht das auch irgendwie, da hat man dann die Frames als Anzeige. Würde mich auch mal interessieren wie sich sowas am einfachsten realisieren lässt.