und zwar habe ich mehrere Fragen zu OllyDbg in Verbindung mit Metin2 und C++
Also:
Erste Frage:
Ich will an die PickUp-Funktion rankommen, sie ist auch nicht schwer zu finden (denke ich)
Olly zeigt mir das hier an:
Alle anderen Funktionen kann ich so aufrufen, aber nur weil das in den eckigen Klammern statisch ist
Hier hab ich allerdings EBP+8... wenn ich es so injecte stürzt entweder Metin ab oder es passiert nichts
Kann mir wer sagen wie ich das verwenden muss?
Das leitet gleich zur zweiten Frage über:
Ich such auf nem Privatserver (Also mit einer alten Exe) und da gibts ja die ganzen Namen wie z.b. "SendItemPickUpPacket Error"
Aber das kann doch unmöglich die einzige Möglichkeit sein, an die Funktionen zu kommen oder?
Ich würd ja gerne mal die Schlag-Funktion finden oder ähnliches, aber wie kann ich Hotkeys verfolgen?
Ich weiß nicht wie ich das machen soll
Vllt kennt auch jemand ein gutes Tut wo sowas angesprochen wird
Ich hab bis jetzt 2 Olly-Tuts hier durchgemacht (Chatfunktionen finden von schlurmann und itemuse-adressen finden von xWaffeleisen glaub ich)
Weiß jemand noch Ergänzungen? Am liebsten direkt für Metin
Alle anderen Funktionen kann ich so aufrufen, aber nur weil das in den eckigen Klammern statisch ist
Hier hab ich allerdings EBP+8... wenn ich es so injecte stürzt entweder Metin ab oder es passiert nichts
Kann mir wer sagen wie ich das verwenden muss?
Also, die Funktion ist __thiscall. Wenn du sie aus deinem Code (ich gehe mal von C/C++ aus) heraus aufrufen willst, musst du den Klasseninstanz-Ptr ins ECX Register kopieren.
Intel:
Code:
const void* classPtr = *(const void **)0x5F1D34; // <-- Zeigt auf den eigentlichen Klasseninstanz-Ptr
__asm mov ecx, [classPtr]
AT&T
Code:
const void* classPtr = *(const void **)0x5F1D34; // <-- Zeigt auf den eigentlichen Klasseninstanz-Ptr
asm("movl %0, %%ecx" : : "m" (classPtr));
Nun zu dem
Code:
PUSH EBP+8
Hier wird ein Argument für die eigentliche PickUp-Funktion auf den Stack gepusht.
Wenn du dich mal genauer mit dem Stack beschäftigst wirst du herausfinden das EBP+8 hier ein Argument der Funktion ist, aus der du den Asm-Code kopiert hast.
Das leitet gleich zur zweiten Frage über:
Ich such auf nem Privatserver (Also mit einer alten Exe) und da gibts ja die ganzen Namen wie z.b. "SendItemPickUpPacket Error"
Aber das kann doch unmöglich die einzige Möglichkeit sein, an die Funktionen zu kommen oder?
Ich würd ja gerne mal die Schlag-Funktion finden oder ähnliches, aber wie kann ich Hotkeys verfolgen?
Tastendrücke landen immer in der Python-Klasse "Game", wo dann die jeweiligen API-Funktionen gecallt werden.
Für die Schlag-Api kann ich dir "player.ComboAttack" und "player.SetAttackKeyState" empfehlen.
Und iwie habe ich glaub ich die falsche PickUp-Funktion
Jedes mal wenn ich was aufheb, ist der Parameter anders
Also ist es iwie keine Item-ID
Hier mal mein kompletter Code (wahrscheinlich total dämlich zusammengemixt^^)
Ich weiß nicht was ich bei PUSH hinschreiben soll... bei ECX passiert nix, und egal welche zahl ich einfüge, passiert auch nix-.-
Nochmal Edit, kurze Ergänzung zum 2. Edit:
Ich hab mal ne Yangbombe gedroppt und die ganzen ECX-Werte aufgeschrieben...
Einfach ansehen^^ (DEC-Wert hab ich umgewandelt für mich, damit ich die zahlen leicher erkenn)
Und iwie habe ich glaub ich die falsche PickUp-Funktion
Jedes mal wenn ich was aufheb, ist der Parameter anders
Also ist es iwie keine Item-ID
Hier mal mein kompletter Code (wahrscheinlich total dämlich zusammengemixt^^)
FPickUp ist die Adresse der PickUp-Funktion im Client.
Du brauchst da keine Funktion mehr definieren.
Und ja, es ist die eindeutige ID des Items.
Der Code den ich oben gepostet habe, sollte eigentlich funktionieren, solang du ihn mit einer validen ItemID aufrufst.
Quote:
Originally Posted by Padmak
Passt das? Bzw ich weiß dass es NICHT passt, Metin stürzt immer ab^^
Das mit dem Schlagen probier ich aus, danke
Padmak
Edit:
Okay.. das mit dem Schlagen krieg ich auch nich hin
Wie finde ich diese ominöse Game-Klasse?
Die Game Klasse liegt in der Game.py, welche sich wiederum in der root.epk befindet.
Die root.epk muss aber vorher entpackt werden. (Tools gibt es zwei, einfach im Board suchen).
Quote:
Originally Posted by Padmak
Ich weiß nicht was ich bei PUSH hinschreiben soll... bei ECX passiert nix, und egal welche zahl ich einfüge, passiert auch nix-.-
Du musst nirgends PUSH oder CALL verwenden, das macht der Compiler für dich, wenn du den Funktionspointer "FPickUp" aufrufst.
Um es ganz simpel zu erklären "FPickUp" ist das selbe wie dein "dwPickFunc".
Am besten du ließt ein Buch über die Grundlagen von C/C++, sowie über Reverse Engineering.
Ist das eine Antwort oder eine Frage?
Ich muss es doch in einem neuen Thread laufen lassen? Sonst hängt das ganze Spiel sobald ich da eine Schleife einbau
Gibts auch eine Alternative zu Threads? Also dass sich Metin nicht aufhängt?
1. Threads haben den Typ DWORD WINAPI und nicht void
2. du musst eine while Schleife machen, wenn etwas die ganze Zeit passieren soll (die Tatsache, dass du nen Thread machst und dass du Sleep(500) schreibst, deutet darauf hin, dass du es immer wieder geschehen lassen willst)
3. return 1 oder TRUE gehört außerhalb von dem if Block, da immer TRUE zurückgegeben werden muss, wenn kein Fehler auftritt. Man man, du solltest dir echt mal was darüber anlesen o.ô
4. ich weiß ja nicht, ob die calling convention dieser Pickup Funktion WINAPI ist, aber falls nicht, musst du nach dem Call noch den Stack aufräumen.
Es stürzt aber immer noch ab-.-
In Olly kommt danach direkt eine Funktion, die damit aber nichts zu tun hat
Wo soll ich denn den Stack aufräumen bzw wie?
Ich zitiere einmal das (meiner Meinung nach sehr hilfreiche) Wikibook "":
Quote:
The Standard Exit Sequence must undo the things that the Standard Entry Sequence does. To this effect, the Standard Exit Sequence must perform the following tasks, in the following order:
- Remove space for local variables, by reverting esp to its old value.
- Restore the old value of ebp to its old value, which is on top of the stack.
- Return to the calling function with a ret command.
(findet man )
Sieht sehr nach aus, deshalb macht das dann nicht die aufgerufene Funktion, sondern eben die aufrufende Funktion.
Ich zitiere einmal das (meiner Meinung nach sehr hilfreiche) Wikibook "":
(findet man )
Sieht sehr nach aus, deshalb macht das dann nicht die aufgerufene Funktion, sondern eben die aufrufende Funktion.
Das was du da beschrieben hast gilt für __stdcall, was ja sowieso beim return den Stack aufräumt.
Ich sprach von __cdecl, da muss der Teil, der die Funktion gecalled hat, durch Erhöhen des ESP Wertes zum Urpsprungswert, bevor die Parameter gepusht wurden, den Stack aufräumen.
[OllyDbg] mehrere fragen.. 10/08/2009 - General Coding - 6 Replies Hihow also ich hätt ma 2 fragen zu OllyDbg .. ich hab zwar schon ein wenig an wissen für olly gesammelt aber was ich nie verstanden habe:
1. Wenn ich dll's in olly laden will bekomm ich eine fehlermeldung, dass olly sie nich laden könne und ob ichs nich doch probieren wolle, und danach wieder eine fehlermeldung dass olly die dll nich laden könne. (Dabei ist egal welche dll ich versuche zu laden, hab es mit 20 verschiedenen probiert >.<) Ich sehe aber andauernd screenshots von dll's die in...