Frage wegen Speicherzugriffen

08/27/2006 11:00 Dodge#1
Hallo,

ich habe mir vor ca einer woche ne Logitech G15 (die Gamer Tastatur mit dem LCD ^^) gekauft und wollte mir nen 'brauchbares' Applet für wow schreiben da das standart ding von wow crap ist ;)

nun ist meine frage wie kann ich mit meinem programm (in c/c++) auf speicher adressen anderer programme zugreifen? so wie programme wie zb CheatEngine es machen. und desweiteren würde ich gerne wissen wie ich an ne statische adresse komme wo die stats (stärke, beweglichkeit, int usw) undauch sache wie rüstung usw gespeichert sind? mit cheatengine habe ich zwar adressen gefunden die die entsprehcendne werte haben aber beim umloggen uaf nen anderen char haben die sich die adressen geändert =/

und bwh (oder bhw oder wie der hack/bot auch immer heist) kann ja zb für das WallClimb ne feste adresse die unabhängig von char immer die selbe ist ausgeben, sowas bäuchte ich für die adnern werte auch ^^



wäre cool wenn mir jemand helfen könnte ^^

MfG DodgeX
08/27/2006 12:49 Maybe It's Maybelline#2
Solltest du es auf einen offizielen Server machen, würde ich dir raten es bei anderen minispielchen zu probieren solltest du was falsch machen kann das zu einen Account Ban führen.
Die Pointer bekommst du zu 90% wenn du in Cheatengine rechtsklick auf die Adresse machst und "See what writes to this adress" klickst, dann musst du ingame irgendwas machen was den Stat verändert oder synchronisiert. Dann machst du ein doppelklick auf die neue adresse und füge sie der Codelist hinzu, bzw du musst überprüfen obs wirklich diese ist indem du auf information drückst und nachschaust ob der Wert für den Stat da drinne steht hinter den asm befehlen, selten kanns auch sein das es eine berechnung ist. Schau dich einfach auf Extalia (google.de) um und mach das Tutorial.exe im CheatEngine Ordner.
08/27/2006 12:59 mr.rattlz#3
Ich habe so was geschrieben als ich meine G15 bekommen habe, da sich aber bei jedem größeren Patch im Code von WoW etwas verschiebt musste ich mein Programm immer wieder anpassen und das wurde mir dann irgendwann einfach zu ätzend.
Ich weiß schon nicht mal mehr mit welcher Version von WoW es funktioniert hat :P
Falls du Lust hast dich ohne meine Unterstützung durch den Assemblercode zu wühlen kann ich es vielleicht
mal zu Anschauungszwecken hochladen.
08/27/2006 15:06 Dodge#4
Quote:
Falls du Lust hast dich ohne meine Unterstützung durch den Assemblercode zu wühlen kann ich es vielleicht mal zu Anschauungszwecken hochladen.
Auch wenn ich eigentlich keine ahnung von Assembler habe wäre es nett wenn du es mal uppen könntest^^

ODER wenn du zeit und lust hast mir das nötigste raussuchen und vlt auch so zusammen packen das ich es in c/c++ als funktion verwenden kann (soweit ich weiß kann man asm irgendwie in c/c++ verwenden :D) wo ich als parameter einfach nur die adresse angebe und die mir am besten das ergebniss direkt ausspuckt :p
zb:
Code:
11aa66ff -> 1337
int x = die_asm_func(11aa66ff);
cout << x; //ausgabe 1337
ja ok denke mal sooo easy wirds net gehn xD


Ich hab übrings eben ma das tutorial durchgemacht und muss das tutorial is irgendwie sau einfach o.o

Extalia guck ich mir später mal an wenn ich wieder nen 'vernüpnftigen' Pc zu verfügung habe da auf diesem pc irgendwie alles laggt xD (400MHz mit 128mb ram^^)


MfG DodgeX


PS: danke für die schnellen antworten :)
08/27/2006 16:17 mr.rattlz#5
Dein Problem mit den Adressen finden löst mein Code nicht ;)
Ich habe lediglich so ein Programm geschrieben wie du es vorhast, die Adressen habe ich selber von Hand reingeschrieben :P
Zum schreiben habe ich PSPad benutzt: [Only registered and activated users can see links. Click Here To Register...]
Und als Assembler solltest du goasm benutzen wenn du das in Maschinencode umwandeln willst ;)
[Only registered and activated users can see links. Click Here To Register...]
08/27/2006 17:07 Dodge#6
Quote:
Dein Problem mit den Adressen finden löst mein Code nicht
das finden der adressen ist auch nciht mein problem^^

sondern das auslesen ;)



ich hab mir dein code mal geladen und werde ihn mir jetzt "antun" denke ich versteh zwar eh nur <50% aber mit etwas glück (und kommentaren von dir) sollte ich vlt ein kleines bisschen durchblicken ^^

und wenn nicht.... ich weiß wo du wohnst *muahahaha*

ne scherz xD
wenn ich net durchblick nerv ich dich soooo lange bis ichs kapiert hab (durch deine hilfe *gg*)



also gut...


Lets fetz :D


MfG DodgeX^^

[Edit]
kriegst ma bissl +karma sofern ich das auf die reihe krieg xD

[Edit²]
Juhu ich habs geschaft^^
Hast dein karma ^^
08/29/2006 16:56 Dodge#7
Huhu,

hab mir inzwischen dein code angeguckt (ca 50mal xD) und denke mal das ich es 'verstanden' habe ^^

1) Process erzeugen/starten (wow.exe)
2) "warten" bis eingeloggt
3) infos lesen
4) infos aufs lcd posten xD
...


soweit so gut, jetz stellt sich mir die frage, muss man den process erstellen um die speicheradressen lesen zu können?

wenn ja würd mich intressieren ob man das
Code:
call kernel32&#58;CreateProcessA
in gewisser weise mit
Code:
prozessid=_spawnl&#40;_P_NOWAIT,&#34;wow.exe&#34;,&#34;wow.exe&#34;,NULL&#41;;
vergleichen kann?

denn ich denke mal das mit
Code:
 mov eax,&#91;wow_process_information.hProcess&#93;
 mov &#91;wow_ph&#93;,eax
wow_ph die prozess id von der gestarteten wow.exe zugewiesen bekommt^^

wenn das soweit stimmen sollte und es in c/c++ funktionen gibt die das selbe machen wie
Code:
 call kernel32.dll&#58;WriteProcessMemory
 call kernel32.dll&#58;ReadProcessMemory
dürfte es doch (fast) kein problem sein das gesammte programm in c/c++ umzuschreiben oder?^^



Wieso ich das prog in c/c++ umschreiben will?
ganz einfach weil ich zusätzlich noch winamp infos anzeigen will und ich net in der lage bin die mit asm zu bekommen und ich dann auch das aussehn einfacher meinen wnschen anpassen kann (wegen mehr ahnung und so ^^)

[EDIT]
wozu ist
Code:
patch_memory&#58;
  push 0
  push 35
  push addr code2
  push 0x007CD8FE
  push &#91;wow_ph&#93;
 call kernel32.dll&#58;WriteProcessMemory
 cmp eax,0
 je >error_wpm
  push 0
  push 7
  push addr code1
  push 0x0045E19C
  push &#91;wow_ph&#93;
 call kernel32.dll&#58;WriteProcessMemory
 cmp eax,0
 je >error_wpm
 ret
da? bzw was macht es genau?^^
[/EDIT]

Ich hoffe ich höre nochmal was von dir,
ich werd mich (nachdem ich gleich zum pc laden geh fragen ob mein netzteil da is) im inet auf die suche nach lese/schreib funktionen machen wie sie von dir verwendet wurden nur für c/c++^^

MfG DodgeX


PS: Sry wegen doppelpost
bei der menge is ein 2ter post einfach übersichtlicher
[img]text2schild.php?smilienummer=1&text=eigene Meinung 4tw xD' border='0' alt='eigene Meinung 4tw xD' />
08/30/2006 08:55 neji#8
Hi,

das Prozesshandle kannst du mit der API-funktion [Only registered and activated users can see links. Click Here To Register...]
bekommen.

Speicher lesen/schreiben kannst du in C/C++ genauso wie in ASM mit den API's [Only registered and activated users can see links. Click Here To Register...] und [Only registered and activated users can see links. Click Here To Register...]

Wie du an der Funktion siehst :

Code:
BOOL WriteProcessMemory&#40;
 HANDLE hProcess,
 LPVOID lpBaseAddress,
 LPCVOID lpBuffer,
 SIZE_T nSize,
 SIZE_T* lpNumberOfBytesWritten
&#41;;
werden 5 Parameter übergeben : Das Prozesshandle zum Prozess wo geschrieben werden soll,
die Adresse wo geschrieben werden soll,
was geschrieben werden soll,
die größe des zu schreibenden und einen Pointer auf eine Variable , die die Anzahl der bytes, die in den Zielprocess übertragen werden empfängt.

Code:
patch_memory&#58;
  push 0
  push 35
  push addr code2
  push 0x007CD8FE
  push &#91;wow_ph&#93;
 call kernel32.dll&#58;WriteProcessMemory
 cmp eax,0
 je >error_wpm
  push 0
  push 7
  push addr code1
  push 0x0045E19C
  push &#91;wow_ph&#93;
 call kernel32.dll&#58;WriteProcessMemory
 cmp eax,0
 je >error_wpm
 ret
das wird dann auch gleich viel klarer.
mit den Pushes werden die Parameter übergeben (und zwar von hinten nach vorn, also zuerst der letzte param, dann der vorletzte etc)
mit dem Call wird dann die Funktion aufgerufen

Richtig gerum heisst das also Writeprocessmemory([wow_ph],0x0x007CD8FE,code1,35,0)
wobei [wow_ph] eben das Prozesshandle beinhaltet, 0x007CD8FE die Adresse ist an der geschrieben werden soll, code1 beinhaltet den Wert der geschrieben werden soll, 35 Bytes sollen geschrieben werden

der letzte Parameter ist optional. Da er hier also nicht benötigt wird, hat er einfach 0 übergeben

Mit
Code:
cmp eax, 0
je >error_wpm
überprüft er den Rückgabewert der Funktion, also ob die Funktion erfolgreich durchgeführt werden konnte oder nicht. Ist der Rückgabewert in eax = 0 , wenn also die Funktion nicht korrekt ausgeführt werden konnte, dann wird zu error_wpm gesprungen (wenn ich hier falsch liege, bitte berichtigen)
08/30/2006 15:56 Dodge#9
thx für die erklärung =D

alerdings muss ich zu meiner schande gestehen das die frage von mir absolut mies formuliert war^^

weil das mit dem push und call hab ich soweit verstanden die frage sollte eher in die richtung gehen "wieso schreibt der die 7 bzw 35 byte an die bestimmten stellen?" und ich bezweifel das da jemand anderes als mr.rattlz mir helfen kann^^


MfG Dodge

PS: danke trotzdem, die links sind hilfreich ;)
08/30/2006 16:20 neji#10
Quote:

code1 db 0xE9,0x5D,0xF7,0x36,0x00
db 0x90
db 0x90
soweit ich noch weiss ist E9 ein Near Jump
90 ist ein NOP (No Operation)

Mein Tipp ist, dass er einen oder 2 Befehle (7 Byte) an dieser adresse mit einem Jump zu einer anderen adresse überschreibt....evtl eine Art CodeCave wo er selber Code implementiert hat.

der ersetzte Jump müsste so heißen: JMP 0xF75D

da der Jump nur 5 Bytes groß ist, er aber 7 überschrieben muss, fügt er noch 2 NOP's die jeweils 1 byte groß sind an.
08/30/2006 16:26 Dodge#11
wow kling irgendwie so als könnte es stimmen ^^


weist du vlt noch was der code2 teil dann bewirkt?^^

Code:
code2 db 0x50
   db 0x51
   db 0x81,0xFA,0xD8,0xFD,0x7F,0x00
   db 0x74,0x0A
   db 0xE8,0x33,0xCE,0xC8,0xFF
   db 0xE9,0x91,0x08,0xC9,0xFF
   db 0xE8,0x29,0xCE,0xC8,0xFF
   db 0xA3,0xF0,0xB0,0xC9,0x00
   db 0xE9,0x82,0x08,0xC9,0xFF
btw: thx 4 hlp (gibt +karma :p)


MfG DodgeX
08/30/2006 16:40 neji#12
so gut is mein asm net -.-

mein hiew sagt mir dass er folgendes machen soll :

Code:
 push ax
 push cx
 cmp dx, 0x0FDD8
 jg 0x08
 je 0x14
 call 0xCE40
 enter 0x0E9FF, 0x91 //Enter ??? keinen plan was HIEW mir damit sagen will
 or cl, cl
 jmp ax
 sub si, cx
 enter 0x0A3FF, 0x0F0
 mov al, 0xC9
 add ch, ch
 or b, &#91;bx&#93;&#91;si&#93;, 0xC9
 inc w, &#91;bx&#93;&#91;si&#93;
aber das macht für mich gar keinen Sinn -.-
08/30/2006 17:07 Dodge#13
Quote:
aber das macht für mich gar keinen Sinn -.-
dito ._.


mr.rattlz we need your help =/
08/30/2006 20:58 mr.rattlz#14
Joa, dann will ich das mal gerade was aufklären, bin eben aus Luxemburg heimgekommen :>

Code:
0045E19C * * E9 5DF73600 * *JMP WoW.007CD8FE
0045E1A1 * * 90 * * * * * * NOP
0045E1A2 * * 90 * * * * * * NOP
Einfach nur der Sprung in meinen Code den ich ans Ende der Codesection einfüge :>
Dieser Sprung wurde (diese Stelle war in 1.10 korrekt glaube ich) nach einer Funktion ausgeführt,
die in eax einen Pointer zurückgibt der auf eine Struktur enthält, die den Charakter beschreibt.


Code:
007CD8FE * * 50 * * * * * * PUSH EAX
007CD8FF * * 51 * * * * * * PUSH ECX
007CD900 * * 81FA D8FD7F00 *CMP EDX,WoW.007FFDD8 * * * * * * * * * *; *ASCII &#34;..&#092;Object/ObjectClient/Player_C.h&#34;
007CD906 * * 74 0A * * * * *JE SHORT WoW.007CD912
007CD908 * * E8 33CEC8FF * *CALL WoW.0045A740
007CD90D * *^E9 9108C9FF * *JMP WoW.0045E1A3
007CD912 * * E8 29CEC8FF * *CALL WoW.0045A740
007CD917 * * A3 F0B0C900 * *MOV &#91;DWORD DS&#58;C9B0F0&#93;,EAX
007CD91C * *^E9 8208C9FF * *JMP WoW.0045E1A3
Der code den ich oben überschrieben hatte waren die zwei Pushs und der call.
Ich überprüfe dort mit Hilfe des Registers edx, ob wirklich ein Charakter vorhanden ist und wenn ja wird der Pointer zur Struktur an eine feste Adresse in WoW geschrieben, wo mein Programm sie dann bequem auslesen kann :)



edit:
Ist dir übrigens mal aufgefallen, dass dein Hiew dir nur 16-Bit code anzeigt neji :P ?
08/30/2006 21:43 Dodge#15
Juhu!!
Mein Retter :D


Ob mans glaubt oder nicht, ich hab schon wieder neue fragen :rolleyes:

Quote:
Dieser Sprung wurde (diese Stelle war in 1.10 korrekt glaube ich) nach einer Funktion ausgeführt,
die in eax einen Pointer zurückgibt der auf eine Struktur enthält, die den Charakter beschreibt.
Wie kann ich die stelle jetzt (Patch 1.12) bzw bei späteren Patches finden? ;)
Ebenso für den 2ten teil wo das 'große' hingeschrieben wird^^


Und noch was was evtl wichtig sein wird^^
Mit sicherheit muss das was an die entsprechenden stellen kopiert wird ja irgendwie an die neuen adressen angepasst werde, wie mache ich es wenn es soweit ist? :)



So und nu eine letzte frage (die mir jetzt im moment einfällt^^)
Kannst du mir evtl sagen wie ich die daten die ich in den speicher schreibe in c/c++ in ner variable unterbringen kann?

also welcher datentyp usw

[edit]
und da is mir noch was eingefallen^^
was macht das enableremoteprivileges (im detail, das gehört zu den dingen die ich noch immer net versteh :cry: )?
weil das fummelt ja fröhlich am eigenen process rumm :eek:


MfG DodgeX


PS: Fragen über fragen ^^
aber bald sollte alles ich alles kapiert haben :err: