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 **** 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 ^^
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.
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.
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 ) wo ich als parameter einfach nur die adresse angebe und die mir am besten das ergebniss direkt ausspuckt
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^^)
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:
Und als Assembler solltest du goasm benutzen wenn du das in Maschinencode umwandeln willst
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
MfG DodgeX^^
[Edit]
kriegst ma bissl +karma sofern ich das auf die reihe krieg xD
[Edit²]
Juhu ich habs geschaft^^
Hast dein karma ^^
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 ^^)
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' />
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.
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)
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^^
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.
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
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, [bx][si], 0xC9
inc w, [bx][si]
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.
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 ?
Ob mans glaubt oder nicht, ich hab schon wieder neue fragen
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 )?
weil das fummelt ja fröhlich am eigenen process rumm
MfG DodgeX
PS: Fragen über fragen ^^
aber bald sollte alles ich alles kapiert haben :err:
[Frage]Longjuyt2 Frage .. wegen Seelies 06/23/2009 - Metin2 Private Server - 13 Replies Hi
ich hab ne Frage ich kenn mich mit Seelis nicht so gut aus aber immer wenn ich eins lese, kommt das hier
http://img25.imageshack.us/img25/9453/unben1annt. png
dann klick ich auf ok und nichts verändert sich aura bleibt immer noch auf g6