AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi getthreadcontext verständnisfrage
Thema durchsuchen
Ansicht
Themen-Optionen

getthreadcontext verständnisfrage

Ein Thema von smc · begonnen am 21. Feb 2006 · letzter Beitrag vom 23. Feb 2006
Antwort Antwort
Seite 2 von 2     12   
smc

Registriert seit: 21. Dez 2005
49 Beiträge
 
#11

Re: getthreadcontext verständnisfrage

  Alt 21. Feb 2006, 16:45
Zitat:
Das sind nur drei Bytes ($8B $40 $0A)...
- das reicht nur für einen short jump (127 Bytes)
- du müsstest also das Code-Segment patchen (Erfahrung mit Assembler unter Windows x86 scheinen ja zu fehlen...)
ist mir klar, war ja auch nur ein Beispiel

Zitat:
Ein was?
Ein CodeCave ist normalerweise eine größere Sektion voller nops oder 0x00 Bytes in einem Modul in dem man eigene Codes injecten kann.

Zitat:
Ich kenne mich damit nicht so sehr aus...
muss man auch nicht wirklich

p.s. ich will hier kein was ist richtig, was ist falsch, spiel spielen.
Ich weiss auch das ich kein Profi in den ganzen sachen bin, allerdings will ich lernen wie das was wir oben schon teilweise angesprochen haben zu realisieren ist.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#12

Re: getthreadcontext verständnisfrage

  Alt 21. Feb 2006, 16:52
Zitat von smc:
allerdings will ich lernen wie das was wir oben schon teilweise angesprochen haben zu realisieren ist.
Wurde doch schon erwähnt: a) Schreibe einen Debugger, setze einen Haltepunkt und hole dir den Thread-Context b) Patche den Remote-Code
Ist beides genauso aufwändig; spielt also IMHO keine Rolle wofür du dich entscheidest.
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#13

Re: getthreadcontext verständnisfrage

  Alt 21. Feb 2006, 16:54
smc, das was du vorhast kann mit GetThreadContext / WriteProcessMemory nicht sauber (ohne Hänger) lösen.

Willst du keine Injection / Hooking machen musst du folgendermaßen vorgehen:

Du überschreibst die Stelle mit Hilfe von WriteProcessMemory in dem du einen "jmp -2" dort hinschreibst. (EB FE)
Dadurch bleibt der Zielprozess beim nächsten Aufruf dort stehen (das Programm wird hängen). Wenn du aber dauerhaft immer GetThreadContext in deinem Programm auf den richtigen Thread (Haupthread des Spiels) aufrufst bis der EIP von dem zurückgelieferten Context = der Stelle ist wo du den short jump hingeschrieben hast, dann steht die richtige Adresse in lpContext.EAX. Danach kannst du den richtigen Opcode wieder hinschreiben, das Spiel wird dann weiterlaufen. Nun hast du den EAX Wert den du weiter benutzen kannst.

Codeinjection / Hooking wäre auch kein Problem ist aber für den Fall nicht direkt nötig, da du EAX bzw globale Adressen ja nicht verändern musst.

hierzu: http://cvs.sourceforge.net/viewcvs.p...uallCollection

btw
0056ac15 - mov eax,[eax+10]
ist nicht $8B $40 $0A sondern $8B $40 $10 da Ollydbg des immer in hex anzeigt *grossmaul*
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#14

Re: getthreadcontext verständnisfrage

  Alt 21. Feb 2006, 17:08
Delphi-Quellcode:
const DEINE_ADDR = $00441234;
var dwProcessID: DWord;
    dwThreadID: DWord;
    wBuf: Word;
    dwRead: DWord;
    wJmp: Word;
    Context: TContext;
    bFound: Boolean;
begin
  dwProcessID := uallProcess.FindProcess('solitär.exe');
  wJmp := $FEEB;

  if dwProcessID <> 0 then
  begin
    dwThreadID := uallProcess.GetThread(dwProcessID);
    dwProcessID := OpenProcess(PROCESS_ALL_ACCESS,false,dwProcessID);
    if ReadProcessMemory(dwProcessID,pointer(DEINE_ADDR),@wbuf,SizeOf(wBuf),dwRead) and
      (dwRead = SizeOf(wBuf)) then
    if WriteProcessMemory(dwProcessID,pointer(DEINE_ADDR),@wJmp,SizeOf(wJmp),dwRead) and
      (dwRead = SizeOf(wJmp)) then
    begin
      bFound := false;
      repeat
        if GetThreadContext(dwThreadID,Context) then
        begin
          if (Context.Eip = DEINE_ADDR) then
          begin
            WriteProcessMemory(dwProcessID,pointer(DEINE_ADDR),@wBuf,SizeOf(wBuf),dwRead);
            bFound := true;
            // Context.Eax hat den Wert
          end;
        end;
        Sleep(100);
      until bFound;
    end;

    CloseHandle(dwProcessID);
  end;
end;
Sollte als Beispiel genügen.
  Mit Zitat antworten Zitat
smc

Registriert seit: 21. Dez 2005
49 Beiträge
 
#15

Re: getthreadcontext verständnisfrage

  Alt 22. Feb 2006, 09:42
Hi brechi,

vielen dank für deine antwort, das hilft mir schon um einiges weiter!

Noch eine kleine Frage, könnte man nicht auch den thread mit SuspendThread anhalten anstatt mit einem EB FE?
Der opcode von dem ich den wert haben will wird so gut wie durchgängig ausgeführt, bin auch sicher das meine Adresse da durchgehend übermittelt wird.

Auf die uall sachen hätte ich früher stoßen sollen, ziemlich praktisch die funktionen.
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#16

Re: getthreadcontext verständnisfrage

  Alt 22. Feb 2006, 10:14
Mit Suspendthread stoppst du den Thread. WO der allerdings stehen bleibt kannst du nicht festlegen. Im schlechtesten Fall wird der nie genau an der Stelle stehen bleiben.

Suspendthread sollte man jedoch immer vor GetThreadContext aufrufen. Auch in meinem Beispiel. Wird zwar keine große Auswirkung haben, aber sicher ist sicher.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#17

Re: getthreadcontext verständnisfrage

  Alt 22. Feb 2006, 11:08
Zitat von brechi:
Du überschreibst die Stelle mit Hilfe von WriteProcessMemory in dem du einen "jmp -2" dort hinschreibst. (EB FE)
Dadurch bleibt der Zielprozess beim nächsten Aufruf dort stehen (das Programm wird hängen).
Bleibt nur zu hoffen, dass die Zielanwendung keinen WatchDog-Thread hat...
(juhu, mein erstes Schlagwort in diesem Thread *g*)
  Mit Zitat antworten Zitat
smc

Registriert seit: 21. Dez 2005
49 Beiträge
 
#18

Re: getthreadcontext verständnisfrage

  Alt 22. Feb 2006, 11:20
okay ich werd dann mal ein bisschen rumtesten sobald ich dazu komme, melde mich dann nochmal

Das einzigste was mich jetzt noch stört ist die CodeInjection von EB FE, aber ohne wird es wahrscheinlich nur mit Static Pointern gehen (hab ich schon erwähnt das ich Static Pointer suchen hasse?).

Gefällt mir so aber schon um einiges besser als dma stealing!

Zitat:
Bleibt nur zu hoffen, dass die Zielanwendung keinen WatchDog-Thread hat...
(juhu, mein erstes Schlagwort in diesem Thread *g*)
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#19

Re: getthreadcontext verständnisfrage

  Alt 23. Feb 2006, 09:40
Das Finden einer statischen Adresse, dauert (wenn man das Programm debuggen kann) nicht mal 5 Minuten. Das ist das beste/sicherste was du für deinen Einsatz benutzen kannst.

falls es einen "WatchDog-Thread" bekommst das das schnell mt Hilfe von den HW-BP raus
generell benutzen die neuen Cheats eben diese HW-BP kombiniert mit PAGE_GUARD um Funktionen abzufangen usw. was relativ schwer entdeckt werden kann
  Mit Zitat antworten Zitat
smc

Registriert seit: 21. Dez 2005
49 Beiträge
 
#20

Re: getthreadcontext verständnisfrage

  Alt 23. Feb 2006, 14:20
dann mache ich eindeutig was falsch, kennst du vielleicht ein gutes tutorial welches erklärt wie man Static-Pointer findet? habe bisher nur im cheatengine forum etwas darüber gefunden

und wie genau funktioniert ein hardware breakpoint mithilfe PAGE_GUARD? (höre ich jetzt zum ersten mal)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz