AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Speicherbereich einer Anwendung ermitteln

Ein Thema von bundy · begonnen am 26. Apr 2006 · letzter Beitrag vom 30. Apr 2006
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von bundy
bundy

Registriert seit: 24. Mai 2003
Ort: Eisenstadt
438 Beiträge
 
Delphi 2007 Architect
 
#11

Re: Speicherbereich einer Anwendung ermitteln

  Alt 26. Apr 2006, 22:09
Hat jetzt jemand vieleicht eine Idee.


Mein Gedankengang ist folgender:
Code:
1. Suche die Adresse des 1. Offsets des Spieles im Speicher
2. Addiere zum 1.Offset die Adresse des Modifikationspunktes (aus TSearch)
3. WriteProcess auf die Adresse
müsste doch so gehn oder.

Wenn ja Wie erhalte ich das 1.Offset des Spieles.
+++Glaube keiner Statistik, die du nicht selbst getürkthast.++++
********************
Ein anonymer Statistiker. *
********************
  Mit Zitat antworten Zitat
Benutzerbild von SnuffMaster23
SnuffMaster23

Registriert seit: 13. Feb 2006
Ort: Kempten
253 Beiträge
 
#12

Re: Speicherbereich einer Anwendung ermitteln

  Alt 26. Apr 2006, 22:12
Dann muss ich mir wohl ein neues zulegen
Nee, mal ensthaft: Ich dachte, gerade das wäre der Trick an den virtuellen 32-Bit Adressen. Bei Win 3.1 gabs das nicht, da war das System auch nur multitaskingfähig, wenn sich die Programme "kooperativ" gezeigt haben (so hab ichs mal wo gelesen). Außerdem haben die sich manchmal gegenseitig gestört (glaub ich) wenn man nicht sehr umsichtig programmiert hatte, weil sie eben nebeneinander im selben Speicherbereich lagen.
Das werd ich nochmal etwas überdenken müssen...
Wie sollten sonst auch Sachen wie die Zwischenablage, OLE oder einfach das Nachrichtensystem von Windows funktionieren...

Na egal, genug OT jetzt!!
bundy kann ich leider nicht helfen, ich hätte es ihm ausgeredet.

Snuffi
"Conspiracy is the poor man's mapping of the world" - Fredric Jameson
  Mit Zitat antworten Zitat
Benutzerbild von c113plpbr
c113plpbr

Registriert seit: 18. Nov 2003
Ort: localhost
674 Beiträge
 
Delphi 2005 Professional
 
#13

Re: Speicherbereich einer Anwendung ermitteln

  Alt 26. Apr 2006, 22:26
@snuffmaster23:
ich glaube du bist irgendwo in der win9x-zeit hängen geblieben ... ^^

[edit]Aber im grunde hast du recht, jedes programm hat unter nt-systemen seinen eigenen adressraum, in dem es tun und lassen kann was es will
Daher kann es mit sehr hoher wahrscheinlichkeit auch passieren, dass das Programm jedesmal an exakt die gleiche Stelle geladen wird, und somit auf vielen rechnern läuft, und durch zufall auf einem anderen nicht, weil in diesen ein modul mehr geladen ist, und das den speicher schon irgendwo besetzt -> diverse variablen werden an anderen stellen alloziert -> problem für trainer ...[/edit]

@bundy:
Ich vermute also, dass du das modulehandle des modules benötigst, dem der speicherbereich "gehört". Naja, theoretisch gesehen könntest du das via GetModuleHandle das betreffliche handle erfahren, allerdings nur, wenn du dich IM fremden Prozess befindest ... und sobald du sowas versuchst, wirds kompliziert.

Also musst du wohl EnumProcessModules verwenden, die daraus resultierenden module-handles sollten die Startadressen der geladenen Module (z.B. dlls) sein.
Die könntest du als Anhaltspunkte verwenden, allerdings würde ich es nicht darauf ankommen lassen (ich hab diese methode verwendet, um aus relativen funktions-adressen absolute adressen zu bekommen, soweit funktioniert das, aber ob du das auch mit den adressen irgendwelcher, möglicherweise dynamisch allozierter variablen machen kannst, ist eine andere frage).

ciao, Philipp
Philipp
There is never enough time to do all the nothing you want.
*HABENWILL*
  Mit Zitat antworten Zitat
Benutzerbild von bundy
bundy

Registriert seit: 24. Mai 2003
Ort: Eisenstadt
438 Beiträge
 
Delphi 2007 Architect
 
#14

Re: Speicherbereich einer Anwendung ermitteln

  Alt 26. Apr 2006, 22:39
Ich hab das Programm jetzt auf meinen 2. Pc getestet, da funktioniert es auch wunderbar.

Warum sieht mein Kumpel nicht die gleichen Werte.
Stimmt der Speicherbereich des Spieles, nicht mit meinem überein?

Ich hab das Game schon zick mal mit Tsearch aufgemacht, und meinen PC dazwischen immer neu gestartet und die Adressen der Modifikations Offsets sind immer die gleichen.

Wie händelt das denn TSearch, wenn ich nach einem Wert suche. Tsearch such ja auch nur im Speicherbereich des Spieles oder?
Ich glaub ich denk da irgendwie verkehrt.

Oder wird jeder Applikation die 0000000000-FFFFFFFFFF (4 GB) zugesichert ?

lg
Bundy
+++Glaube keiner Statistik, die du nicht selbst getürkthast.++++
********************
Ein anonymer Statistiker. *
********************
  Mit Zitat antworten Zitat
Benutzerbild von SnuffMaster23
SnuffMaster23

Registriert seit: 13. Feb 2006
Ort: Kempten
253 Beiträge
 
#15

Re: Speicherbereich einer Anwendung ermitteln

  Alt 26. Apr 2006, 22:46
Genau, jeder Applikation werden 4 GB Speicher versprochen, so hab ich das jedenfalls bis vorhin verstanden. Und da niemand so viele GBs Speicher in seinen PC reinsteckt, gibts das Pagefile
Die Adressen für jedes Programm gehen von $00000000 bis $FFFFFFFF aber die sind virtuell, sagen also außerhalb des Programms nichts. Drum versteh ich auch nicht, wieso du danach fragst... egal.
"Conspiracy is the poor man's mapping of the world" - Fredric Jameson
  Mit Zitat antworten Zitat
Benutzerbild von bundy
bundy

Registriert seit: 24. Mai 2003
Ort: Eisenstadt
438 Beiträge
 
Delphi 2007 Architect
 
#16

Re: Speicherbereich einer Anwendung ermitteln

  Alt 26. Apr 2006, 22:54
Ich glaub ich weiss warum es beim meinem Kumpel nicht geht.

Er verwändet einen NoCD Patch, der dürfte ein anderer sein, den ich verwände. Das würde auch den unterschieldlichen Speicherbereich erklären .

Ich bedanke mich an alle die mir hier geholfen haben
+++Glaube keiner Statistik, die du nicht selbst getürkthast.++++
********************
Ein anonymer Statistiker. *
********************
  Mit Zitat antworten Zitat
Frickeldrecktuxer_TM
(Gast)

n/a Beiträge
 
#17

Re: Speicherbereich einer Anwendung ermitteln

  Alt 26. Apr 2006, 23:02
Zitat von SnuffMaster23:
Nee, mal ensthaft: Ich dachte, gerade das wäre der Trick an den virtuellen 32-Bit Adressen.
Isses auch, an die physikalische Adresse kommst du ohne weiteres nicht ran, die aktuelle Page kann sonstwo rumfliegen, wenn's grad' mies um den Arbeitsspeicher bestellt ist sogar im Swapfile auf der Festplatte Und von alldem kriegst du nichts mit.
Aber die physikalische Adresse interessiert auch nicht mehr sonderlich, denn mit WriteProcessMemory() schreibst du in den virtuellen Adressraum des Programmes. Die Adressen, mit denen man arbeitet, sind zwar immer noch virtuell, aber dafür sind es die des anderes Prozesses und nicht deines eigenen. No magic

Zitat von SnuffMaster23:
Außerdem haben die sich manchmal gegenseitig gestört (glaub ich) wenn man nicht sehr umsichtig programmiert hatte, weil sie eben nebeneinander im selben Speicherbereich lagen.
Über WPM() kriegt man das heute immer noch hin, wenn dein Prozess entsprechende Rechte hat. Andere Prozesse abzuschießen ist nach wie vor kein Kunststück, aber es passiert nicht mehr aus Versehen oder aus Dummheit

Zitat von SnuffMaster23:
Das werd ich nochmal etwas überdenken müssen...
Nope, dein Weltbild hat gestimmt, aber du bist davon ausgegangen, daß WPM() in den physikalischen Speicher schreibt, bzw man Werte nur im physikalischen Speicher ändern kann.

Zitat von SnuffMaster:
Wie sollten sonst auch Sachen wie die Zwischenablage, OLE oder einfach das Nachrichtensystem von Windows funktionieren...
Komplizierter


@bundy: Wenn du großartig debuggen willst, solltest du dich auch mal über die Tool Help API schlau machen. Rumgefummele mit Modulhandles würde ich beispielsweise nicht wagen, denn niemand garantiert mir, daß der numerische Wert des Handles die Basisadresse des Moduls ist. Mir Module32First() und Module32Next() kannst du aber durch die Module eines Przesses iterieren, das gesuchte rausfischen und kommst laut API an die Basisadresse. Bei Microsoft gibt's dazu auch ein Beispiel (Funktion ListProcessModules() ist für dich interessant).

Eigentlich ist es aber so, daß das Prozessmodul (also die Exe) immer an der gleichen Stelle geladen wird, wenn ich mich richtig erinnere ist das mittlerweile 0x400000, sofern dort Platz ist, und das sollte beim Laden des Prozesses ja immer der Fall sein. Bist du denn sicher, daß dein Freund die gleiche Version (Patchlevel) wie du benutzt? Mitunter ändern die Hersteller die Position der Variablen gerne von Patchlevel zu Patchlevel, um gerade solche Hacks zu erschweren.
  Mit Zitat antworten Zitat
Benutzerbild von bundy
bundy

Registriert seit: 24. Mai 2003
Ort: Eisenstadt
438 Beiträge
 
Delphi 2007 Architect
 
#18

Re: Speicherbereich einer Anwendung ermitteln

  Alt 26. Apr 2006, 23:15
Ja das denke ich auch, das er ne andere EXE Version verwändet.

Kann ja nur so sein, wenn die Applikation auf Offset $400000 geladen wird, dann ist das ja ein fixer Startpunkt.
Wenn dann bei Offset z.B $4000E0 nicht der selbe Wert wie bei mir steht, dann kann ja nur die Struktur der Applikation ne andere sein.

Wer bestimmt das laden an Offset $400000, das Speichermangement oder die Applikation selbst ?


lg
Bundy
+++Glaube keiner Statistik, die du nicht selbst getürkthast.++++
********************
Ein anonymer Statistiker. *
********************
  Mit Zitat antworten Zitat
brechi

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

Re: Speicherbereich einer Anwendung ermitteln

  Alt 27. Apr 2006, 01:17
Zitat von Frickeldrecktuxer_TM:
Rumgefummele mit Modulhandles würde ich beispielsweise nicht wagen, denn niemand garantiert mir, daß der numerische Wert des Handles die Basisadresse des Moduls ist.
Ja ne ist klar ^^. Wäre ja schlimm wenns nicht so wäre. ModuleHandle = BaseAdresse. Das ist bis XP 100% so.

@0x00400000
Die Applikation hat das im PE Header stehen. Dieser Wert wird vom compiler festgelegt. Bei Delphi kann man das unter Projekt -> Optionen -> Linker einstellen. Als Standard hat sich dise Adresse etabliert. Man kann auch jede andere wählen, sollte diese belegt sein (durch die kernel32.dll oder ntdll.dll oder unterhalb der 0x00100000 Grenze liegen) dann wird die EXE an einer anderen Stelle geladen und durch die Relocation Tabelle die Globalen Variablen usw. wieder richtig hergetsellt.
  Mit Zitat antworten Zitat
Benutzerbild von retnyg
retnyg

Registriert seit: 12. Feb 2005
193 Beiträge
 
#20

Re: Speicherbereich einer Anwendung ermitteln

  Alt 27. Apr 2006, 02:30
Zitat von bundy:
Ja das denke ich auch, das er ne andere EXE Version verwändet.
gut möglich, also solltest du per version der exe (oder anhand der dateigrösse oder prüfsumme)
die entsprechenden speicheradressen einpflegen.
andererseits ist es auch möglich dass die speicheradressen durch verschiedene windows-dll's bei der heap-verwaltung andere adressen zurückliefern, dann kannst du nur nach signifikanten byteketten in bestimmten speicherbereichen suchen.

als beispiel kann ich dir mal nen trainer posten, den ich für pokemon auf dem vba geschrieben habe



Delphi-Quellcode:
program pokerubyhack;
{$APPTYPE CONSOLE}
uses
  sysutils,
  windows,
  messages;

type pcardinal = ^cardinal;
function EnumCb(hnd: hwnd; lParam: cardinal):BOOLEAN; stdcall;
const bufsize = 256;
var strResult: string;
begin
   setlength(strResult,bufsize);
   zeromemory(@strResult[1],bufsize);
   //lastHnd := cardinal(hnd);
   GetWindowText(hnd,@strResult[1],bufSize);
   //if strResult[1] <> #0 then asm int 3 end;
   if copy(strResult,1,16) = 'VisualBoyAdvancethen begin
     pcardinal(lParam)^ := hnd;
     result := false
   end
   else result := true;
end;

function findwnd:hwnd;
var lparam: cardinal;
begin
  result := 0;
  lParam := cardinal( @result );
  EnumWindows(@EnumCb,lparam);
end;

procedure haltp(c:integer;s:string);
begin
   writeln(s+#13#10'press any key to continue');readln;
   halt(c);
end;

type
  ppokestat = ^pokestat;
  pokestat = packed record
    CHP:word;
    AHP:word;
    ATT:word;
    DEF:word;
    INI:word;
    SPA:word;
    SPD:word;
  end;

const START_OFFSET = $1560000;
      DIST2REC = 6;
      pokedef : array[1..7]of string[3] =('CHP','AHP','ATT','DEF','INI','SPA','SPD');
var hnd: hwnd;
    pid : dword;
    dwread: dword;
    hp : thandle;
    s: string;
    p, buf, pend,pokedata: pointer;
    pokeptr: pointer;
    j: integer;
    c,d: char;
    newstat: pokestat;
    pm: pword;
    nv: word;

procedure hackStats(pokeNum:byte);
var dwWritten : dword;
begin
   writeln(#13#10'trying to patch pokemon #'+ inttostr(pokenum));
   writeprocessmemory(hp,pointer(cardinal(pokedata)+DIST2REC+((pokenum -1) * $64 )),@newstat,sizeof(pokestat),dwWritten);
   if dwWritten > 0 then
     writeln(format(#13#10'successful: %d bytes written',[dwWritten]))
   else
     writeln(#13#10'an error occured');
end;


begin

  writeln('retnygs pokemon trainer for visual boy advance v 1.0');
  writeln('====================================================');
  writeln('tested with 2006 pokemon ruby 1.2 and VBA Link 1.7.3L'#13#10'supported cmd line parameters: number of pokemon to patch [1-6]'#13#10'patch is temporary and will be removed on next level up.'#13#10#13#10);

  hnd := findwnd;
  if (Hnd <> 0) then begin
    GetWindowThreadProcessId(hnd,@pid); //Get ProcessID and ignore ThreadID
    hp:=openprocess(ProCEsS_aLL_ACCESS,false,pid);
    if (hp = 0) or (pid = 0) then haltp(1,'could not find hacker process');
    setlength(s,$640000);
    buf:=@s[1];
    cardinal(p):=START_OFFSET; // weise startadresse des zu suchenden speicherbereiches zu
    readprocessmemory(hP,p,buf,length(s),dwRead);
    pokedata := nil;
    if dwread > 0 then begin
       //writeln('could read something'#13#10);
       setlength(s,dwread);
       cardinal(pend) := cardinal(buf) +dwread;
       while cardinal(buf) < cardinal(pend)-$64-(DIST2REC-1) do begin
          inc(pbyte(buf));
          // durchsuche speicher nach gewisser bytefolge die typisch ist
          if (pcardinal(buf)^ = $0) and (pbyte(cardinal(buf)+(DIST2REC-1))^ = $FF) and (pcardinal(cardinal(buf)+$64)^ = $0) and (pbyte(cardinal(buf)+$64+(DIST2REC-1))^ = $FF) then
          begin
            cardinal(pokeptr):= cardinal(buf);
            cardinal(pokedata) := START_OFFSET + cardinal(buf) - cardinal(@s[1]);
            writeln('pokemon list found at adress: ' + inttohex(cardinal(pokedata),8));
            writeln;
            break;
          end;
       end;
       if pokedata <> nil then begin
          writeln('pokemon #: CHP AHP ATT DEF INI SPA SPD');
          writeln('______________________________________');
          for j := 1 to 6 do begin
            writeln('pokemon '+inttostr(j)+':'+
            format(' %.3d %.3d %.3d %.3d %.3d %.3d %.3d',
            [ppokestat(cardinal(pokeptr)+DIST2REC+((j-1)*$64))^.CHP,
             ppokestat(cardinal(pokeptr)+DIST2REC+((j-1)*$64))^.AHP,
             ppokestat(cardinal(pokeptr)+DIST2REC+((j-1)*$64))^.ATT,
             ppokestat(cardinal(pokeptr)+DIST2REC+((j-1)*$64))^.DEF,
             ppokestat(cardinal(pokeptr)+DIST2REC+((j-1)*$64))^.INI,
             ppokestat(cardinal(pokeptr)+DIST2REC+((j-1)*$64))^.SPA,
             ppokestat(cardinal(pokeptr)+DIST2REC+((j-1)*$64))^.SPD
            ]) );
          end;

          with ppokestat(@newstat)^ do begin
            CHP:=999;
            AHP:=999;
            ATT:=999;
            DEF:=999;
            INI:=999;
            SPA:=999;
            SPD:=999;
          end;
          if paramcount > 0 then c := paramstr(1)[1] else begin
            writeln(#13#10'please enter a pokemon number [1-6] that you want to boost or [0] to abort, [A] for all');
            readln(c);
          end;
          case c of
            '1'..'6' :
            if paramcount > 0 then hackstats(byte(c)-48)
            else begin
              writeln ('Automatic hack will set all values to 999'#13#10'manual hack will allow you to enter the values yourself'#13#10'type A for automatic or M for manual');
              read(d);
              if d in ['a','A'] then hackstats(byte(c)-48)
              else if d in ['m','M'] then begin
                 newstat := ppokestat(cardinal(pokeptr)+DIST2REC+(((byte(c)-48)-1)*$64))^;
                 pm:=@newstat.chp;
                 for j := 1 to 7 do begin
                   write('enter new value for ' + pokedef[j] + ', current: ' + inttostr(pm^) + ' :');
                   readln(nv);
                   pm^ := nv;
                   inc(pm);
                 end;
                 hackstats(byte(c)-48)
              end else writeln('wrong input');
            end;
            '0' : writeln('aborted');
            'A','a' : for j := 1 to 6 do hackstats(j);
            else haltp(1,'error - undefined input');
          end;
       end;
    end else writeln('couldnt read from target process');
    closehandle(hp);
    haltp(0,#13#10);
  end else haltp(1,'could not find VBA window');

end.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 08:47 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