Dav92
Ist öfter hier
- Registriert
- 13 Oktober 2006
- Beiträge
- 852
So, nun ein "kleines" Tutorial von mir, wie man richtige MercOnlyItems erstellt.
Benötigte Programme/Dateien:
OllyDBG
ItemTypes.txt
patchstring.tbl
D2Client.dll
D2Game.dll
Und los gehts:
Zunächst solltet ihr euch einen neuen ItemType in der ItemTypes.txt anlegen und alle Items, die nachher MercOnly sein sollen, darauf
verlinken.
Dann öffnet ihr die D2Client.dll mit OllyDBG und geht zu folgender CodeStelle:
Da wir hier zu wenig Platz haben, müssen wir an eine Stelle springen, an der wir mehr Platz haben. In einer unveränderten
D2Client.dll hat es genügend Platz gegen Ende der dll ab Offset 6FB6C4A0.
Also springen wir dort hin. Danach sollte euer Code wie folgt aussehen:
Ab Offset 6FB6C4A0 schreibt ihr folgendes:
Abspeichern und dann könnt ihr es testen. Ab sofort kann der Merc nur noch Items tragen, die auf den neuen ItemType verlinkt sind.
Aber bisher kann unser Charakter diese Items auch noch tragen und es wird noch kein "MercOnly"-String angezeigt. Um den "MercOnly"-
String kümmern wir uns jetzt:
Ihr öffnet nun die D2Client.dll wieder und geht zu folgendem Code:
Von nun an ist mehr Eigeninitiative von euch gefordert, da ich eine andere D2Client.dll verwende, und somit keine korrekten Offsets
für freie Stellen in der dll posten kann.
Ihr springt also vom Offset 6FAE395E zu einer freien Stelle, und nop'ed den Rest aus. An eurer freien Stelle, solltet ihr nachher
folgenden Code stehen haben:
So, das war der kurze Teil. Um einen Check einzubauen, dass nur noch der Merc diese Items tragen kann, müssen 10 weitere Stellen
bearbeitet werden, 5 in der D2Client.dll und 6 in der D2Game.dll. Ab hier poste ich nur noch den Code. Ihr wisst inzwischen ja schon,
was ihr zu tun habe. Nämlich einfach an eine "leere" Stelle springen und dort den Code eintragen:
Die 5 Stellen in der D2Client.dll:
Und nun zur D2Game.dll:
So, nun sollten eure MercOnlyItems funktionieren. Viel Spaß damit.
Benötigte Programme/Dateien:
OllyDBG
ItemTypes.txt
patchstring.tbl
D2Client.dll
D2Game.dll
Und los gehts:
Zunächst solltet ihr euch einen neuen ItemType in der ItemTypes.txt anlegen und alle Items, die nachher MercOnly sein sollen, darauf
verlinken.
Dann öffnet ihr die D2Client.dll mit OllyDBG und geht zu folgender CodeStelle:
Code:
6FAED563 PUSH 0
6FAED565 PUSH 0
6FAED567 PUSH 0
6FAED569 PUSH 0
6FAED56B PUSH EBP
6FAED56C PUSH EBX
6FAED56D CALL <JMP.&D2Common.#10756>
Da wir hier zu wenig Platz haben, müssen wir an eine Stelle springen, an der wir mehr Platz haben. In einer unveränderten
D2Client.dll hat es genügend Platz gegen Ende der dll ab Offset 6FB6C4A0.
Also springen wir dort hin. Danach sollte euer Code wie folgt aussehen:
Code:
6FAED563 JMP 6FB6C4A0
6FAED568 NOP
6FAED569 NOP
6FAED56A NOP
6FAED56B NOP
6FAED56C NOP
6FAED56D NOP
6FAED56E NOP
6FAED56F NOP
6FAED570 NOP
6FAED571 NOP
Ab Offset 6FB6C4A0 schreibt ihr folgendes:
Code:
6FB6C4A0 PUSH 0
6FB6C4A2 PUSH 0
6FB6C4A4 PUSH 0
6FB6C4A6 PUSH 0
6FB6C4A8 PUSH EBP
6FB6C4A9 PUSH EBX
6FB6C4AA CALL <JMP.&D2Common.#10756> ;Alle Anforderungen erfüllt?
6FB6C4AF TEST EAX,EAX ;Wenn nein, dann erlaube dem Merc
6FB6C4B1 JE D2Client.6FAED572 ;nicht, das Item zu tragen
6FB6C4B7 PUSH 67 ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
6FB6C4B9 PUSH EBX ;ptItem
6FB6C4BA CALL <JMP.&D2Common.#10731> ;Vergleicht den ItemType des Items mit dem vorgegebenen
6FB6C4BF JMP 6FAED572 ;springt zurück in den Originalcode
Abspeichern und dann könnt ihr es testen. Ab sofort kann der Merc nur noch Items tragen, die auf den neuen ItemType verlinkt sind.
Aber bisher kann unser Charakter diese Items auch noch tragen und es wird noch kein "MercOnly"-String angezeigt. Um den "MercOnly"-
String kümmern wir uns jetzt:
Ihr öffnet nun die D2Client.dll wieder und geht zu folgendem Code:
Code:
6FAE395E MOV EDX,EAX
6FAE3960 LEA ECX,DWORD PTR SS:[ESP+208]
6FAE3967 CALL ESI
6FAE3969 MOV EDX,DWORD PTR SS:[ESP+38]
6FAE396D LEA ECX,DWORD PTR SS:[ESP+4208]
6FAE3974 CALL D2Client.6FB20430
Von nun an ist mehr Eigeninitiative von euch gefordert, da ich eine andere D2Client.dll verwende, und somit keine korrekten Offsets
für freie Stellen in der dll posten kann.
Ihr springt also vom Offset 6FAE395E zu einer freien Stelle, und nop'ed den Rest aus. An eurer freien Stelle, solltet ihr nachher
folgenden Code stehen haben:
Code:
PUSH EAX ;\
PUSH ECX ; | Zunächst sichern wir
PUSH EDX ; | alle Register, so dass
PUSH EBX ; | wir diese beliebig
PUSH EBP ; | verwenden können
PUSH ESI ; |
PUSH EDI ;/
MOV EAX,DWORD PTR DS:[6FBB58F0] ;ptItem
PUSH 67 ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
PUSH EAX ;ptItem
CALL <JMP.&D2Common.#10731> ;Vergleicht den ItemType des Items mit dem vorgegebenen
TEST EAX,EAX ;Überspringt das Einfügen unseres
JE SHORT ENDE ;neuen Strings, wenn das Item nicht den entsprechenden ItemType hat
MOV ECX,2B98 ;Nun öffnet ihr die patchstring.tbl und fügt am Ende einen neuen String ein. Mein Code ist so beschaffen, dass er nur mit folgendem String richtig arbeitet: "\red;(Mercenary only)" Nun notiert ihr euch den Index eures Strings. Wer AFJs .tbl-Editor nutzt klickt dazu auf "id#". Diesen Wert müsst ihr nun hier eintragen
CALL <JMP.&D2Lang.#10004> ;Gibt einen ptr zu unserem String zurück
XOR ECX,ECX ;\
WEITER: ; |
MOV EDX,DWORD PTR DS:[EAX+ECX*4] ; | Dieser Code verfrachtet unseren String
MOV DWORD PTR SS:[ESP+ECX*4+4224],EDX ; | auf den Stack, von wo aus dieser dann nachher vom Game gelesen wird
INC ECX ; |
CMP ECX,9 ; |
JLE SHORT WEITER ;/
ENDE:
POP EDI ;\
POP ESI ; | Stellt die ursprünglichen Register wieder her
POP EBP ; |
POP EBX ; |
POP EDX ; |
POP ECX ; |
POP EAX ;/
MOV EDX,EAX ;\
LEA ECX,DWORD PTR SS:[ESP+208] ; | Teile des Originalcodes,
CALL ESI ; | welcher benötigt wird,
MOV EDX,DWORD PTR SS:[ESP+38] ; | um unseren String anzuzeigen
LEA ECX,DWORD PTR SS:[ESP+4208] ; |
CALL D2Client.6FB20430 ;/
JMP D2Client.6FAE3979 ;springt zurück in den Originalcode
So, das war der kurze Teil. Um einen Check einzubauen, dass nur noch der Merc diese Items tragen kann, müssen 10 weitere Stellen
bearbeitet werden, 5 in der D2Client.dll und 6 in der D2Game.dll. Ab hier poste ich nur noch den Code. Ihr wisst inzwischen ja schon,
was ihr zu tun habe. Nämlich einfach an eine "leere" Stelle springen und dort den Code eintragen:
Die 5 Stellen in der D2Client.dll:
Code:
6FAE0538 JMP CHECK1
6FAE06B0 JMP CHECK2
6FAE118A JMP CHECK3
6FAE2F3F JMP CHECK4
6FB2B56B JMP CHECK5
Code:
[color=red]CHECK1:[/color]
CALL <JMP.&D2Common.#10756>
TEST EAX,EAX
JE D2Client.6FAE053D
PUSH 67 ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
PUSH EBX
CALL <JMP.&D2Common.#10731>
TEST EAX,EAX
JE SHORT WEITER1
XOR EAX,EAX
JMP D2Client.6FAE053D
WEITER1:
INC EAX
JMP D2Client.6FAE053D
[color=red]CHECK2:[/color]
CALL <JMP.&D2Common.#10756>
TEST EAX,EAX
JE D2Client.6FAE06B5
PUSH 67 ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
PUSH ESI
CALL <JMP.&D2Common.#10731>
TEST EAX,EAX
JE SHORT WEITER2
XOR EAX,EAX
JMP D2Client.6FAE06B5
WEITER2:
INC EAX
JMP D2Client.6FAE06B5
[color=red]CHECK3:[/color]
CALL <JMP.&D2Common.#10756>
TEST EAX,EAX
JE D2Client.6FAE118F
PUSH 67 ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
PUSH ESI
CALL <JMP.&D2Common.#10731>
TEST EAX,EAX
JE SHORT WEITER3
XOR EAX,EAX
JMP D2Client.6FAE118F
WEITER3:
INC EAX
JMP D2Client.6FAE118F
[color=red]CHECK4:[/color]
CALL <JMP.&D2Common.#10756>
TEST EAX,EAX
JE D2Client.6FAE2F44
PUSH 67 ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
PUSH DWORD PTR DS:[6FBB58F0]
CALL <JMP.&D2Common.#10731>
TEST EAX,EAX
JE SHORT WEITER4:
XOR EAX,EAX
JMP D2Client.6FAE2F44
WEITER4:
INC EAX
JMP D2Client.6FAE2F44
[color=red]CHECK5:[/color]
CALL <JMP.&D2Common.#10756>
TEST EAX,EAX
JE D2Client.6FB2B570
PUSH 67 ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
PUSH ESI
CALL <JMP.&D2Common.#10731>
TEST EAX,EAX
JE SHORT WEITER5
XOR EAX,EAX
JMP D2Client.6FB2B570
WEITER5:
INC EAX
JMP D2Client.6FB2B570
Und nun zur D2Game.dll:
Code:
6FC44C65 JMP CHECK6
6FC451DB JMP CHECK7
6FC44D5F JMP CHECK8
6FC4602A JMP CHECK9
6FC42FC2 JMP CHECK10
6FC46325 JMP CHECK11
Code:
[color=red]CHECK6:[/color]
CALL <JMP.&D2Common.#10756>
TEST EAX,EAX
JE D2Game.6FC44C6A
PUSH 67 ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
PUSH ESI
CALL <JMP.&D2Common.#10731>
TEST EAX,EAX
JE SHORT WEITER6
XOR EAX,EAX
JMP D2Game.6FC44C6A
WEITER6:
INC EAX
JMP D2Game.6FC44C6A
[color=red]CHECK7:[/color]
CALL <JMP.&D2Common.#10756>
TEST EAX,EAX
JE D2Game.6FC451E0
PUSH 67 ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
PUSH ESI
CALL <JMP.&D2Common.#10731>
TEST EAX,EAX
JE SHORT WEITER7
XOR EAX,EAX
JMP D2Game.6FC451E0
WEITER7:
INC EAX
JMP D2Game.6FC451E0
[color=red]CHECK8:[/color]
CALL <JMP.&D2Common.#10756>
TEST EAX,EAX
JE D2Game.6FC44D64
PUSH 67 ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
PUSH ESI
CALL <JMP.&D2Common.#10731>
TEST EAX,EAX
JE SHORT WEITER8
XOR EAX,EAX
JMP D2Game.6FC44D64
WEITER8:
INC EAX
JMP D2Game.6FC44D64
[color=red]CHECK9:[/color]
CALL <JMP.&D2Common.#10756>
TEST EAX,EAX
JE D2Game.6FC4602F
PUSH 67 ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
PUSH ESI
CALL <JMP.&D2Common.#10731>
TEST EAX,EAX
JE SHORT WEITER9
XOR EAX,EAX
JMP D2Game.6FC4602F
WEITER9:
INC EAX
JMP D2Game.6FC4602F
[color=red]CHECK10:[/color]
CALL <JMP.&D2Common.#10756>
TEST EAX,EAX
JE D2Game.6FC42FC7
PUSH 67 ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
PUSH ESI
CALL <JMP.&D2Common.#10731>
TEST EAX,EAX
JE SHORT WEITER10
XOR EAX,EAX
JMP D2Game.6FC42FC7
WEITER10:
INC EAX
JMP D2Game.6FC42FC7
[color=red]CHECK11:[/color]
CALL <JMP.&D2Common.#10756>
TEST EAX,EAX
JE D2Game.6FC4632A
PUSH 67 ;Zeile-3 aus ItemTypes.txt, bei mir Zeile 106
PUSH ESI
CALL <JMP.&D2Common.#10731>
TEST EAX,EAX
JE SHORT WEITER11
XOR EAX,EAX
JMP D2Game.6FC4632A
WEITER11:
INC EAX
JMP D2Game.6FC4632A
So, nun sollten eure MercOnlyItems funktionieren. Viel Spaß damit.
Zuletzt bearbeitet: