Mit Dll Injection Memory verändern?

05/07/2007 17:57 Vulcanraven#1
Tag...

Ich habe mir so überlegt ob man eine Dll schrieben könnte die den Memoryinhalt verändert?
Z.b nehmen wir mal Cheatengine und ein Spiel.
Nun Suche ich z.b die Ammoadresse wenn ich sie gefunden habe kann ich die Value ja freezen und natürlich ändern.
Und dies möchte ich halt ohne die Cheatengine machen halt mit einer Dll.
Geht das überhaupt?

Und die 2te Frage...
Wenn ich jetzt ein Trainer erstellt habe, nun ihn im Game benutze aber dann von Gameguard gekickt werde.
Weil er den Trainer erkennt.
Wäre da die Dll Injection ne bessere möglichkeit undect zu bleiben?
Aber es könnte ja auch sein das der Gameguard nach Memory veränderungen sucht und die Dll Injection nicht besser als der Trainer ist.
05/07/2007 18:13 wiz#2
Sicher geht das. Ich bin mir nicht 100%ig sicher, aber jeder Memory Searcher arbeitet (vermutlich) wegen der Geschwindigkeit mit Dll-Injection. TSearch hat seine TSearch.dll, GameHack seine gh.dll und die werden vermutlich in den Zielprozess injiziert und können dort ohne die Read/WriteProcessMemory-API im Speicher des Zielprozesses rumspazieren und das bringt ein enormen Geschwindigkeitsvorteil.

Das ist gleichzeitig auch die Schwäche. Ich bastel gerade an Soldats heftiger Anti-Cheat-Protection rum und Soldat checkt, welche DLLs geladen sind und erkennt unteranderem eine geladene TSearchDll.dll sowie eine geladene gh.dll und weiß damit, dass es unter Beobachtung steht und stürzt ab.

Über GameGuard weiß ich gar nichts, aber ich schätze alle gängigen DLLs (bei Bedarf Soldat durchschauen, im Code steckt quasi ein Inhaltsverzeichnis verfügbarer Cheat-Software...) sind auch ihm bekannt.

Da GameGuard Rootkit-ähnlich arbeitet, hat es - vermute ich - die Read- und WriteProcessMemory-API gehooked und erkennt, wenn dein Trainer im zu schützenden Prozess rumwurstet. Entweder du suchst Details, wie du GameGuard los wirst, oder du arbeitest eben per DLL-Injection, wobei ich denke, dass auch CreateRemoteThread() dann unter GameGuards Beobachtung steht.
05/07/2007 18:34 Vulcanraven#3
Okay mache ich mal...
Wie siehts denn da mit dem Punkbuster aus?
05/07/2007 19:25 Leonino#4
also punkbuster und ich meine auch gameguard scannen den speicher nach bekannten hacks ob sie den speicher des spiels nach manipulationen checken weiß ich nicht kann ich mir allerdings auch nicht vorstellen
somit koennte also das reine editieren des speichers mit einem selbstgecodeten trainer durchaus ohne weiteres funktionieren wenn der anti-cheat dein trainer nicht auf andere weise aufspuert
eine .dll wirst du nicht einfach so injecten koennen dazu wirst du nen bypass brauchen was bei punkbuster allerdings lausig ist bei gameguard ehr weniger schwierig
den speicher ueber eine injizierte .dll zu manipulieren geht
allerdings stellt sich fuer mich die frage wieso?
ich denke es ist wesentlich einfacher und auch sicherer den speicher einfach zu zu veraendern
ausserdem kenn ich kein ordentliches onlinegame das sich durch memory editing sinnvoll irritieren laesst
05/07/2007 20:03 reijin#5
cheatengine hat eine nette Dll Inject funktion.
kannst du vllt mal posten auf welchem wege du die dll injecten willst? (code beispiel) würde mich nämlich auch interessieren ;)
kleine zwischenfrage:
ich denke, dass du mit dem suchen nach codecaves auch erfolg haben wirst, und deinen code so auch ausführen kannst :)
05/07/2007 20:38 mondesser#6
Quote:
Originally posted by Vulcanraven91@May 7 2007, 18:34
Okay mache ich mal...
Wie siehts denn da mit dem Punkbuster aus?
zum Thema Punkbuster solltest du hier einige infos finden:

[Only registered and activated users can see links. Click Here To Register...]
05/09/2007 19:01 neji#7
Quote:
Originally posted by Reijin@May 7 2007, 20:03
kannst du vllt mal posten auf welchem wege du die dll injecten willst? (code beispiel) würde mich nämlich auch interessieren ;)
Code:
function InjectLibrary(dwProcessID: DWord; pLibraryName: PChar): Boolean; stdcall;
var
 dwProcessID2 : DWord;
 dwMemSize  : DWord;
 dwWritten  : DWord;
 dwThreadID  : DWord;
 pLLA     : Pointer;
 pTargetMemory: Pointer;
begin
 Result := False;

 dwProcessID2 := OpenProcess(PROCESS_ALL_ACCESS,false,dwProcessID);
 if (dwProcessID2 <> 0) then
  dwProcessID := dwProcessID2;

 dwMemSize := Length(pLibraryName)+1;
 pTargetMemory := VirtualAllocExX(dwProcessID,nil,dwMemSize, MEM_COMMIT or MEM_RESERVE,PAGE_EXECUTE_READWRITE);
 pLLA := GetProcAddress(GetModuleHandleA('kernel32.dll'),'LoadLibraryA');
 if (pLLA <> nil) and (pTargetMemory <> nil) and (pLibraryName <> nil) then
 begin
  if WriteProcessMemory(dwProcessID,pTargetMemory,pLibraryName,dwMemSize,dwWritten) and
   (dwWritten = dwMemSize) then
  Result := CreateRemoteThreadX(dwProcessID,nil,0,pLLA,pTargetMemory,0,dwThreadID) <> 0;
 end;
 if (dwProcessID2 <> 0) then
  CloseHandle(dwProcessID2);
end;
du holst dir ein Handle des Processes durch OpenProcess, allozierst Speicher in diesem Prozess (VirtualAllocEx).
Dann schreibst du an diese Adresse den Namen der DLL die du injecten willst und startest dann einen RemoteThread, der InjectLibrary mit deiner DLL aufruft und sie somit laden lässt.
05/09/2007 20:31 Vulcanraven#8
Danke danke... ich werde mich gleich mal an die Arbeit machen...